You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

动态生成HTML行的jQuery删除事件异常问题求助

问题分析与解决方案

我来帮你梳理下问题出在哪,以及怎么修复:

核心问题

你的代码里有两个关键问题导致了删除行为异常:

  1. 事件重复绑定 + 变量作用域问题:你在AJAX的success回调里给.remove_line绑定点击事件,每次添加新行时,都会给所有已存在的删除按钮重复绑定事件。而且value变量是在selectItem的点击回调里定义的,后续的AJAX请求会覆盖这个变量的值,导致所有删除按钮最后都会使用最后一次添加行的value,所以点击第一个删除按钮时,会删除所有带有这个value类名的行。
  2. 删除逻辑依赖外部变量:你用$("." + value).remove()来删除行,这种方式依赖外部的value变量,很容易因为作用域问题出错,而且如果value包含特殊字符(比如.、空格),还会导致选择器失效。

修复方案

我们可以通过事件委托来处理动态生成元素的事件,同时修改删除逻辑,让它直接基于点击的元素找到对应行,不依赖外部变量。

修改后的完整代码

// 先给父元素绑定事件委托,处理所有动态生成的删除按钮
$(".row-info").on('click', '.remove_line', function() {
    // 找到当前点击按钮所在的行容器,直接删除
    $(this).closest('.items_container').remove();
});

$(".selectItem").on('click', function() {
    if ($(this).is(':checked')) {
        let value = $(this).val();
        $.ajax({
            url: document.location.origin + '/admin/articulos/selected',
            type: 'GET',
            data: { 'itemId': value },
            success: function(response) {
                $(".row-info").append(`
                    <div class="items_container ${value}">
                        <div class="col-md-2 item_ref">${value}</div>
                        <div class="col-md-6 item_description">${response[0].nombre}</div>
                        <div class="col-md-3"><input type="number" class="form-control add_more_items" value="1" style="width: 100%; text-align:center" /></div>
                        <div class="col-md-1"><i class="fas fa-trash-alt fa-2x text-danger remove_line" style="cursor:pointer;"></i></div>
                    </div>
                `);
                // 移除原来在这里的.remove_line事件绑定代码
            }
        });
    }
});

为什么这样改?

  1. 事件委托的优势:把事件绑定在静态存在的父元素.row-info上,监听.remove_line的点击事件。这样不管后续动态添加多少行,删除按钮的点击事件都会被正确触发,不需要每次添加元素都重新绑定,也避免了重复绑定的问题。
  2. 基于DOM关系删除行:用$(this).closest('.items_container')可以精准找到当前点击的删除按钮所在的行容器,直接删除这个容器,完全不依赖外部的value变量,从根源上避免了作用域导致的错误,同时逻辑更清晰可靠。

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

火山引擎 最新活动