我发现两篇很棒的文章谈论了新功能.on()
:jquery4u.com,elijahmanor.com。
.bind()
还有什么方法可以比.on()
更好地使用?
例如,我有一个示例代码如下:
$("#container").click( function( e ) {} )
你可以注意到我只有选择器检索了一个项目,在我的情况下,当我的页面被加载时,<div>
名为#container
已经存在;没有动态添加。值得一提的是,我使用的是最新版本的jQuery:1.7.2。
对于该示例,即使我不使用.on()
函数提供的其他功能,也应使用.bind()
而不是.on()
?
答案 0 :(得分:300)
在内部,.bind
直接映射到当前版本的jQuery中的.on
。 (同样适用于.live
。)因此,如果您使用.bind
,则会产生微小但实际上无关紧要的性能影响。
但是,.bind
可能会在以后的版本中被删除。没有理由继续使用.bind
并且每个理由都更喜欢.on
。
答案 1 :(得分:53)
这些片段的表现完全相同:
element.on('click', function () { ... });
element.bind('click', function () { ... });
element.click(function () { ... });
然而,它们与这些完全不同,它们都执行相同的操作:
element.on('click', 'selector', function () { ... });
element.delegate('click', 'selector', function () { ... });
$('selector').live('click', function () { ... });
第二组事件处理程序使用event delegation,适用于动态添加的元素。使用委托的事件处理程序也更高效。第一组不适用于动态添加的元素,而且性能要差得多。
jQuery的on()
函数没有引入任何尚未存在的新功能,它只是尝试在jQuery中标准化事件处理(您不再需要在实时,绑定或委托之间做出决定)。 / p>
答案 2 :(得分:10)
直接方法和.delegate
是.on
的优质API,并且无意弃用它们。
直接方法更受欢迎,因为您的代码的字符串类型较少。错误输入时,您将立即收到错误消息
事件名称而不是无声的bug。在我看来,写click
比on("click"
由于参数的顺序,.delegate
优于.on
:
$(elem).delegate( ".selector", {
click: function() {
},
mousemove: function() {
},
mouseup: function() {
},
mousedown: function() {
}
});
你知道它被委派了,因为它说代表。您还可以立即看到选择器。
使用.on
并不是立即清楚它是否被委派,你必须看看选择的结尾:
$(elem).on({
click: function() {
},
mousemove: function() {
},
mouseup: function() {
},
mousedown: function() {
}
}, "selector" );
现在,.bind
的命名非常糟糕,面值比.on
差。但是.delegate
不能在那里进行非委托事件
是没有直接方法的事件,因此在极少数情况下可以使用它,但这只是因为您希望在委托事件和非委派事件之间进行清晰分离。
答案 3 :(得分:8)
如果您查看$.fn.bind
的源代码,您会发现它只是on
的重写函数:
function (types, data, fn) {
return this.on(types, null, data, fn);
}
答案 4 :(得分:6)
来自jQuery文档:
从jQuery 1.7开始,.on()方法是将事件处理程序附加到文档的首选方法。对于早期版本,.bind()方法用于将事件处理程序直接附加到元素。处理程序附加到jQuery对象中当前选定的元素,因此这些元素必须存在于调用.bind()的位置。有关更灵活的事件绑定,请参阅.on()或.delegate()中对事件委派的讨论。
答案 5 :(得分:3)
从Jquery 3.0及更高版本开始,.bind已被弃用,他们更喜欢使用.on。正如@Blazemonger先前回答的那样,它可能会被删除,并且肯定会将其删除。对于旧版本.bind也会在内部调用.on,它们之间没有区别。另请参阅api以获取更多详细信息。