我希望有人能幫助我理解爲什麼下面的情況失敗。我有一個父級ul標籤,它帶有一個事件處理程序,它爲嵌套在其中的另一個ul標籤中的給定後代li元素定義條件。標記是:祖先的事件處理程序可以停止其子元素事件之一的傳播嗎?
<ul id="outerUL">
<li>LIST ITEM 1</li>
<li>LIST ITEM 2</li>
<li>
<ul id="innerUL">
<li>LIST ITEM 3</li>
<li>LIST ITEM 4</li>
<li>
<ul id="inMostUL">
<li>LIST ITEM 5</li>
<li>LIST ITEM 6</li><!-- we condition for this element -->
<li>LIST ITEM 7</li>
</ul>
</li>
</ul>
</li>
</ul>
的JavaScript是:(似乎有條件.stopPropagation()在祖先調用失敗...)
var outerMostUL = document.getElementById("outerUL");
outerMostUL.addEventListener('click',
function(e){
if(e.target.innerHTML === "LIST ITEM 6"){
e.stopPropagation();
alert("you clicked LIST ITEM 6. Event travel stops.");
// return; // a return WILL work
}
// below runs if propagation continues...
alert("outerMostUL event handler fired!");
},
false);
現在,如果我決定把在一個不顯眼。在李標籤的addEventListener()調用,.stopPropagation()正常工作,如:
// A discreet event handler does work
var inMostUL = document.getElementById("inMostUL");
inMostUL.children[1].addEventListener('click', function(e){
e.stopPropagation();
alert("The descendent event fires, but stops now.");
});
所以我的問題是:你應該能夠在祖先的處理器使用條件給定的e.target和停止其前夕的傳播nt,如果冒泡被啓用?看起來,一個元素必須有自己的處理程序綁定來發起一個事件,但也許我混淆了傳播祖先鏈的傳播事件,實際上是通過該方法添加事件偵聽器。任何燈光脫落將不勝感激。我只是想通過簡單的例子來概念化js事件處理。感謝您對此的任何考慮。
爲更老的IE支持添加'e.cancelBubble = true;',除非您使用jQuery,在這種情況下,jQuery會爲您處理它。 – crush