jQuery单击不工作的dynamic创build的项目
我有一个jQuery的循环通过给定的每个元素( #container
),并做一个JavaScript警报每次单击跨度。 如果<span>
是静态的,这工作正常。
但是,如果我使用一段代码:
$(someLink).click(function(){ $("#container").html( <new html with new spans> ) });
jQuery代码不会触发。 奇怪的是,虽然
我的问题是:是否有一个原因,我的Click事件不适用于dynamic创build的项目? 我假设我将不得不添加一些东西到我的文档准备好或心跳脚本(这是每100毫秒发射)挂钩事件?
做这个:
$( '#wrapper' ).on( 'click', 'a', function () { ... });
其中#wrapper
是一个静态元素,您可以在其中添加dynamic链接。
所以,你有一个硬编码到HTML源代码的包装:
<div id="wrapper"></div>
并用dynamic内容填充它。 我们的想法是将事件委托给包装器,而不是直接在dynamic元素上绑定处理器。
顺便说一句,我build议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
来源: 这篇文章
如果你dynamic创build你的元素(使用JavaScript),那么这个代码不起作用。 因为.click()会将事件附加到已存在的元素上。 当你使用javascriptdynamic地创build元素时,它不起作用。
为此,你必须使用一些其他的function,在dynamic创build的元素上工作。 这可以用不同的方式完成。
早些时候我们有。 live ()函数
$('selector').live('click', function() { //your code });
但.live()已被弃用。这可以由其他函数替代。
代表 ():
使用delegate ()函数,您可以单击dynamic生成的HTML元素。
例:
$(document).delegate('selector', 'click', function() { //your code });
上():
使用on ()函数,您可以点击dynamic生成的HTML元素。
例:
$(document).on('click', 'selector', function() { // your code });
尝试类似
$("#container").on('click', 'someLinkSelector', function(){ $("#container").html( <new html with new spans> ) });
您基本上需要从DOM的非dynamic部分附加事件,以便可以观察dynamic创build的元素。
$("#container").delegate("span", "click", function (){ alert(11); });
使用.click
将只将事件附加到已存在的元素。
你需要使用一个监视dynamic创build事件的函数 – 在老版本的JQuery中这是.live()
,但是这已经被.on()
在1.7.1中使用新的jQuery on函数 –
前几天我遇到了这个问题 – 我的解决scheme是使用.bind()将所需的function绑定到dynamic创build的链接。
var catLink = $('<a href="#" id="' + i + '" class="lnkCat">' + category.category + '</a>'); catLink.bind("click", function(){ $.categories.getSubCategories(this); }); getSubCategories : function(obj) { //do something }
我希望这有帮助。
您必须将click事件添加到存在的元素。 您不能将事件添加到dynamic创build的dom元素。 我想添加事件给他们,你应该使用“.on”将事件绑定到一个已存在的元素。
$('p').on('click','selector_you_dynamic_created',function(){...});
.delegate也应该工作。