jQuery复选框取消选中未正常重置,sendall.php重复发起请求如何解决?
问题根因
你遇到的重复请求问题是表单submit事件重复绑定导致的:
每次点击「发送」按钮打开模态框时,代码都会给#sendall_form新增一个submit事件监听器,之前绑定的监听器不会自动销毁。点击N次发送按钮就会累计N个监听器,下次提交表单时就会同时触发N次AJAX请求,也就会传递多组不同的选中ID。
修复方案
有两种简单的修复方式,选其中一种即可:
方案1:绑定新事件前先解绑旧事件
在绑定submit事件前先调用.off('submit')清除之前绑定的所有同类型事件:
$("#sendall").on('click', function() { var array = []; // 优化:只收集行复选框的值,排除全选框,不用后端再判断第一个值是不是on $("input:checkbox[name='row-check']:checked").each(function() { array.push($(this).val()); }); $('#sendall_Modal').modal('show'); // 先解绑之前的submit事件,再绑定新事件 $('#sendall_form').off('submit').on("submit", function(event){ event.preventDefault(); var dbarray = JSON.stringify(array); $.ajax({ url:"../../bl/office/sendall.php", method:"POST", data:{dbarray:dbarray}, cache:false, success:function(data){ $('#sendall_form')[0].reset(); $('#sendall_Modal').modal('hide'); }, }); }); });
方案2:把submit事件绑定移到发送按钮点击事件外
只需要绑定一次submit事件,选中ID的获取逻辑移到submit触发时再执行,逻辑更合理更省内存,更推荐使用:
// 原有的复选框全选、单选逻辑不变,此处省略 // 表单提交事件全局只绑定一次 $('#sendall_form').on("submit", function(event){ event.preventDefault(); // 提交时再实时获取当前选中的行ID,保证数据是最新的 var array = []; $("input:checkbox[name='row-check']:checked").each(function() { array.push($(this).val()); }); var dbarray = JSON.stringify(array); $.ajax({ url:"../../bl/office/sendall.php", method:"POST", data:{dbarray:dbarray}, cache:false, success:function(data){ $('#sendall_form')[0].reset(); $('#sendall_Modal').modal('hide'); }, }); }); // 发送按钮仅负责打开模态框 $("#sendall").on('click', function() { $('#sendall_Modal').modal('show'); });
其他优化建议
- 你目前PHP代码存在严重的SQL注入风险,不要直接把用户传递的
$d拼接进SQL语句,建议改成参数绑定的预处理语句:
// 预处理写法示例,避免SQL注入 $stmt = mysqli_prepare($conn, "SELECT msisdn, message FROM off_texts where id=?"); foreach($data as $d){ mysqli_stmt_bind_param($stmt, "i", $d); mysqli_stmt_execute($stmt); $result = mysqli_stmt_get_result($stmt); $rows = mysqli_fetch_assoc($result); $phoneno = $rows['msisdn']; $text = $rows['message']; // 此处补充你原本的发送短信逻辑 }
- 按上述方案修改后,PHP里不需要再判断
$data[0] == "on"的逻辑,因为前端已经过滤掉了全选框的值。
内容的提问来源于stack exchange,提问作者iam42
相关产品推荐
相关产品推荐

