Answers:
on()
试图将大多数jQuery的事件绑定功能合并为一个。这具有通过live
vs 整理效率低下的额外好处delegate
。在将来的jQuery版本中,这些方法将被删除,on
并且one
只会被保留。
例子:
// Using live()
$(".mySelector").live("click", fn);
// Equivalent `on` (there isn't an exact equivalent, but with good reason)
$(document).on("click", ".mySelector", fn);
// Using bind()
$(".mySelector").bind("click", fn);
// Equivalent `on`
$(".mySelector").on("click", fn);
// Using delegate()
$(document.body).delegate(".mySelector", "click", fn);
// Equivalent `on`
$(document.body).on("click", ".mySelector", fn);
在内部,jQuery将所有这些方法和速记事件处理程序设置方法映射到该on()
方法,进一步表明您从现在开始就应该忽略这些方法,而只需使用on
:
bind: function( types, data, fn ) {
return this.on( types, null, data, fn );
},
live: function( types, data, fn ) {
jQuery( this.context ).on( types, this.selector, data, fn );
return this;
},
delegate: function( selector, types, data, fn ) {
return this.on( types, selector, data, fn );
},
参见https://github.com/jquery/jquery/blob/1.7/src/event.js#L965。
$(document.body).delegate("click", ".mySelector", fn);
应该是$(document.body).delegate(".mySelector", "click", fn);
on
在自然界中非常接近delegate
。那么为什么不使用委托呢?这是因为on
并不孤单。有off
,取消绑定事件并one
创建仅执行一次的事件。这是新事件的“包”。
主要问题 live
是它附加到“窗口”上,迫使页面结构(dom)内部深处的元素上的点击事件(或其他事件)“冒泡”到页面顶部以查找事件经理愿意处理。在每个级别,都必须检查所有事件处理程序,如果您进行深层加密(<body><div><div><div><div><table><table><tbody><tr><td><div><div><div><ul><li><button> etc etc etc...
),这可以快速加起来
因此,和其他快捷方式事件活页夹bind
一样click
,和一样直接附加到事件目标。假设您有1000行和100列的表格,并且100'000单元格中的每一个都包含一个复选框,您要处理该单击。附加100'000事件处理程序将花费大量时间加载页面。在表级别创建一个事件,并使用事件委派效率要高几个数量级。事件目标将在事件执行时检索。“ this
”将是表格,但“ event.target
”将是您平时在表中使用的“ this
”click
函数中。现在的好处on
是,“ this
”将始终是事件目标,而不是它所附加的容器。
使用.on
method可以实现.live
,.delegate
和.bind
具有相同功能,但.live()
只能.live()
实现(将事件委托给document)。
jQuery("#example").bind( "click", fn )
= jQuery( "#example").on( "click", fn );
jQuery("#example").delegate( ".examples", "click", fn )
= jQuery( "#example" ).on( "click", ".examples", fn )
jQuery("#example").live( fn )
= jQuery( document ).on( "click", "#example", fn )
我可以直接从jQuery来源确认这一点:
bind: function( types, data, fn ) {
return this.on( types, null, data, fn );
},
live: function( types, data, fn ) {
jQuery( this.context ).on( types, this.selector, data, fn );
return this;
},
delegate: function( selector, types, data, fn ) {
return this.on( types, selector, data, fn );
},
jQuery(this.context)?this.context
=== document
在大多数情况下
(在您更改问题之前,我的开场白更有意义。最初,您说的是“和有什么区别live
?”)
on
更像是delegate
不是很喜欢live
,它基本上是统一的形式bind
和delegate
(事实上,该团队表示,其目的是“......统一连接的事件发送到文档的所有方面......”)。
live
基本上on
(或delegate
)附加到整个文档中。从v1.7开始,不推荐使用on
或delegate
。展望未来,我怀疑我们将on
仅使用代码,而不是使用bind
或delegate
(或live
)。
因此,在实践中,您可以:
on
像这样使用bind
:
/* Old: */ $(".foo").bind("click", handler);
/* New: */ $(".foo").on("click", handler);
使用on
like delegate
(事件委托植根于给定元素中):
/* Old: */ $("#container").delegate(".foo", "click", handler);
/* New: */ $("#container").on("click", ".foo", handler);
使用on
like live
(事件委托植根于文档中):
/* Old: */ $(".foo").live("click", handler);
/* New: */ $(document).on("click", ".foo", handler);
on
是的组合bind
和delegate
,和我说的,不是很喜欢live
。您可以使用on
like bind
(将处理程序直接附加到元素上),也可以使用on
like delegate
(将处理程序附加到元素上,但仅在所单击的实际元素与选择器匹配时,才触发该事件,就好像该元素是那个选择器一样)。事件发生-例如,事件委托),或者您可以像使用它一样live
(delegate
使用文档作为根)。如果动态添加元素,则事件委托使它很有用。
$("#id", ".class").live(fn)
= $(".class").delegate("#id", fn );
实际上,在旧的jQuery源中,他们将live用作一般情况,将委托用作特殊情况,这使您在考虑时更加困惑。
delegate
很快就添加了,但是仍然可以。:-)
live是.on()的快捷方式
//from source http://code.jquery.com/jquery-1.7.js
live: function( types, data, fn ) {
jQuery( this.context ).on( types, this.selector, data, fn );
return this;
}
这篇文章也可能对您有用 http://blog.jquery.com/2011/11/03/jquery-1-7-released/
基本用例没有一个。这两行在功能上是相同的
$( '#element' ).bind( 'click', handler );
$( '#element' ).on( 'click', handler );
.on()也可以进行事件委托,因此首选。
.bind()实际上现在只是.on()的别名。这是1.7.1中bind函数的定义
bind: function( types, data, fn ) {
return this.on( types, null, data, fn );
},
添加.on()的想法是创建一个统一的事件API,而不是具有用于绑定事件的多个函数。.on()替换.bind()、. live()和.delegate()。
如果要获取与该元素关联的事件处理程序,应该注意一些事项-注意处理程序附加到的元素!
例如,如果您使用:
$('.mySelector').bind('click', fn);
您将使用以下方法获取事件处理程序:
$('.mySelector').data('events');
但是,如果您使用:
$('body').on('click', '.mySelector', fn);
您将使用以下方法获取事件处理程序:
$('body').data('events');
(在最后一种情况下,相关事件对象将具有selector =“。mySelector”)
events
仍然没有文档,我认为它在1.9中不再起作用