.delegate()vs .on()

我在我的web应用程序中使用jQuery。 我一直在使用.bind()但是我发现它有点慢,所以在阅读有关.on().delegate()的文档时。 我明白.delegate()是如何工作的,但是我不清楚它和.on()之间的差别,哪个更好。

另外我使用jQuery 1.6,所以我想知道是否值得准备我的脚本的jQuery 1.7通过放入类似于以下条件:

 if(typeof $(selector).on == 'function'){ /* use .on() */ }else{ /* use .delegate() */ } 

这是一个好主意(为.on() )做准备,还是仅仅是为了寻找麻烦?

请帮助我清楚了解这些方法。

.on()语法是版本1.7使用的新语法,用于替代.bind() .delegate().live()

更多在这里 – > http://blog.jquery.com/2011/11/03/jquery-1-7-released/

新的事件API:.on()和.off()

新的.on()和.off()API统一了在jQuery中将事件附加到文档中的所有方法 – 而且它们的types更短!

  $(elements).on( events [, selector] [, data] , handler ); $(elements).off( [ events ] [, selector] [, handler] ); 

提供select器时,.on()与.delegate()相似,它附加了一个委托事件处理程序,由select器进行过滤。 当select器被省略或为null时,调用就像.bind()。 有一个不明确的情况:如果data参数是一个string,则必须提供一个select器string或null,以便数据不会被误认为是select器。 传递一个对象的数据,你永远不会担心特殊情况。

所有现有的事件绑定方法(及其相应的解除绑定方法)在1.7中仍然存在,但是我们build议您使用.on()来处理任何已知版本为1.7或更高版本的新jQuery项目。 (重点是我的)

我最近回答了一个关于这个话题的相关问题 。

重要的部分是:

on docs函数用于replace绑定事件的现有单独方法:

现有的事件继续存在,只是简单的别名。 没有官方的报告表明它们会被删除,所以如果你更好地理解它们,你可以继续使用它们。

代表:

 $(selector).delegate(subselector, events, data, handler); $(selector).on(events, subselector, data, handler); 

资源:

 delegate: function( selector, types, data, fn ) { return this.on( types, selector, data, fn ); } 

TL;博士

如果你想要向后兼容,只要继续使用.delegate() 文档 ,如果你的代码依赖于新的jQuery特性,可以随意使用。

从API:

“从jQuery 1.7开始,.delegate()已经被.on()方法取代。”

“从jQuery 1.7开始,.on()方法提供了附加事件处理程序所需的全部function。”

考虑使用find()而不是事件代表。 看看这个性能testing: http : //jsperf.com/jquery-event-delegation/85

代替

 $("#mydomid").on("click", ".somechildclass", delegate); 

使用

 $("#mydomid").find(".somechildclass").on("click", delegate); 

如果你通过jQuery Api,你会发现两者是相同的。 阅读更多

例如,下面的.delegate()代码:

$(“table”)。delegate(“td”,“click”,function(){
$(本).toggleClass( “select”); });

相当于使用.on()编写的以下代码:

$(“table”)。on(“click”,“td”,function(){
$(本).toggleClass( “select”); });

.delegate()相当于.on() : https : //github.com/jquery/jquery/blob/bd9a138/src/event/alias.js#L31-33

.on()是首选,因为它更短,并且它具有更好的参数顺序。