jQuery:Event Bubbling以及"click","live.click","stopPropagation"和"return false"如何协同工作

Tha*_*ham 8 jquery

我会在这里有情侣情景.请帮我

以下是基本案例:http://jsfiddle.net/2zsLy/9/

当我点击时Click Me,两个警报框Another Paragraph都出来了.这是预期的,因为click事件会冒泡到父容器,即body.现在开始我的问题

1)http://jsfiddle.net/2zsLy/10/

如何添加return false到我live.click不会阻止点击事件冒泡.从示例中,live.click冒泡并触发警报框.我认为文档说返回false会阻止实时事件冒泡.

2)http://jsfiddle.net/2zsLy/11/

现在,我将click事件更改为bodyto live.click并修复了问题 - > click事件没有冒泡(因此没有显示警告框).为什么live.click工作而click不是.

3)http://jsfiddle.net/2zsLy/13/

我认为文件清楚地说,呼唤event.stopPropagation()不会阻止冒泡的发生,我刚刚做了.我用event.stopPropagation()它期望它仍会触发我的警报框,但事实并非如此.为什么?

注意:对于前两个问题的justkt答案,请参阅答案.关于最后一个问题的答案,请参阅Squeegy答案及其答复.

jus*_*tkt 11

您可以在event.stopPropagation()文档中找到您的问题的答案.

关于直播('点击')与'点击'和冒泡:

由于.live()方法在事件传播到文档顶部后处理事件,因此无法停止实时事件的传播.同样,.delegate()处理的事件将始终传播到它们被委派给的元素; 在调用委托事件处理程序时,已经在其下面的任何元素上执行事件处理程序.

所以你所看到的是预期的行为.live('click')不会停止冒泡.现在首选的.delegate()也是如此.

这个答案广泛地描述了使用.live时停止刺激的问题.另请参见.live()文档:

事件会一直冒泡,直到它到达树的根,这是默认情况下.live()绑定其特殊处理程序的地方.

  • 从jQuery 1.4开始,事件冒泡可以选择在DOM元素"context"处停止.

关于stopPropagation本身:

杀死点击事件上的冒泡.

所以stopPropagation()应该在任何返回false的地方防止冒泡; ,虽然不会在哪里.这是preventDefault()方法不会阻止起泡. return false;实际上是stopPropagation()和preventDefault().


回应每个jsfiddle的例子.

1)http://jsfiddle.net/2zsLy/10/

return false;不会阻止使用livedelegate冒泡的事件.文档明确地说明了所有冒泡,无论是用return false;还是用stopPropagation().那么会发生什么

  1. 点击 <p>
  2. 单击气泡到<body>,body.click()触发的位置
  3. 单击bubbles来记录root,它匹配的位置$(event.target).closest('p');,因此live('click')被调用
  4. 返回false会发生,但在第2步调用了body处理程序

2)http://jsfiddle.net/2zsLy/11/

在这种情况下,事件到达相同的位置(文档根),并且返回false将传播停止到live身体上的另一个通过绑定的事件.

  1. 点击 <p>
  2. 单击bubbles to <body>,但由于body的处理程序是通过live连接的,因此尚未调用
  3. 单击bubbles来记录root,它匹配的位置$(event.target).closest('p');,因此live('click')被调用
  4. 返回错误发生
  5. live('click') 由于返回false发生,因此未在身体上调用.

3)http://jsfiddle.net/2zsLy/13/

stopPropagation()显式用于防止冒泡,虽然它有相同的限制return false;- 因此live('click')如果有绑定的点击处理程序,它不会阻止它在事件的情况下bind.

  • @Harry - 你将jQuery设置为1.4.3.将其设置为1.4.4或之后,看到错误已修复.请注意该bug报告中的一条评论:`不幸的是,调用stopImmediatePropagation()在1.4.3中对于实时处理程序不起作用,但是这已经修复并且一旦1.4.4出现就会起作用.如果你推进版本,你会看到这是真的. (2认同)