Apa perbedaan antara peristiwa yang menggelegak dan menangkap? Kapan sebaiknya menggunakan bubbling vs capturing?
javascript
dom-events
event-bubbling
Arun P Johny
sumber
sumber
Jawaban:
Gelembung dan penangkapan peristiwa adalah dua cara propagasi acara di API HTML DOM, ketika suatu peristiwa terjadi dalam suatu elemen di dalam elemen lain, dan kedua elemen telah mendaftarkan pegangan untuk peristiwa itu. Mode propagasi acara menentukan urutan elemen yang menerima acara .
Dengan menggelegak, acara pertama-tama ditangkap dan ditangani oleh elemen paling dalam dan kemudian disebarkan ke elemen luar.
Dengan menangkap, acara pertama-tama ditangkap oleh elemen terluar dan disebarkan ke elemen dalam.
Menangkap juga disebut "trickling", yang membantu mengingat urutan propagasi:
Kembali di masa lalu, Netscape menganjurkan penangkapan acara, sementara Microsoft mempromosikan acara bubbling. Keduanya adalah bagian dari Acara Model Objek Dokumen W3C (2000).
IE <9 hanya menggunakan event bubbling , sedangkan IE9 + dan semua browser utama mendukung keduanya. Di sisi lain, kinerja peristiwa menggelegak mungkin sedikit lebih rendah untuk DOM kompleks.
Kita dapat menggunakan
addEventListener(type, listener, useCapture)
untuk mendaftarkan pengendali acara baik dalam mode menggelegak (default) atau menangkap. Untuk menggunakan model penangkapan, lewati argumen ketiga sebagaitrue
.Contoh
Dalam struktur di atas, asumsikan bahwa peristiwa klik terjadi di
li
elemen.Dalam menangkap model, acara akan ditangani oleh yang
div
pertama (klik penangan acara didiv
api akan pertama), kemudian diul
, kemudian pada yang terakhir di elemen target,li
,.Dalam model bubbling, kebalikannya akan terjadi: acara akan pertama-tama ditangani oleh
li
, kemudian olehul
, dan akhirnya olehdiv
elemen.Untuk informasi lebih lanjut, lihat
Dalam contoh di bawah ini, jika Anda mengklik salah satu elemen yang disorot, Anda dapat melihat bahwa fase penangkapan dari aliran propagasi acara terjadi terlebih dahulu, diikuti oleh fase menggelegak.
Contoh lain di JSFiddle .
sumber
useCapture
sekarang didukung di IE> = 9. sumbertriclkling
sama dengancapturing
? Pembicaraan Crockford dalam pembicaraanTrickling v. Bubbling
video ini - youtube.com/watch?v=Fv9qT9joc0M&list=PL7664379246A246CB sekitar1 hr 5 minutes
.trickle down
=>onElement
=>bubble up
Deskripsi:
quirksmode.org memiliki deskripsi yang bagus tentang ini. Singkatnya (disalin dari quirksmode):
Apa yang harus digunakan?
Itu tergantung pada apa yang ingin Anda lakukan. Tidak ada yang lebih baik. Perbedaannya adalah urutan pelaksanaan penangan acara. Sebagian besar waktu akan baik-baik saja untuk memecat event handler dalam fase menggelegak tetapi juga bisa diperlukan untuk memecat mereka lebih awal.
sumber
Jika ada dua elemen elemen 1 dan elemen 2. Elemen 2 ada di dalam elemen 1 dan kami lampirkan event handler dengan kedua elemen tersebut, misalkan onClick. Sekarang ketika kita klik pada elemen 2 maka eventHandler untuk kedua elemen akan dieksekusi. Sekarang di sini pertanyaannya adalah urutan acara yang akan dieksekusi. Jika acara yang dilampirkan dengan elemen 1 dieksekusi terlebih dahulu itu disebut peristiwa menangkap dan jika acara terlampir dengan elemen 2 dieksekusi pertama ini disebut peristiwa bubbling. Sesuai W3C acara akan dimulai pada fase menangkap hingga mencapai target kembali ke elemen dan kemudian mulai menggelegak
Status menangkap dan menggelegak dikenal oleh parameter useCapture dari metode addEventListener
Secara Default useCapture salah. Itu berarti berada dalam fase menggelegak.
Silakan coba dengan mengubah benar dan salah.
sumber
the event will start in the capturing phase untill it reaches the target comes back to the element and then it starts bubbling
. Saya hanya menemukan addEventListener memiliki parameteruseCapture
yang dapat disetel ke true atau false; dan dalam HTML 4.0, pendengar acara ditetapkan sebagai atribut elemen danuseCapture defaults to false
. Bisakah Anda menautkan ke spesifikasi yang mengkonfirmasi apa yang Anda tulis?Saya menemukan tutorial ini di javascript.info sangat jelas dalam menjelaskan topik ini. Dan ringkasan 3 poinnya di akhir benar-benar berbicara dengan poin-poin penting. Saya kutip di sini:
sumber
Ada juga
Event.eventPhase
properti yang dapat memberi tahu Anda apakah acara tersebut sesuai target atau berasal dari tempat lain.Perhatikan bahwa kompatibilitas browser belum ditentukan. Saya mengujinya di Chrome (66.0.3359.181) dan Firefox (59.0.3) dan didukung di sana.
Memperluas potongan yang sudah bagus dari jawaban yang diterima , ini adalah output menggunakan
eventPhase
propertisumber
Bual
Menangkap
sumber