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

JQuery表单submit事件多次触发:需阻止提交且仅执行一次

解决jQuery submit事件多次触发的问题

问题原因

你每次调用loadJobSights函数时,都会给document绑定一次针对#edditSight的submit事件监听。多次调用该函数后,页面上会存在多个相同的事件监听,表单提交时这些监听会依次执行,导致控制台多次输出日志。

解决方案

方案1:使用one()替代on()绑定事件

one()方法会在事件触发一次后自动解绑,确保每个委托的submit事件只执行一次。修改事件绑定代码如下:

var run = 0
function loadJobSights(loadedJobSight){

    var jobSight = loadedJobSight.split(",");
    L.marker([parseFloat(jobSight[0]),parseFloat(jobSight[1])])
    .bindPopup('<B>NOT WORKING DO NOT SUBMIT</B><form id="edditSight" action="saveData.php" method="POST"><input type="submit"></form>')
    .addTo(map);
    // 用one()替代on(),触发一次后自动解绑
    $(document).one("submit",'#edditSight', function() {
        try{
            run++
            console.log('working', run);
            return false;
        }catch(error){
            console.error(error);
            return false;
        }
                  
    });
}

方案2:绑定前先解绑原有事件

如果需要保留on()的灵活性,可以在绑定新事件前,先移除之前针对该选择器的submit事件监听,避免重复绑定:

var run = 0
function loadJobSights(loadedJobSight){

    var jobSight = loadedJobSight.split(",");
    L.marker([parseFloat(jobSight[0]),parseFloat(jobSight[1])])
    .bindPopup('<B>NOT WORKING DO NOT SUBMIT</B><form id="edditSight" action="saveData.php" method="POST"><input type="submit"></form>')
    .addTo(map);
    // 先解绑所有针对#edditSight的submit事件,再绑定新的
    $(document).off("submit", '#edditSight').on("submit",'#edditSight', function() {
        try{
            run++
            console.log('working', run);
            return false;
        }catch(error){
            console.error(error);
            return false;
        }
                  
    });
}

方案3:给表单添加执行标记,阻止重复触发

在事件处理函数中,先检查表单是否已经被处理过,若已处理则直接返回,避免重复执行:

var run = 0
function loadJobSights(loadedJobSight){

    var jobSight = loadedJobSight.split(",");
    L.marker([parseFloat(jobSight[0]),parseFloat(jobSight[1])])
    .bindPopup('<B>NOT WORKING DO NOT SUBMIT</B><form id="edditSight" action="saveData.php" method="POST"><input type="submit"></form>')
    .addTo(map);
    $(document).on("submit",'#edditSight', function(e) {
        // 检查是否已经处理过,若已处理则阻止后续执行
        if ($(this).data('submitted')) {
            e.preventDefault();
            return false;
        }
        try{
            run++
            console.log('working', run);
            // 标记为已处理
            $(this).data('submitted', true);
            return false;
        }catch(error){
            console.error(error);
            return false;
        }
                  
    });
}

注意:如果页面上存在多个#edditSight表单(比如多个标记点弹出的表单),建议将表单的id改为动态唯一值(比如用索引或坐标拼接),避免id重复导致的事件绑定冲突。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 10:02:15