凭经验:这取决于您使用的浏览器;IE 取消了该事件,其他一切(据我所知)继续它。请参阅下面的测试页面和讨论。
理论上: Andy E 的负责人发现DOM2表示事件应该继续,因为冒泡应该基于树的初始状态。所以大多数人的行为是正确的,IE在这里是独立的。奎尔惊喜。
但是:这是否与您所看到的有关确实是另一个问题。您正在查看对表格的父元素的点击,您怀疑在极少数情况下,当您点击表格时,会出现一个 Ajax 完成替换表格的竞争条件,并且点击会丢失。Javascript 解释器中不存在这种竞争条件,因为目前浏览器上的 Javascript 是单线程的。(不过,工作线程即将到来——哇哦!)但理论上,点击可能会发生并由浏览器中的非 Javascript UI 线程排队,然后 ajax 可以完成并替换元素,然后排队的 UI 事件被处理并且根本不会发生或不会冒泡,因为该元素不再有父元素,已被删除。很多关于浏览器的实现。如果您在任何开源浏览器上看到它,您可能会查看它们的源以将 UI 事件排队以供解释器处理。但这与在事件处理程序中使用代码实际删除元素不同,如下所示。
冒泡继续方面的经验结果:
测试了 Chrome 4 和 Safari 4(例如,WebKit)、Opera 10.51、Firefox 3.6、IE6、IE7 和 IE8。IE 是唯一一个在您删除元素时取消事件(并且在不同版本中始终如此),其他都没有。无论您使用的是 DOM0 处理程序还是更现代的处理程序,这似乎都无关紧要。
更新:
在测试中,IE9 和 IE10 继续活动,因此 IE 不符合规范在 IE8 处停止。
使用 DOM0 处理程序的测试页面:
<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="Content-type" content="text/html;charset=UTF-8">
<title>Test Page</title>
<style type='text/css'>
body {
font-family: sans-serif;
}
#log p {
margin: 0;
padding: 0;
}
</style>
<script type='text/javascript'>
window.onload = pageInit;
function pageInit() {
var parent, child;
parent = document.getElementById('parent');
parent.onclick = parentClickDOM0;
child = document.getElementById('child');
child.onclick = childClickDOM0;
}
function parentClickDOM0(event) {
var element;
event = event || window.event;
element = event.srcElement || event.target;
log("Parent click DOM0, target id = " + element.id);
}
function childClickDOM0(event) {
log("Child click DOM0, removing");
this.parentNode.removeChild(this);
}
function go() {
}
var write = log;
function log(msg) {
var log = document.getElementById('log');
var p = document.createElement('p');
p.innerHTML = msg;
log.appendChild(p);
}
</script>
</head>
<body><div>
<div id='parent'><div id='child'>click here</div></div>
<hr>
<div id='log'></div>
</div></body>
</html>
attachEvent
使用/处理程序的测试页面addEventListener
(通过原型):
<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="Content-type" content="text/html;charset=UTF-8">
<title>Test Page</title>
<style type='text/css'>
body {
font-family: sans-serif;
}
#log p {
margin: 0;
padding: 0;
}
</style>
<script type='text/javascript' src='http://ajax.googleapis.com/ajax/libs/prototype/1.6.1.0/prototype.js'></script>
<script type='text/javascript'>
document.observe('dom:loaded', pageInit);
function pageInit() {
var parent, child;
parent = $('parent');
parent.observe('click', parentClick);
child = $('child');
child.observe('click', childClick);
}
function parentClick(event) {
log("Parent click, target id = " + event.findElement().id);
}
function childClick(event) {
log("Child click, removing");
this.remove();
}
function go() {
}
var write = log;
function log(msg) {
$('log').appendChild(new Element('p').update(msg));
}
</script>
</head>
<body><div>
<div id='parent'><div id='child'>click here</div></div>
<hr>
<div id='log'></div>
</div></body>
</html>