术语
从 quirksmode.org:
事件捕获
使用事件捕获时
| |
---------------| |-----------------
| element1 | | |
| -----------| |----------- |
| |element2 \ / | |
| ------------------------- |
| Event CAPTURING |
-----------------------------------
element1 的事件处理程序首先触发,element2 的事件处理程序最后触发。
事件冒泡
使用事件冒泡时
/ \
---------------| |-----------------
| element1 | | |
| -----------| |----------- |
| |element2 | | | |
| ------------------------- |
| Event BUBBLING |
-----------------------------------
element2 的事件处理程序首先触发,element1 的事件处理程序最后触发。
首先捕获 W3C 事件模型中发生的任何事件,直到它到达目标元素,然后再次冒泡。
| | / \
-----------------| |--| |-----------------
| element1 | | | | |
| -------------| |--| |----------- |
| |element2 \ / | | | |
| -------------------------------- |
| W3C event model |
------------------------------------------
接口
从 w3.org 开始,用于事件捕获:
如果捕获希望阻止事件的进一步处理发生,则可以调用接口的方法。这将阻止事件进一步调度,尽管在同一层次结构级别注册的其他事件仍将收到该事件。调用事件的方法后,对该方法的进一步调用不会产生其他影响。如果不存在其他捕获器并且尚未调用,则该事件将在目标本身上触发相应的捕获器。EventListener
stopPropagation
Event
EventListeners
stopPropagation
stopPropagation
EventListeners
对于事件冒泡:
任何事件处理程序都可以选择通过调用接口的方法来防止进一步的事件传播。如果有任何调用此方法,则将触发电流上的所有附加内容,但在该级别将停止冒泡。只需拨打一个电话即可防止进一步冒泡。stopPropagation
Event
EventListener
EventListeners
EventTarget
stopPropagation
对于事件取消:
取消是通过调用 的方法来完成的。如果在事件流的任何阶段进行一个或多个调用,则默认操作将被取消。Event
preventDefault
EventListeners
preventDefault
例子
在以下示例中,单击 Web 浏览器中的超链接将触发事件流(执行事件侦听器)和事件目标的默认操作(打开新选项卡)。
网页:
<div id="a">
<a id="b" href="http://www.google.com/" target="_blank">Google</a>
</div>
<p id="c"></p>
JavaScript:
var el = document.getElementById("c");
function capturingOnClick1(ev) {
el.innerHTML += "DIV event capture<br>";
}
function capturingOnClick2(ev) {
el.innerHTML += "A event capture<br>";
}
function bubblingOnClick1(ev) {
el.innerHTML += "DIV event bubbling<br>";
}
function bubblingOnClick2(ev) {
el.innerHTML += "A event bubbling<br>";
}
// The 3rd parameter useCapture makes the event listener capturing (false by default)
document.getElementById("a").addEventListener("click", capturingOnClick1, true);
document.getElementById("b").addEventListener("click", capturingOnClick2, true);
document.getElementById("a").addEventListener("click", bubblingOnClick1, false);
document.getElementById("b").addEventListener("click", bubblingOnClick2, false);
示例 1:它导致输出
DIV event capture
A event capture
A event bubbling
DIV event bubbling
示例 2:添加到函数stopPropagation()
function capturingOnClick1(ev) {
el.innerHTML += "DIV event capture<br>";
ev.stopPropagation();
}
结果在输出
DIV event capture
事件侦听器阻止了事件的进一步向下和向上传播。但是,它没有阻止默认操作(打开新选项卡)。
示例 3:添加到函数stopPropagation()
function capturingOnClick2(ev) {
el.innerHTML += "A event capture<br>";
ev.stopPropagation();
}
或函数
function bubblingOnClick2(ev) {
el.innerHTML += "A event bubbling<br>";
ev.stopPropagation();
}
结果在输出
DIV event capture
A event capture
A event bubbling
这是因为两个事件侦听器都注册在同一个事件目标上。事件侦听器阻止了事件的进一步向上传播。但是,他们没有阻止默认操作(打开新选项卡)。
示例 4:添加到任何函数,例如preventDefault()
function capturingOnClick1(ev) {
el.innerHTML += "DIV event capture<br>";
ev.preventDefault();
}
阻止新选项卡打开。