jQuery的.bind()与.on()

我发现了两篇很棒的文章,谈论新function.on() : jquery4u.com , elijahmanor.com 。

.bind()仍然比.on()更好用吗?

例如,我有一个如下所示的示例代码:

 $("#container").click( function( e ) {} ) 

你可以注意到我只有一个项目被select器检索到,在我的情况下,当我的页面被加载时,名为#container<div>已经存在; 没有dynamic添加。 提及我使用最新版本的jQuery:1.7.2是很重要的。

对于这个示例,即使我不使用.on()函数提供的其他function,应该使用.on()而不是.bind()

在内部,直接将.bind映射到当前版本的jQuery中的.on 。 ( .live也是如此)如果使用.bind代替,那么会有一个很小但实际上微不足道的性能问题。

但是, .bind可能随时从未来的版本中删除。 没有理由继续使用.bind和每一个理由来select。

这些片段都执行完全相同的事情:

 element.on('click', function () { ... }); element.bind('click', function () { ... }); element.click(function () { ... }); 

然而,它们与这些完全不同,它们都performance出同样的东西:

 element.on('click', 'selector', function () { ... }); element.delegate('click', 'selector', function () { ... }); $('selector').live('click', function () { ... }); 

第二组事件处理程序使用事件委托 ,并将为dynamic添加的元素工作。 使用委托的事件处理程序也更加高效。 第一组不适用于dynamic添加的元素,而且性能差得多。

jQuery的on()函数不会引入任何尚不存在的新function,只是尝试在jQuery中标准化事件处理(不再需要在活动,绑定或委托之间做出决定)。

直接的方法和.delegate.delegate的优越API,并且不打算使用它们。

直接的方法是可取的,因为你的代码将被减lessstringtypes。 当您错误键入事件名称而不是无声的错误时,您将得到直接的错误。 在我看来,写clickclick更容易on("click"

.on因为参数的顺序优于.on

 $(elem).delegate( ".selector", { click: function() { }, mousemove: function() { }, mouseup: function() { }, mousedown: function() { } }); 

你马上就知道它是委托的,因为它说委托。 您也可以立即看到select器。

随着.on它不是立即清楚,如果它甚至委派,你必须看看select器的结束:

 $(elem).on({ click: function() { }, mousemove: function() { }, mouseup: function() { }, mousedown: function() { } }, "selector" ); 

现在, .bind的命名非常糟糕,面值比.on更糟。 但是.delegate不能执行未委托的事件,并且有没有直接方法的事件,所以在这种罕见的情况下,可以使用它,但仅仅是因为你想在委托和非委托事件之间做一个清晰的分离。

如果你查看$.fn.bind的源代码,你会发现它只是一个重写函数:

 function (types, data, fn) { return this.on(types, null, data, fn); } 

http://james.padolsey.com/jquery/#v=1.7.2&fn=$.fn.bind

从jQuery文档:

从jQuery 1.7开始,.on()方法是将事件处理程序附加到文档的首选方法。 对于较早的版本,.bind()方法用于将事件处理程序直接附加到元素。 处理程序被附加到jQuery对象中当前选定的元素,所以这些元素必须存在于对.bind()的调用发生的地方。 为了更灵活的事件绑定,请参阅.on()或.delegate()中的事件委托的讨论。

http://api.jquery.com/bind/

从Jquery 3.0及以上.bind已被弃用,他们更喜欢使用。 正如@ Blazemonger早些时候回答说,它可能会被删除,它肯定会被删除。 对于较老的版本,.bind也会在内部调用.on,它们之间没有区别。 请参阅api了解更多详细信息。

.bind()的jQuery API文档