etc etc etc...),这可以快速加起来
因此,像click 一样,bind 也像其他快捷方式事件绑定器一样直接附加到事件目标。假设有一张1000行和100列的表格,并且100'000单元格中的每一个都包含一个复选框,您要处理该单击。附加100'000事件处理程序将花费大量时间来加载页面。在表级别创建一个事件,并使用事件委派效率要高几个数量级。事件目标将在事件执行时检索。" this "将成为表,而" event.target "将是click 函数中通常的" this "。现在,使用on 的好处是" this "将始终是事件目标,而不是它附加到的容器。
委托不附带取消委托吗?
对。好发现。您每天都在学习;)(自2011年以来,您的文档有了很大的改进)
使用.on 方法可以使用相同的功能来执行.live ,.delegate 和.bind ,但是对于.live() 只能使用.live() (将事件委托给文档)。
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来源确认这一点:
1 2 3 4 5 6 7 8 9 10 11 12
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 )来查看代码...
因此,在实践中,您可以:
与bind 一样使用on :
1 2
/* Old: */ $(".foo").bind("click", handler);
/* New: */ $(".foo").on("click", handler);
与delegate 一样使用on (事件委托植根于给定元素中):
1 2
/* Old: */ $("#container").delegate(".foo","click", handler);
/* New: */ $("#container").on("click",".foo", handler);
与live 一样使用on (事件委托植根于文档中):
1 2
/* Old: */ $(".foo").live("click", handler);
/* New: */ $(document).on("click",".foo", handler);
在链接的页面中,我说:"如果将新HTML注入到页面中,请选择元素并在将新HTML放入页面后附加事件处理程序。或者,使用委托事件来附加事件处理程序,如下所述。" 。因此,更可能是绑定,而不是生存。我对吗?
@迭戈:on 是bind 和delegate 的组合,正如我所说,与live 不太相似。您可以像bind 这样使用on (直接将处理程序附加到元素),也可以像delegate 这样使用on (将处理程序附加到元素,但仅在实际单击的元素匹配时才触发事件)一个选择器,并且好像该元素是事件发生的那个元素(例如,事件委托),或者您可以像live 一样使用它(以文档为根的delegate )。它的事件委托使您可以动态添加元素。
旧的live也可以像委托一样使用:$("#id",".class").live(fn) = $(".class").delegate("#id", fn ); 实际上,在旧的jQuery源中,他们将live用作一般情况,将委托用作特殊情况,这使您在考虑时变得更加混乱。
@Esailija:足够公平。我不认为这是它众所周知的用途,因为他们很快就添加了delegate ,但仍然如此。 :-)
基本用例没有一个。
这两行在功能上是相同的
1 2
$( '#element' ).bind( 'click', handler );
$( '#element' ).on( 'click', handler );
.on()也可以进行事件委托,因此首选。
.bind()实际上只是.on()的别名。这是1.7.1中bind函数的定义
1 2 3
bind: function( types, data, fn ) {
return this.on( types, null, data, fn );
},
添加.on()的想法是创建一个统一的事件API,而不是具有用于绑定事件的多个函数。 .on()替换.bind()、. live()和.delegate()。
live是.on()的快捷方式
1 2 3 4 5
//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/
如果要获取与该元素关联的事件处理程序,应该注意一些事项-注意处理程序附加到的元素!
例如,如果您使用:
1
$('.mySelector').bind('click', fn);
您将使用以下方法获取事件处理程序:
1
$('.mySelector').data('events');
但是,如果您使用:
1
$('body').on('click', '.mySelector', fn);
您将使用以下方法获取事件处理程序:
1
$('body').data('events');
(在最后一种情况下,相关事件对象将具有selector ="。mySelector")
events 仍然没有记录,我认为它在1.9中不再起作用
对。可以使用_data代替较新版本中的数据。答案是关于"事件所有者"的区别,而不是旧版本或新版本的确切语法。还有其他有关不同JQuery版本的确切语法的文章。例如stackoverflow.com/questions/2518421/