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
相关产品推荐
相关产品推荐

