我想了解如何准确理解“事件冒泡”。它是指按照HTML代码层次结构往上走,还是有其他含义?
其次,我正在阅读一个示例,但无法理解最后一部分所说的:
“基于段落的点击处理程序监听点击事件,然后阻止其传播(向上冒泡)。”
这是什么意思?
其次,我正在阅读一个示例,但无法理解最后一部分所说的:
“基于段落的点击处理程序监听点击事件,然后阻止其传播(向上冒泡)。”
这是什么意思?
“冒泡”概念类似于,如果您有一个带有点击事件的子元素,而您不希望它触发父级的点击事件。您可以使用 event.stopPropagation()
。
event.stopPropagation()
基本上是说只将此点击事件应用于此子节点,不要告诉父容器任何内容,因为我不希望它们做出反应。
事件捕获:
| |
---------------| |-----------------
| element1 | | |
| -----------| |----------- |
| |element2 \ / | |
| ------------------------- |
| Event CAPTURING |
-----------------------------------
/ \
---------------| |-----------------
| element1 | | |
| -----------| |----------- |
| |element2 | | | |
| ------------------------- |
| Event BUBBLING |
-----------------------------------
live()
或delegate()
,则需要return false;
,但可能不起作用。请阅读以下引用。另一个很好的资源:http://fuelyourcoding.com/jquery-events-stop-misusing-return-false/
return false;
使用 stopPropagation()
可以防止事件“冒泡”,用于阻止默认操作,例如勾选复选框、打开下拉列表、点击等。
如果要停止使用
.live()
绑定的处理程序后执行更多处理程序,则处理程序必须返回 false。调用.stopPropagation()
无法实现此目的。
参考自 jQuery .live() 的注意事项.
原因 (感谢 @AlienWebguy): .live()
将事件绑定到文档上,因此在触发时已经没有其他地方可以冒泡。
e.preventDefault(); e.stopPropagation();
并没有帮助我(尽管在大多数情况下似乎是有效的)。 - RyanstopPropagation()不与
live()一起工作的原因是
live()将事件绑定到
document,因此在它触发时没有其他地方可以传播了。
- AlienWebguy.click
处理程序中加入 return false;
,解决了我的问题。谢谢。 - Forgedlive()
方法将事件处理程序附加到document
元素,并检查事件的target
以确定其来自哪里。如果目标与选择器匹配,则触发事件处理程序。所有这些都建立在冒泡事件系统的基础上。p
元素上的单击处理程序是a
元素的祖先,通过返回false
取消了冒泡。然后document
元素将永远不会接收事件,因此它不会触发事件处理程序。<div id="div">
<a href="google.com" id="anchor"></a>
</div>
$("#div").click(function(e){//On anchor click this event will not be fired as we have stop the event propagation in anchor click handler.
//Do stuff here
});
$("#anchor").click(function(e){
//Do stuff here
//This line stops the event bubling and
//jquery has abstracted it in the event object to make it cross browser compatible.
e.stopPropagation();
});
这两个链接提供了关于事件冒泡(以及常用的事件概念)的清晰详细解释。
http://jqfundamentals.com/chapter/events
http://www.mattlunn.me.uk/blog/2012/05/what-does-event-bubbling-mean/
事件将被触发到包含
a
元素的所有元素上,一直冒泡到document
。
<div>
<h1>
<a href="#">
<span>Hello</span>
</a>
</h1>
</div>
某个元素
)遍历到根节点(文档
)的过程(一直跟随你的父元素,直到无法再往上了)。是的,事件会沿着树向上冒泡,如果任何元素有该事件的处理程序,它将被调用。
通过在其中一个元素的处理程序中添加return:false
,可以防止事件冒泡。