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

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'); 
});

其他优化建议

  1. 你目前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'];
    // 此处补充你原本的发送短信逻辑
}
  1. 按上述方案修改后,PHP里不需要再判断$data[0] == "on"的逻辑,因为前端已经过滤掉了全选框的值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 05:06:06