我在看http://www.quirksmode.org/js/events_order.html,这一部分含糊不清:
在Microsoft模型中,您必须将事件的
cancelBubble
属性设置为true
。window.event.cancelBubble = true
在W3C模型中,您必须调用事件的
stopPropagation()
方法。e.stopPropagation()
这会阻止事件在冒泡阶段的所有传播。
所以我的问题是:
e.stopPropagation()
来阻止它,或者这只适用于泡沫阶段?答案 0 :(得分:24)
简答:订单是:
如果您在捕获阶段致电e.stopPropagation()
(通过将addEventListener()
的第三个参数设置为 true
),它停在1,所以2& 3不能接收它。
如果您在泡泡阶段致电e.stopPropagation()
(将addEventListener()
的第三个参数设置为 false
或仅不分配它,1& 2已经完成,因此它只是阻止事件从您调用stopPropagation()
的级别冒出来。
答案 1 :(得分:4)
不,事件监听器不会阻止任何事件传播,除非您明确告诉它。你所指的部分具体涉及泡沫阶段。 IE的模型不支持事件捕获 - 完全停止。捕获阶段是在冒泡阶段之前:
Top of the DOM --->event--->traverses--->to--->[target]+[event]-| (capture phase)
/\ \/
|------------------------to--------back up----------------- (bubble up)
答案 2 :(得分:0)
stopPropagation()不会停止调用捕获的事件处理程序。 stopPropagation()将阻止冒泡的事件处理程序被调用。
var outputDiv = document.getElementById('output');
function log(msg) {
outputDiv.insertAdjacentHTML('afterend', msg + '<br>');
}
/////////////////////
//Bubbling listeners
/////////////////////
document.getElementById('row1').addEventListener('click', function(e) {
log('Bubbling row1 listener called');
e.stopPropagation();
}, false);
document.getElementById('row2').addEventListener('click', function(e) {
log('Bubbling row2 listener called');
//NO stopPropagation on this one.
}, false);
document.getElementById('table').addEventListener('click', function() {
log('Bubbling table listener called');
}, false);
document.addEventListener('click', function() {
log('Bubbling document listener called');
}, false);
/////////////////////
//Capturing listeners
/////////////////////
document.addEventListener('click', function() {
log('Capturing document listener called');
}, true);
document.getElementById('table').addEventListener('click', function() {
log('Capturing table listener called');
}, true);
#outputwrapper {
border: 1px solid black;
height: 300px;
overflow: scroll;
}
<table id="table" border="1">
<tbody>
<tr>
<td id="row1">
This row has stopPropagation
</td>
</tr>
<tr>
<td id="row2">
This row does not have stopPropagation
</td>
</tr>
</tbody>
</table>
<br>Output
<br>
<div id="outputwrapper">
<div id="output"></div>
</div>