.delegate()vs .on()

时间:2011-12-02 16:03:25

标签: jquery

我在我的网络应用程序中使用jQuery。我一直在使用.bind(),但我发现它有点慢,所以在阅读文档时,我读到了.on().delegate()。我理解.delegate()是如何运作的,但我不清楚它与.on()之间的区别是什么,或哪种情况更好。

此外我正在使用jQuery 1.6,所以我想知道是否值得为jQuery 1.7准备我的脚本,条件类似于以下条件:

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

这是一个好主意(准备.on())还是只是寻找麻烦?

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

6 个答案:

答案 0 :(得分:49)

.on()语法是1.7版本使用的新语法,它旨在替换.bind().delegate().live()

更多信息 - > http://blog.jquery.com/2011/11/03/jquery-1-7-released/

  

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

     

新的.on()和.off()API统一了附加事件的所有方式   到jQuery中的文档 - 它们的类型更短!

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

当提供选择器时,.on()类似于.delegate()   它附加一个委托的事件处理程序,由选择器过滤。什么时候   省略选择器或null调用类似.bind()。有一个   不明确的情况:如果data参数是一个字符串,则必须提供   选择器字符串或null,以便数据不会被误认为是   选择。传递一个数据对象,你永远不必担心   特殊情况。

     

所有现有的事件绑定方法(及其对应的   unbinding方法)仍然在1.7,但我们建议你   使用.on()进行任何你知道1.7或更高版本的新jQuery项目   正在使用更高。(强调我的)

答案 1 :(得分:11)

我最近就这个主题回答了a related question

重要的部分是:

  

新的ondocs函数用于替换绑定事件的现有单独方法:

     

现有事件仍然存在,并且只是on的别名。没有正式报告表明它们会被删除,所以如果你能更好地理解它们,你可以安全地继续使用它们。

代表:

$(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()docs,如果您的代码依赖于较新的jQuery功能,请随时使用on

答案 2 :(得分:1)

来自API:

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

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

答案 3 :(得分:1)

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

而不是

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

使用

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

答案 4 :(得分:0)

如果你浏览jQuery Api,你会发现两者都是一样的。 Read More

  

例如,以下.delegate()代码:

     

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

     

等同于使用.on()编写的以下代码:

     

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

答案 5 :(得分:0)

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

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