Saya telah membaca artikel di https://developer.mozilla.org/en/DOM/element.addEventListener tetapi tidak dapat memahami useCapture
atribut. Definisi ada:
Jika benar, useCapture menunjukkan bahwa pengguna ingin memulai penangkapan. Setelah memulai penangkapan, semua peristiwa dengan tipe yang ditentukan akan dikirim ke pendengar terdaftar sebelum dikirim ke EventTarget di bawahnya di pohon DOM. Acara yang menggelegak ke atas melalui pohon tidak akan memicu pendengar yang ditunjuk untuk menggunakan tangkapan.
Dalam kode ini peristiwa induk memicu sebelum anak, jadi saya tidak dapat memahami perilakunya. Objek dokumen memiliki usecapture true dan div anak telah usecapture set false dan dokumen usecapture diikuti. Jadi mengapa properti dokumen lebih disukai daripada anak.
function load() {
document.addEventListener("click", function() {
alert("parent event");
}, true);
document.getElementById("div1").addEventListener("click", function() {
alert("child event");
}, false);
}
<body onload="load()">
<div id="div1">click me</div>
</body>
sumber
no specification is made as to the order in which they will receive the event with regards to the other EventListeners on the EventTarget
. Saya belum menguji semua browser, jadi mereka semua bisa saja menerapkannya dengan cara yang sama. Namun, acara tangkap akan dilakukan sebelum acara yang tidak diambil.Saya menemukan diagram ini sangat berguna untuk memahami fase penangkapan / target / gelembung: http://www.w3.org/TR/2003/NOTE-DOM-Level-3-Events-20031107/events.html#Events-phases
Di bawah, konten diekstraksi dari tautan.
Fase
Acara ini dikirim mengikuti jalur dari akar pohon ke simpul target ini. Kemudian dapat ditangani secara lokal di tingkat simpul target atau dari leluhur target mana pun yang lebih tinggi di pohon. Acara pengiriman (juga disebut propagasi acara) terjadi dalam tiga fase dan urutan berikut:
Nenek moyang target ditentukan sebelum pengiriman awal acara. Jika node target dihapus selama pengiriman, atau leluhur target ditambahkan atau dihapus, propagasi acara akan selalu didasarkan pada node target dan leluhur target ditentukan sebelum pengiriman.
Beberapa peristiwa mungkin tidak perlu mencapai tiga fase dari aliran peristiwa DOM, misalnya acara hanya dapat didefinisikan untuk satu atau dua fase. Sebagai contoh, peristiwa yang ditentukan dalam spesifikasi ini akan selalu mencapai fase penangkapan dan target tetapi beberapa tidak akan mencapai fase gelembung ("peristiwa gelembung" versus "peristiwa non-gelembung", lihat juga atribut Event.bubbles).
sumber
Window
, bukandocument
, karenadocument
anak itu berasalWindow
?Capture Event (
useCapture = true
) vs Bubble Event (useCapture = false
)Referensi MDN
useCapture
parameter tidak masalah (Terima kasih @bam dan @ legend80s)stopPropagation()
akan menghentikan aliranDemo
Hasil:
Target Bubble 1
(Karena Capture dan Bubble of Target akan memicu dalam urutan mereka terdaftar, jadi Bubble event memicu sebelum acara Capture)
Capture Target
sumber
Events in the target phase will trigger all listeners on an element in the order they were registered, regardless of the useCapture parameter.
Dari developer.mozilla.org/en-US/docs/Web/API/EventTarget/… . Jadi tidak ada fase "Children Capture" dan "Children Bubble".Ketika Anda mengatakan useCapture = true, Event mengeksekusi atas ke bawah pada fase penangkapan ketika false itu melakukan bubble bottom to top.
sumber
Ini semua tentang model acara: http://www.w3.org/TR/DOM-Level-2-Events/events.html#Events-flow Anda dapat menangkap acara dalam fase menggelegak atau dalam fase menangkap. Pilihanmu.
Lihatlah http://www.quirksmode.org/js/events_order.html - Anda akan menemukannya sangat berguna.
sumber
Contoh kode:
Kode Javascript:
jika keduanya disetel ke false
Menjalankan: Onclicking Inner Div, peringatan ditampilkan sebagai: Div 2> Div 1
Di sini skrip dieksekusi dari elemen dalam: Gelembung Peristiwa (useCapture telah disetel ke false)
div 1 disetel ke true dan div 2 disetel ke false
Menjalankan: Onclicking Inner Div, peringatan ditampilkan sebagai: Div 1> Div 2
Di sini skrip dieksekusi dari leluhur / elemen luar: Pengambilan Acara (useCapture telah disetel ke true)
div 1 disetel ke false dan div 2 disetel ke true
Menjalankan: Onclicking Inner Div, peringatan ditampilkan sebagai: Div 2> Div 1
Di sini skrip dieksekusi dari elemen dalam: Gelembung Peristiwa (useCapture telah disetel ke false)
div 1 disetel ke true dan div 2 disetel ke true
Menjalankan: Onclicking Inner Div, peringatan ditampilkan sebagai: Div 1> Div 2
Di sini skrip dieksekusi dari elemen leluhur / luar: Pengambilan Acara sejak useCapture telah disetel ke true
sumber
Ringkasan:
The
DOM
spesifikasi yang dijelaskan dalam:https://www.w3.org/TR/2003/NOTE-DOM-Level-3-Events-20031107/events.html#Events-phases
bekerja dengan cara berikut:
Suatu peristiwa dikirim mengikuti jalur dari root (
document
) dari pohon ke node target . Node target adalahHTML
elemen yang paling dalam , yaitu event.target. Acara pengiriman (juga disebut propagasi acara) terjadi dalam tiga fase dan urutan berikut:document
) ke induk langsung dari simpul target.html
elemen terdalam tempat acara tersebut diberhentikan.Contoh:
Contoh di atas benar-benar menggambarkan perbedaan antara bubbling acara dan penangkapan acara. Saat menambahkan acara dengan pendengar
addEventListener
, ada elemen ketiga yang disebut useCapture. Iniboolean
yang ketika diatur untuktrue
memungkinkan pendengar acara untuk menggunakan menangkap acara, bukan menggelegak acara.Dalam contoh kita ketika kita mengatur argumen useCapture untuk
false
kita melihat bahwa peristiwa itu terjadi. Pertama acara di fase target dipecat (log innerBubble), dan kemudian melalui acara menggelegak acara di elemen induk dipecat (log outerBubble).Ketika kita mengatur argumen useCapture untuk
true
kita melihat bahwa peristiwa di luar<div>
dipecat terlebih dahulu. Ini karena acara sekarang dipecat dalam fase menangkap dan bukan fase menggelegak.sumber
Diberikan tiga fase perjalanan acara :
useCapture
menunjukkan fase perjalanan acara akan berada pada:Sumber adalah sama dengan jawaban terbaik kedua: https://www.w3.org/TR/2003/NOTE-DOM-Level-3-Events-20031107/events.html#Events-phases
sumber
Urutan definisi hanya penting jika item berada pada level yang sama. Jika Anda membalik urutan definisi dalam kode Anda, Anda akan mendapatkan hasil yang sama.
Namun, jika Anda membalikkan pengaturan useCapture pada dua penangan peristiwa, penangan peristiwa anak merespons sebelum orang tua. Alasan untuk ini adalah bahwa pengendali event anak sekarang akan dipicu pada fase penangkapan yang sebelum fase gelembung di mana pengendali event induk akan dipicu.
Jika Anda mengatur useCapture menjadi true untuk kedua penangan acara - terlepas dari urutan definisi - penangan peristiwa induk akan dipicu terlebih dahulu karena itu datang sebelum anak dalam fase menangkap.
Sebaliknya, jika Anda menetapkan useCapture ke false untuk kedua penangan acara - lagi-lagi terlepas dari urutan definisi - penangan peristiwa anak akan dipicu terlebih dahulu karena itu datang sebelum induk dalam fase menggelegak.
sumber