経験的に:使用しているブラウザによって異なります。IE はイベントをキャンセルし、他のすべて (私が知る限り) はイベントを続行します。以下のテスト ページと説明を参照してください。
理論的には: Andy E の頭は、バブルはツリーの初期状態に基づいている必要があるため、DOM2がイベントを続行する必要があることを示していることを発見しました。したがって、大多数の動作は正しく、ここでは IE が単独で動作します。クェル・サプライズ。
しかし、それがあなたが見ているものに関連しているかどうかは、まったく別の問題です. テーブルの親要素のクリックを監視していますが、テーブルをクリックすると、テーブルを置き換える Ajax 補完を伴う競合状態が発生し、クリックが失われることが非常にまれであると思われます。現在のところ、ブラウザー上の Javascript はシングルスレッドであるため、その競合状態は Javascript インタープリター内に存在することはできません。(ただし、ワーカー スレッドは来ています — うわー!) しかし、理論的には、クリックが発生し、ブラウザーの非 Javascript UI スレッドによってキューに入れられ、その後 ajax が完了して要素を置き換え、キューに入れられた UI イベントが発生する可能性があります。処理され、要素が削除されて親がなくなったため、まったく発生しないか、バブルしません。ブラウザの実装に多く。オープン ソース ブラウザーで表示されている場合は、そのソースを調べて、インタープリターによる処理のために UI イベントをキューに入れることができます。しかし、それは、以下に示すように、イベント ハンドラー内のコードで要素を実際に削除することとは別の問題です。
does-bubbling-continue アスペクトの経験的結果:
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>