我在我的网络应用程序中使用jQuery。我一直在使用.bind()
,但我发现它有点慢,所以在阅读文档时,我读到了.on()
和.delegate()
。我理解.delegate()
是如何运作的,但我不清楚它与.on()
之间的区别是什么,或哪种情况更好。
此外我正在使用jQuery 1.6,所以我想知道是否值得为jQuery 1.7准备我的脚本,条件类似于以下条件:
if(typeof $(selector).on == 'function'){
/* use .on() */
}else{
/* use .delegate() */
}
这是一个好主意(准备.on()
)还是只是寻找麻烦?
请帮助我清楚地了解这些方法。
答案 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。
重要的部分是:
新的
on
docs函数用于替换绑定事件的现有单独方法:现有事件仍然存在,并且只是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 );
}
如果您想要向后兼容,请继续使用.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()
是首选,因为它更短,并且具有更好的参数顺序。