我想在純Javascript中實現我自己的DnD - 首先用於學習目的 - 然後也許我會使用它 - 並且我偶然發現了這個泡沫/捕獲概念。我以爲我明白了,通過閱讀這個問題上接受的答案:What is event bubbling and capturing?,以及其他文章。捕獲階段與氣泡階段 - 爲什麼下面的代碼不會產生相同的結果?
但我沒有 - 因爲我無法解釋爲什麼這2段代碼不會產生相同的結果。
爲什麼我註冊這個事件的順序 - 很重要? 我認爲他們應該按照相同的順序被解僱 - 不管他們如何被註冊 - 按照捕獲/冒泡的規則。情況並非如此。
案例1:jsBin
案例2:also jsBin
案例3 - 這是first answer of the above mentioned question
的Html它是相同的:
<div id="div1">
div 1
<div id="div2">
div 2
<div id="div3">
div3
</div>
</div>
</div>
個
與外殼1 JS:
var div1 = document.querySelector("#div1");
var div2 = document.querySelector("#div2");
var div2 = document.querySelector("#div3");
/* div1 */
div1.addEventListener("click", function (event) {
log("capture phase: you clicked on div 1");
}, true);
div1.addEventListener("click", function (event) {
log("bubble phase: you clicked on div 1");
}, false);
/* div2 */
div2.addEventListener("click", function (event) {
log("capture phase: you clicked on div 2");
}, true);
div2.addEventListener("click", function (event) {
log("bubble phase: you clicked on div 2");
}, false);
/* div3 */
div3.addEventListener("click", function (event) {
log("capture phase: you clicked on div 3");
}, true);
div3.addEventListener("click", function (event) {
log("bubble phase: you clicked on div 3");
}, false);
var $log = $("#log");
function log(msg) {
$log.append('<p>' + msg + '</p>');
}
案例2 - 的javascript:
var div1 = document.querySelector("#div1");
var div2 = document.querySelector("#div2");
var div2 = document.querySelector("#div3");
/* capture events */
div1.addEventListener("click", function (event) {
log("capture phase: you clicked on div 1");
}, true);
div2.addEventListener("click", function (event) {
log("capture phase: you clicked on div 2");
}, true);
div3.addEventListener("click", function (event) {
log("capture phase: you clicked on div 3");
}, true);
/* bubbling events */
div1.addEventListener("click", function (event) {
log("bubble phase: you clicked on div 1");
}, false);
div2.addEventListener("click", function (event) {
log("bubble phase: you clicked on div 2");
}, false);
div3.addEventListener("click", function (event) {
log("bubble phase: you clicked on div 3");
}, false);
哪裏是在我的思想的謬論?我錯過了什麼?謝謝:)
在你聲明'變種div2'兩次兩個例子。 – DavidDomain
@DavidDomain哦不!你是對的! :))愚蠢的錯誤 - 如何處理這個問題 - 我可以刪除它嗎?所以尷尬.. :)) – AIon
@Alon - 不要擔心沒有人是完美的。這只是一個小例子經常被忽視的完美例子。 ;) – DavidDomain