我知道版本1.7中已弃用live
并在1.9中删除,不再推荐使用它。但是,当我准备面试机器测试时,我正试图在live
和on
之间找到区别。 Document说
因此我尝试了这个。 标记:在事件处理程序中调用event.stopPropagation()无法阻止附加在事件处理程序中的事件处理程序 文献;该事件已经传播到文件。
<div>
<h1>
<a href="#">
<span>Hello</span>
</a>
</h1>
</div>
脚本:
$(document).ready(function () {
$('span').live("click",function () {
alert('span');
});
$('a').click(function () {
alert('span a');
});
$('h1').click(function () {
alert('span a h1');
event.stopPropagation();
});
$('div').click(function () {
alert('span a h1 div');
});
});
我使用的是Jquery 1.7版,其中live
和on
都存在。
发生了什么事:
live
没有调用span,而是直接调用click
的{{1}}。a
以外的所有其他事件,则会调用它。live
答案 0 :(得分:2)
live
附加的事件处理程序始终附加到document
。如果您在event.stopPropagation
的回调中调用live
,则此事件已经冒泡到文档,因此它对直接附加事件处理程序没有任何影响。
当事件到达event.stopPropagation()
元素时,系统会调用h1
,因此它永远不会到达document
事件处理程序附加的live
。
使用on
,您可以创建jQuery支持的所有类型的事件处理。如果你看一下jQuery的来源,你可以看到在1.7中live
函数只是映射到:
live: function( types, data, fn ) {
jQuery( this.context ).on( types, this.selector, data, fn );
return this;
}
live
被删除的原因是为了使事件发生时及其被捕获的地方更清晰,更合乎逻辑。
修改强>
您的DOM以及您的事件处理程序所在的位置:
document $('span').live("click") **not called** (equal to: $(document).on('click', 'span') )
|
div $('div').click() **not called**
|
h1 $('h1').click() + event.stopPropagation() **the propagation (bubbling) is stopped here not reaching the document**
|
a $('a').click()
|
span **event happens here and bubbles up**