我在这里和其他地方的了解之间的差异在网络上一些帖子live()
和delegate()
.但是我没有找到我正在寻找的答案(如果这是一个骗局请告诉我).
我知道live
和之间的区别delegate
是live
不能在链中使用.我也读过某些地方,delegate
在某些情况下更快(更好的性能).
我的问题是,是否存在应该使用live
而不是delegate
?
UPDATE
我已经设置了一个简单的测试来查看性能的差异.
我还添加了.on()
jQuery 1.7+中提供的新功能
结果几乎总结了答案中所述的性能问题.
.live()
除非您的jQuery版本不支持,否则请勿使用.delegate()
. .delegate()
除非您的jQuery版本不支持,否则请勿使用.on()
..live()
和之间的差异.delegate()
大于delegate()
和之间的差异.on()
.
lon*_*day 147
我从不使用live
; 我认为使用的好处delegate
是如此巨大,以至于压倒性的.
一个好处live
是它的语法非常接近于bind
:
$('a.myClass').live('click', function() { ... });
Run Code Online (Sandbox Code Playgroud)
delegate
但是,使用稍微冗长的语法:
$('#containerElement').delegate('a.myClass', 'click', function() { ... });
Run Code Online (Sandbox Code Playgroud)
然而,在我看来,这对于实际发生的事情要更加明确.您没有从live
示例中发现实际上正在捕获事件document
; 有delegate
,很显然,事件捕捉发生在#containerElement
.你可以做同样的事情live
,但语法变得越来越可怕.
为要捕获的事件指定上下文也可以提高性能.通过该live
示例,必须将整个文档的每次单击与选择器进行比较,a.myClass
以查看它是否匹配.有delegate
,那只是其中的元素#containerElement
.这显然会提高性能.
最后,live
要求您的浏览器查找a.myClass
当前是否存在. delegate
仅在触发事件时查找元素,从而提供进一步的性能优势.
NB 在幕后delegate
使用live
,因此您可以使用您可以执行的任何live
操作delegate
.我的回答是关于它们,因为它们是常用的.
另请注意,在现代jQuery中执行事件委派的最佳方式既不是live
也不delegate
是.新的语法(从jQuery 1.7开始)与该on
函数一起使用.语法如下:
$('#containerElement').on('click', 'a.myClass', function() { ... });
Run Code Online (Sandbox Code Playgroud)
use*_*716 24
它们完全相同,除了:
.delegate()
允许您缩小页面的本地部分,同时.live()
必须处理整个页面中的事件..live()
从浪费的DOM选择开始当你打电话时.delegate()
,它只是转身并调用.live()
,但传递额外的上下文参数.
https://github.com/jquery/jquery/blob/master/src/event.js#L948-950
因此,我总是使用.delegate()
.如果您确实需要它来处理页面上的所有事件,那么只需将其body
作为上下文.
$(document.body).delegate('.someClass', 'click', function() {
// run handler
});
Run Code Online (Sandbox Code Playgroud)
旧版本的jQuery实际上具有delegate
功能.您只需要在调用时将选择器或元素作为上下文属性传递.live()
.当然,它需要加载到页面上.
$('.someClass', '#someContainer').live('click',function() {
// run handler
});
Run Code Online (Sandbox Code Playgroud)
而你的行为与...相同.delegate()
.
归档时间: |
|
查看次数: |
39092 次 |
最近记录: |