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。 当您错误键入事件名称而不是无声的错误时,您将得到直接的错误。 在我看来,写click
比click
更容易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); }
从jQuery文档:
从jQuery 1.7开始,.on()方法是将事件处理程序附加到文档的首选方法。 对于较早的版本,.bind()方法用于将事件处理程序直接附加到元素。 处理程序被附加到jQuery对象中当前选定的元素,所以这些元素必须存在于对.bind()的调用发生的地方。 为了更灵活的事件绑定,请参阅.on()或.delegate()中的事件委托的讨论。
从Jquery 3.0及以上.bind已被弃用,他们更喜欢使用。 正如@ Blazemonger早些时候回答说,它可能会被删除,它肯定会被删除。 对于较老的版本,.bind也会在内部调用.on,它们之间没有区别。 请参阅api了解更多详细信息。
.bind()的jQuery API文档