动态添加新元素后,jQuery 选择器不会更新

IT技术 javascript jquery tabs
2021-02-12 12:20:06

我的选择器是:

$('section#attendance input:last')

但是,我将另一个输入附加到 section#attendance。我希望选择器现在选择该元素(因为:last.

这是我的完整代码:

$('section#attendance input:last').keydown(function(e) {
        if (e.which == 9)
        {
            var $this = $(this);
            var num = parseInt($this.attr('name').match(/\d+(,\d+)?/)[0]) + 1;
            $this.parent().append('<input type="text" name="attendance[' + num +']" value="Name and Position" class="medium" />');
        }
    });

新代码:

    $("section#attendance").on("keydown", "input:last", function(e) {
    if (e.which == 9) {
        var $this = $(this);
        var num = parseInt($this.attr('name').match(/\d+(,\d+)?/)[0]) + 1;
        $this.after('<input type="text" name="attendance[' + num +']" value="Name and Position" class="medium" />');
    }
});

编辑:问题似乎出在“输入:最后一个”上,因为如果我只使用输入,它就可以工作。此外,如果我将类 'last' 添加到最后一个元素,当我使用 'input.last' 作为选择器时,它会起作用。

4个回答

根据您使用的 jQuery 版本,您应该使用.delegate()(jQuery 1.7 之前的)或.on()(jQuery 1.7+)来委托事件处理来处理动态添加的元素的事件。Note.live()已从所有版本的 jQuery 中弃用,因此不应再使用它。

使用.on(),你可以使用这个:

$("#attendance").on("keydown", "input:last", function(e) {
    if (e.which == 9) {
        var $this = $(this);
        var num = parseInt($this.attr('name').match(/\d+(,\d+)?/)[0]) + 1;
        $this.parent().append('<input type="text" name="attendance[' + num +']" value="Name and Position" class="medium" />');
    }
});

使用.delegate()将是相似的(除了参数的顺序不同)。您可以在 jQuery 文档.delegate().on().

委托事件处理使用某些 javascript 事件的“冒泡”功能进行工作。这允许您将事件处理程序附加到父对象(不会来来去去)并让它查看从子对象“冒泡”到它的每个事件,检查事件是否来自具有适当的选择器,如果是,则执行您的事件处理代码。这样,随着对象的来来去去,它们的事件仍然得到适当的处理。

正如您最初所做的那样,您将事件处理程序直接绑定到'section#attendance input:last'在事件绑定代码运行时与选择器匹配的对象从那时起,它直接绑定到该特定对象,无论该对象是否仍然与选择器匹配,或者是否将新对象添加到与选择器匹配的 DOM。使用.delegate().on()允许事件处理行为更加动态的委托事件处理- 自动调整以适应 DOM 中的变化。您只需要将事件绑定到一个不会改变的公共父对象,它就可以自动监视它的所有子对象。

问题是您添加的输入标签没有您的代码期望的正确类型的名称属性。您没有透露您的 HTML,但在我看来,您的代码无法正常工作,因为它解析 name 属性中的数字的方式。您的正则表达式匹配两个数字,中间有一个逗号,但您添加的新输入标签没有这种格式。你可以在这里看到一个更简单的版本:jsfiddle.net/jfriend00/uVHwK我们必须查看您的 HTML 才能提供更具体的建议。
2021-03-21 12:20:06
嘿,我试过了,但由于某种原因,它似乎不起作用。我已经用新代码更新了我的帖子,并查看了 .on() 的文档,但我不知道出了什么问题。为帮助干杯!
2021-04-06 12:20:06

要对动态插入的内容做出react,您必须使用委托事件。当前推荐的执行此操作的函数是.on()(live已弃用,binddelegate已被取代)。

你说的对。live已弃用,binddelegate已被取代。
2021-03-25 12:20:06
bind并且delegate不被弃用。
2021-04-04 12:20:06

不要用直播!使用

由于性能不佳,不推荐使用 live 方法,现在改用on方法。

$('section#attendance').on('keydown', 'input:last', function(e) {
    /* ... code ... */
});

也没有理由section在您的 id 选择器前面放置标签。

问题很可能是因为您正在使用 keydown 事件。这实际上对选择器使用了绑定。仅绑定第一次附加时存在的效果项目。JQuery 文档说:

bind() 将事件附加到调用时存在或匹配选择器的元素。之后创建的任何元素或由于类更改而继续匹配的元素都不会触发绑定事件。

您应该将 keydown 替换为以下内容:

$('section#attendance).on("keydown", "input:last", function(e) {...});