关于直播活动的问题

时间:2011-05-16 16:20:07

标签: javascript jquery javascript-events event-delegation

我刚刚阅读http://api.jquery.com/event.stopPropagation/

  

由于.live()方法处理   事件一旦传播到   文档的顶部,它不是   可以阻止直播传播   事件

我对这句话感到有点困惑,有人可以用一些例子向我解释一下吗?

2 个答案:

答案 0 :(得分:4)

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

因此实际的处理程序位于顶部(就层次结构而言)。

stopPropagation阻止冒泡进入DOM层次结构,但由于处理程序已经位于顶部(.live情况中的),因此没有上限泡到..


示例尝试..

- document
  - div
    - link

将点击事件处理程序绑定到链接(使用bindclick方法)。

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

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

答案 1 :(得分: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()只有在事件已经冒泡时才会发挥作用,所以阻止事件传播是没用的 - 为时已晚,它已经到达树顶并传播......