我知道 "live" 函数现在已被弃用。如何迁移以下代码以使用新的 "on" 函数?
$('a.action').live( "click", function (evt) {
// Do stuff
}
场景是a.action是动态创建的。我尝试过以下方法,但都没有成功:
$('a.action').on( "click", function (evt) {
// Do stuff
}
我知道 "live" 函数现在已被弃用。如何迁移以下代码以使用新的 "on" 函数?
$('a.action').live( "click", function (evt) {
// Do stuff
}
$('a.action').on( "click", function (evt) {
// Do stuff
}
.live()
类型性能,在添加事件处理程序时,a.action
对象不必存在,那么您应该找到始终存在的所有 a.action
元素的父 DOM 对象,并像这样绑定 .on()
:$(parent selector).on('click', 'a.action', function (evt) {
// Do stuff
});
那个父级元素应尽可能靠近对象,以达到最大效率。因此,将事件绑定到document
是不可取的。事实上,.live()
被弃用的原因之一就是它绑定到document
对象上,当有太多事件流经一个对象时(事件分发性能降低),很容易导致性能问题。
欲了解更多信息,请参见我的其他相关答案:
jQuery .live()与.on()方法在加载动态html后添加点击事件的比较
.live()
可以工作而委托形式的.on()
无法工作,则您可能没有选择正确的共同父元素或代码存在错误。 - jfriend00.on()
参数中的选择器。如果没有看到您添加新元素的代码、确切的 .on()
代码和您的 HTML,我们无法诊断此问题。 - jfriend00$(document).on('click', 'a.action', function (evt) {
// Do stuff
});
$(document)
比使用$('#container')
更快:http://jsperf.com/jquery-on-document-vs-id-selector - kendaleiv#container
必须先定位。然而,真正的问题在于绑定到文档意味着事件需要一直冒泡到顶部元素才能被处理。 - Gabriele Petriolidocument
,那么每次事件发生并冒泡到document
对象时,该事件都必须与绑定到document
的每个选择器进行比较。由于某些选择器比较相当缓慢(取决于选择器的复杂性),因此这可能会变得非常缓慢。尽可能靠近实际对象进行绑定,可以使每次比较的事件处理程序/选择器列表变短,而不是长列表。在更大的页面中速度要快得多。他们没有为了好玩而摆脱.live()
。 - jfriend00$(document)
与更窄的选择器(可能具有不同大小的DOM)之间的差异有多大可能很有趣。 - kendaleiv