2011-05-16 55 views
5

我只是读http://api.jquery.com/event.stopPropagation/关于现场活动

由于.live()方法问题处理 事件一旦他们传播到 文件的顶部,它不是 可能停止活传播 事件

我对这个声明有点困惑,有人能请一些例子解释我吗?

+0

相关问题(引擎盖下):http://stackoverflow.com/questions/1687296/what-is-dom-event-delegation – 2011-05-16 16:29:43

回答

4

Live方法将处理程序绑定到文档,并标识哪个元素触发了event.target属性中的事件。

所以实际的处理程序在顶层(根据层次结构)。

stopPropagation停止从一个上升的DOM层次结构中鼓泡,但由于该处理程序是在顶部已经(在.live情况)没有上地方气泡..


例如尝试..

- document 
    - div 
    - link 

你一个click事件处理程序绑定到链接(bindclick方法)。

当你点击链接时,处理程序被触发,但是除此之外,点击事件会在DOM到达文档之前上升,并且还会触发绑定到div和文档的点击处理程序。 (除非使用.stopPropagation

可选地如果使用.live方法到事件处理程序结合,它将被绑定到该文档。如果你现在点击链接,那么事件(不会立即启动,因为没有处理程序绑定到它)自然会上升到DOM(触发点击处理程序它遇到)。一旦它到达文档,它将触发我们自己的处理程序。但是没有上限,所以stopPropagation在这一点上是无用的。

2

HTML:

<div id="outer"> 
    <div id="inner"> 
     <span>.live() version</span> 
    </div> 
</div> 

<div id="outer2"> 
    <div id="inner2"> 
     <span>.delegate() version</span> 
    </div> 
</div> 

JS:

$(function(){ 

    $('#inner2').delegate('span', 'click', function(e){ 
     e.stopPropagation(); // indeed, no alert! 
    }); 

    $('span').live('click', function(e){ 
     e.stopPropagation(); 
     // we would expect the propagation to stop here, so no alert, right? 
    }); 

    $('#outer2, #outer').click(function(){ alert("Don't reach me!"); }); 

}); 

例子:http://jsfiddle.net/knr3v/2/

.live()不仅它的魔力,一旦该事件已经起泡,所以从传播停止事件是没用的 - 它已经太晚了,它已经到达树的顶端并且传播了...