jQuery 的 .bind() 与 .on()

Posted

技术标签:

【中文标题】jQuery 的 .bind() 与 .on()【英文标题】:jQuery’s .bind() vs. .on() 【发布时间】:2012-08-04 12:43:35 【问题描述】:

我发现了两篇关于新功能.on()的精彩文章:jquery4u.com、elijahmanor.com。

有什么方法可以让.bind().on() 更好用?

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

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

您可以注意到,选择器只检索了一个项目,在我的情况下,在我的页面加载时名为 #container<div> 已经存在;不是动态添加的。值得一提的是,我使用的是最新版本的 jQuery:1.7.2。

对于该示例,是否应该使用 .on() 代替 .bind(),即使我不使用 .on() 函数提供的其他功能?

【问题讨论】:

第二篇文章是垃圾。它说明了.bind() 对绑定多个元素的不利之处,但没有提及.on() 在绑定模式下的作用完全相同。 【参考方案1】:

在内部,.bind 直接映射到当前版本的 jQuery 中的.on。 (.live 也是如此。)因此,如果您改用 .bind,则会对性能造成微小但实际上微不足道的影响。

但是,.bind 可能随时从未来版本中删除。没有理由继续使用.bind,而是更喜欢.on

【讨论】:

可能——几乎没有理由删除它们,因为它们只是映射到现有函数。另一方面,按主要版本号升级意味着您可以对 API 做任何事情,因为此时不一定能保证向后兼容性。只是说。 @Esailija 这些函数都为处理特定类型的异步请求提供了有用的快捷方式。 .bind.on 对于非委托事件是相同的; .bind 没有像 $.getJSON 那样提供任何快捷方式 @jbabey,虽然从技术上讲他们不一定会删除任何功能,但他们仍然deprecate 他们并建议您不要使用它们。将来他们总是可以决定完全删除它们(就像他们从 2.x 版本中删除某些 IE 支持的方式一样)。不应使用已弃用的函数。 打印“jQuery.fn.bind.toString()”输出“function (a,b,c)return this.on(a,null,b,c)" 从 jQuery 3 开始不推荐使用绑定和取消绑定。【参考方案2】:

这些 sn-ps 都执行完全相同的操作:

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 中的事件处理(您不再需要在 live、bind 或 delegate 之间做出决定)。

【讨论】:

我认为您的意思是$('selector').live('click', function () ... );,因此您可以尽可能保持结果相同。【参考方案3】:

直接方法和.delegate 是优于.on 的API,无意弃用它们。

直接方法更可取,因为您的代码的字符串类型较少。当您输入错误时,您将立即收到错误 事件名称而不是无声的错误。在我看来,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 不能进行非委托活动 是没有直接方法的事件,因此在这种罕见的情况下可以使用它,但这只是因为您想在委托和非委托事件之间进行清晰的分离。

【讨论】:

从 jQuery 3.0 开始,.delegate() 已被弃用。【参考方案4】:

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

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

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

【讨论】:

【参考方案5】:

来自 jQuery 文档:

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

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

【讨论】:

请记住,文档的建议来自为您带来绑定、单击、直播、委托...以及所有由此产生的混乱的同一团队。在阅读了有关此问题的多个站点后,我认为最好和最准确的站点是那些将“开”描述为“糖衣”的站点,糖会吸引虫子,而委托是要走的路。【参考方案6】:

从 Jquery 3.0 及更高版本开始,.bind 已被弃用,他们更喜欢使用 .on。正如@Blazemonger 之前回答的那样,它可能会被删除,并且肯定会被删除。对于旧版本 .bind 也会在内部调用 .on ,它们之间没有区别。详情请查看 api。

jQuery API documentation for .bind()

【讨论】:

以上是关于jQuery 的 .bind() 与 .on()的主要内容,如果未能解决你的问题,请参考以下文章

jQuery事件绑定on()bind()与delegate() 方法详解

jQuery教程 .bind() .live() .delegate() .on()区别详解

Jquery动态绑定事件处理函数 bind / on / delegate

jQuery的.click,.bind,.unbind,.on,.off,.delegate,.undelegate

jquery的bind跟on绑定事件的区别

jquery的bind跟on绑定事件的区别