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

jQuery委托问题:单次点击触发多次删除计数更新

问题分析与解决方案

问题根源

每次点击添加按钮时,你都重复执行了$(".remove_pse_record").click(...),这会给页面上所有已存在的删除按钮再次绑定一次点击事件。比如第一次添加后,原有按钮会有2个点击事件;第二次添加后变成3个,点击时就会触发多次update_record_count,导致计数递减多次。

修复方案

推荐两种简洁的修复方式:

方式1:使用事件委托(最优解)

直接给父元素绑定一次事件,无需每次添加新元素都重新绑定。替换初始的删除按钮事件,同时删掉添加函数里重复绑定的代码。

修改后的完整代码:

// 仅执行一次,用事件委托处理所有删除按钮的点击
$("#configuration").on("click", ".remove_pse_record", function(e) {
    $("#" + $(this).data("id")).fadeTo("slow", 0.00, function(){
       $(this).slideUp("slow", function() {
           $(this).remove();
           // 元素彻底移除后再更新计数,确保同步
           update_record_count(".pse_record_count");
       });
    });

    e.preventDefault();
});

$("#add_pse_exception").click(function(e) {
    const last_id = $("#configuration > div").last().data("id");
    const next_id = last_id + 1;

    const new_record = `<div id="a_${next_id}" data-id="${next_id}" class="record">
<div class="full_col">
    <div><div>Notes:</div><div><textarea name="a_notes_${next_id}"></textarea></div></div>
</div>
<div class="full_col separator">
    <ul>
        <li><a href="#" title="Remove new record" class="remove_pse_record" data-id="a_${next_id}"><i class="fa-solid fa-trash remove_icon"></i></a></li>
    </ul>
</div>
</div>`;

    $(new_record).insertAfter($("#configuration > div").last());
    update_record_count(".pse_record_count", true);

    e.preventDefault();
});

function update_record_count(element, increase=false) {
    const count = parseInt($(element + ":first").text());
    
    $(element).each(function() {
        $(this).text(increase ? count + 1 : count - 1);
    });
}

方式2:仅给新添加的元素绑定事件

如果不想用事件委托,可在添加新元素时,只给当前生成的删除按钮绑定事件,而非选中所有.remove_pse_record。

修改添加函数中的绑定逻辑:

// 替换原有的$(".remove_pse_record").click(...)
const $newRecord = $(new_record);
$newRecord.find(".remove_pse_record").click(function(e) {
    $("#" + $(this).data("id")).fadeTo("slow", 0.00, function(){
       $(this).slideUp("slow", function() {
           $(this).remove();
           update_record_count(".pse_record_count");
       });
    });

    e.preventDefault();
});

$newRecord.insertAfter($("#configuration > div").last());

额外优化点

  • 用let/const声明变量,避免全局变量污染;
  • 把计数更新放在元素彻底移除的回调中,确保DOM操作和计数更新同步;
  • 用模板字符串拼接HTML,代码可读性更强。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 07:35:16