You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP+JSON模态弹窗删除功能异常,如何通过JS按钮调用删除接口?

实现带模态确认的异步删除功能(更新is_active字段)

我来帮你一步步改造现有代码,实现带确认弹窗的删除功能,同时保留友好的操作提示,不用再直接跳转页面。

步骤1:添加Bootstrap模态弹窗的HTML结构

首先在你的页面(比如index.php)里添加模态框的HTML,放在页面底部即可:

<!-- 删除确认模态框 -->
<div class="modal fade" id="deleteModal" tabindex="-1" aria-labelledby="deleteModalLabel" aria-hidden="true">
  <div class="modal-dialog">
    <div class="modal-content">
      <div class="modal-header">
        <h5 class="modal-title" id="deleteModalLabel">确认删除</h5>
        <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
      </div>
      <div class="modal-body">
        你确定要标记这条记录为已删除吗?
      </div>
      <div class="modal-footer">
        <button type="button" class="btn btn-secondary" data-bs-dismiss="modal">取消</button>
        <button type="button" class="btn btn-danger" id="confirmDeleteBtn">确认删除</button>
      </div>
    </div>
  </div>
</div>

<!-- 提示消息容器 -->
<div id="alertContainer" class="mt-3"></div>

步骤2:修改JavaScript生成表格的代码

把原来的Delete链接改成按钮,点击时打开模态框,并且把要删除的用户ID存储起来,方便后续AJAX调用:

var xhttp = new XMLHttpRequest();
var url = "form.json";

xhttp.onreadystatechange = function() {
  if (this.readyState == 4 && this.status == 200) {
    var response = JSON.parse(xhttp.responseText);
    var output = '';
    output += "<table class='table table-bordered'>";
    output += "<tr><th scope='col'>id</th><th>First Name</th><th>Last Name</th><th>Age</th><th>Action</th></tr>";
    
    for(let x in response){ // 用let避免循环变量作用域问题
      if(response[x].is_active == "1"){
        output += `<tr>
          <td>${response[x].id}</td>
          <td>${response[x].firstname}</td>
          <td>${response[x].lastname}</td>
          <td>${response[x].age}</td>
          <td>
            <a href='edit.php?id=${response[x].id}&firstname=${response[x].firstname}&lastname=${response[x].lastname}&age=${response[x].age}' class='btn btn-primary btn-sm active' role='button' aria-pressed='true'>Edit</a>
            <!-- 改成触发模态框的按钮 -->
            <button class='btn btn-danger btn-sm delete-btn' style='margin-left: 10px;' data-user-id='${response[x].id}'>Delete</button>
          </td>
        </tr>`;
      }
    }
    
    output += "</table> ";
    document.getElementById("output").innerHTML = output;

    // 给所有删除按钮绑定点击事件
    bindDeleteButtons();
  }
};

xhttp.open("GET", url, true);
xhttp.send();

// 绑定删除按钮的点击事件
function bindDeleteButtons() {
  const deleteBtns = document.querySelectorAll('.delete-btn');
  let currentUserId = null;

  deleteBtns.forEach(btn => {
    btn.addEventListener('click', function() {
      currentUserId = this.getAttribute('data-user-id');
      // 打开模态框
      const deleteModal = new bootstrap.Modal(document.getElementById('deleteModal'));
      deleteModal.show();
    });
  });

  // 模态框确认按钮的点击事件
  document.getElementById('confirmDeleteBtn').addEventListener('click', function() {
    if(currentUserId) {
      // 调用AJAX执行删除
      deleteUser(currentUserId);
      // 关闭模态框
      bootstrap.Modal.getInstance(document.getElementById('deleteModal')).hide();
    }
  });
}

// AJAX删除函数
function deleteUser(userId) {
  const xhr = new XMLHttpRequest();
  xhr.open('GET', `update.php?id=${userId}`, true);
  
  xhr.onload = function() {
    if(this.status === 200) {
      try {
        const result = JSON.parse(this.responseText);
        showAlert(result.message, result.success ? 'success' : 'danger');
        // 删除成功后重新加载表格数据
        loadTableData();
      } catch(e) {
        showAlert('删除请求处理失败', 'danger');
      }
    } else {
      showAlert('服务器请求出错', 'danger');
    }
  };

  xhr.onerror = function() {
    showAlert('网络连接错误', 'danger');
  };

  xhr.send();
}

// 加载表格数据的复用函数
function loadTableData() {
  const xhttp = new XMLHttpRequest();
  xhttp.onreadystatechange = function() {
    if (this.readyState == 4 && this.status == 200) {
      var response = JSON.parse(xhttp.responseText);
      var output = '';
      output += "<table class='table table-bordered'>";
      output += "<tr><th scope='col'>id</th><th>First Name</th><th>Last Name</th><th>Age</th><th>Action</th></tr>";
      
      for(let x in response){
        if(response[x].is_active == "1"){
          output += `<tr>
            <td>${response[x].id}</td>
            <td>${response[x].firstname}</td>
            <td>${response[x].lastname}</td>
            <td>${response[x].age}</td>
            <td>
              <a href='edit.php?id=${response[x].id}&firstname=${response[x].firstname}&lastname=${response[x].lastname}&age=${response[x].age}' class='btn btn-primary btn-sm active' role='button' aria-pressed='true'>Edit</a>
              <button class='btn btn-danger btn-sm delete-btn' style='margin-left: 10px;' data-user-id='${response[x].id}'>Delete</button>
            </td>
          </tr>`;
        }
      }
      
      output += "</table> ";
      document.getElementById("output").innerHTML = output;
      bindDeleteButtons();
    }
  };
  xhttp.open("GET", "form.json", true);
  xhttp.send();
}

// 显示提示消息的函数
function showAlert(message, type) {
  const alertContainer = document.getElementById('alertContainer');
  alertContainer.innerHTML = `<div class='alert alert-${type} alert-dismissible fade show' role='alert'>
    ${message}
    <button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button>
  </div>`;
  
  // 3秒后自动关闭提示
  setTimeout(() => {
    bootstrap.Alert.getOrCreateInstance(alertContainer.querySelector('.alert')).close();
  }, 3000);
}

步骤3:修改PHP接口(update.php)

原来的PHP是跳转页面,现在改成返回JSON响应,方便AJAX处理:

<?php
session_start();
$response = ['success' => false, 'message' => '删除失败'];

$myFile = "form.json";
try{
  if(!isset($_GET['id'])){
    $response['message'] = '缺少用户ID参数';
    echo json_encode($response);
    exit;
  }

  $userId = $_GET['id'];
  //get data from existing json file
  $jsondata = file_get_contents($myFile);
  //converts json data into array
  $arr_data = json_decode($jsondata, true);

  $updateKey = null;
  foreach($arr_data as $key=>$value){
    if($value['id'] == $userId){
      $updateKey = $key;
      break;
    }
  }

  if($updateKey !== null){
    // 更新is_active为0,保留其他原有字段
    $arr_data[$updateKey]['is_active'] = '0';
    //convert update array to json
    $jsondata = json_encode($arr_data);
    //write json data into form.json file
    if(file_put_contents($myFile, $jsondata)){
      $response['success'] = true;
      $response['message'] = '用户已成功标记为删除';
    } else {
      $response['message'] = '写入文件失败';
    }
  } else {
    $response['message'] = '未找到该用户';
  }

} catch(Exception $e){
  $response['message'] = '捕获到异常: ' . $e->getMessage();
}

echo json_encode($response);
?>

关键改进点说明

  • 模态确认:用户点击Delete按钮后先弹出确认框,避免误操作
  • 异步处理:用AJAX调用PHP,不用跳转页面,体验更流畅
  • 友好提示:操作后显示成功/失败的提示,3秒后自动关闭
  • 数据刷新:删除成功后自动重新加载表格,不用手动刷新页面
  • 代码复用:把加载表格的逻辑抽成loadTableData函数,避免重复代码

内容的提问来源于stack exchange,提问作者MJ DEV

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:44:59