jQuery click not working for dynamically created items
我有一段jquery,它在给定的DIV(
但是,如果我使用一段代码,比如:
1 2 3 | $(someLink).click(function(){ $("#container").html( <new html with new spans> ) }); |
jquery代码不会触发。但奇怪的是
我的问题是:对于动态创建的项目,是否存在我的单击事件不起作用的原因?我想我必须在我的文档就绪或心跳脚本(每100毫秒触发一次)中添加一些东西来连接事件??
这样做:
1 | $( '#wrapper' ).on( 'click', 'a', function () { ... }); |
其中
所以,您有一个包装器,它是硬编码到HTML源代码中的:
1 |
你用动态内容填充它。其思想是将事件委托给该包装器,而不是直接在动态元素上绑定处理程序。
顺便说一句,我推荐主干.js-它为这个过程提供了结构:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | 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 |
来源:本文
如果您动态地创建了元素(使用javascript),那么这个代码就不起作用。因为,.click()会将事件附加到已经存在的元素上。当您使用javascript动态创建元素时,它不起作用。
为此,您必须使用其他一些在动态创建的元素上工作的函数。这可以通过不同的方式实现。
之前我们有.live()函数
1 2 3 4 | $('selector').live('click', function() { //your code }); |
但是.live()已被弃用。它可以被其他函数替换。
委托():
使用delegate()函数,您可以单击动态生成的HTML元素。
例子:
1 2 3 4 | $(document).delegate('selector', 'click', function() { //your code }); |
():
使用on()函数可以单击动态生成的HTML元素。
例子:
1 2 3 4 | $(document).on('click', 'selector', function() { // your code }); |
尝试一下
1 | $("#container").on('click', 'someLinkSelector', function(){ $("#container").html( <new html with new spans> ) }); |
您基本上需要从DOM的非动态部分附加事件,以便它可以监视动态创建的元素。
1 2 3 | $("#container").delegate("span","click", function (){ alert(11); }); |
使用
您需要使用一个监视动态创建事件的函数-在旧版本的jquery中,这是
必须将Click事件添加到现有元素中。不能将事件添加到动态创建的DOM元素中。如果要向它们添加事件,则应使用".on"将事件绑定到现有元素。
1 | $('p').on('click','selector_you_dynamic_created',function(){...}); |
.学员也应该工作。
几天前我遇到了这个问题——我的解决方案是使用.bind()将所需函数绑定到动态创建的链接。
1 2 3 4 5 6 7 8 | var catLink = $('' + category.category + ''); catLink.bind("click", function(){ $.categories.getSubCategories(this); }); getSubCategories : function(obj) { //do something } |
我希望这有帮助。
使用1.7.1中的新jquery on函数-
http://api.jquery.com/on/