jQuery 单击不适用于动态创建的项目

IT技术 javascript jquery html
2021-02-01 08:21:58

我有一段 jQuery,它循环遍历给定 div( #container)中的每个元素,并在每次单击跨度时发出 javascript 警报。如果<span>'s 是静态的,这可以正常工作

但是,如果我使用一段代码,如:

$(someLink).click(function(){
   $("#container").html( <new html with new spans> )
});

jQuery 代码不会触发。奇怪的是虽然

我的问题是:是否有原因我的 Click 事件对动态创建的项目不起作用?我假设我必须在我的文档中添加一些准备好的东西或心跳脚本(每 100 毫秒触发一次)以连接事件?

6个回答

做这个:

 $( '#wrapper' ).on( 'click', 'a', function () { ... });

where#wrapper是一个静态元素,您可以在其中添加动态链接。

因此,您有一个硬编码到 HTML 源代码中的包装器:

<div id="wrapper"></div>

然后用动态内容填充它。这个想法是将事件委托给该包装器,而不是直接在动态元素上绑定处理程序。


顺便说一句,我推荐Backbone.js - 它为这个过程提供了结构:

var YourThing = Backbone.View.extend({

    // the static wrapper (the root for event delegation)
    el: $( '#wrapper' ),

    // event bindings are defined here 
    events: {
        'click a': 'anchorClicked'
    },

    // your DOM event handlers
    anchorClicked: function () {
        // handle click event 
    }

});

new YourThing; // initializing your thing
@ yes123 是的,这就是原因。.on统一.bind, .live, 和.delegate统一使代码更简单、更简洁。
2021-03-14 08:21:58
再一次,一个我不知道的功能!谢谢。我还将为我的下一个项目研究backbone.js!
2021-03-23 08:21:58
为什么是 .on 而不是 .live 或 .delegate?
2021-03-24 08:21:58
是的,我的意思是,为什么他们不推荐使用 .live。为什么 .on 更好?也许是因为 .on 统一了 .live 和 .delegate
2021-03-25 08:21:58
@ yes123 好吧,因为.live并且.delegate已被.on. .on方法提供绑定事件的所有功能,不再需要其他方法。
2021-04-08 08:21:58

来源:这篇文章

如果您动态创建元素(使用 javascript),则此代码不起作用。因为, .click() 会将事件附加到已经存在的元素上。当您使用 javascript 动态创建元素时,它不起作用。

为此,您必须使用其他一些适用于动态创建的元素的函数。这可以通过不同的方式完成..

早些时候我们有 . ()函数

$('selector').live('click', function()
{
//your code
});

但 .live() 已弃用。这可以用其他函数代替。

委托():

使用delegate () 函数可以点击动态生成的HTML 元素。

例子:

$(document).delegate('selector', 'click', function()
{
 //your code
});

编辑:delegate() 方法在 3.0 版中已弃用。请改用 on() 方法。

在():

使用on () 函数可以点击动态生成的 HTML 元素。

例子:

$(document).on('click', 'selector', function()
{
// your code
});
我可以知道on()之间有什么区别delegate()吗?
2021-03-24 08:21:58

尝试类似

$("#container").on('click', 'someLinkSelector', function(){ $("#container").html( <new html with new spans> ) });

您基本上需要从 DOM 的非动态部分附加您的事件,以便它可以监视动态创建的元素。

您必须将单击事件添加到现有元素。您不能向动态创建的 dom 元素添加事件。如果您想向它们添加事件,您应该使用“.on”将事件绑定到现有元素。

$('p').on('click','selector_you_dynamic_created',function(){...});

.delegate 也应该工作。

selector_you_dynamic_created究竟是一个类,一个 id 吗?
2021-03-21 08:21:58
这是一个很好的答案,可以解释真正的问题是什么。其他答案给出了解决方案,但这解释了为什么它有效。干得好@rocLv!我的问题是我正在向 dom 元素添加元素,但由于某种原因它们没有与事件绑定。我想知道我是否可以在创建元素时设置点击事件。
2021-04-02 08:21:58
$("#container").delegate("span", "click", function (){
    alert(11);
});
它曾经是正确的方法,不知道现在是否有任何不同(现在有一段时间没有使用 jQuery)。
2021-04-04 08:21:58