Rumah >hujung hadapan web >tutorial js >Acara menggelegak di JavaScript? Penyebaran acara dijelaskan
Tetapi peristiwa menggelegak hanya satu keping teka -teki. Ia sering disebut bersama dengan penangkapan acara dan penyebaran acara. Dan pemahaman yang kukuh tentang ketiga -tiga konsep adalah penting untuk bekerja dengan peristiwa di JavaScript - contohnya jika anda ingin melaksanakan corak delegasi acara.
Dalam jawatan ini saya akan menerangkan setiap istilah ini dan menunjukkan bagaimana mereka sesuai bersama. Saya juga akan menunjukkan kepada anda bagaimana pemahaman asas mengenai aliran acara JavaScript dapat memberi anda kawalan halus ke atas permohonan anda. Sila ambil perhatian bahawa ini bukan primer pada peristiwa, oleh itu kebiasaan dengan topik itu diandaikan. Jika anda ingin mengetahui lebih lanjut mengenai peristiwa secara umum, mengapa tidak menyemak buku kami: JavaScript: Novice to Ninja.
Apakah penyebaran acara?
<span><span><span><ul</span>></span> </span> <span><span><span><li</span>></span><span><span><a</span> href<span>="..."</span>></span><span><span><img</span> src<span>="..."</span> alt<span>=""</span>></span><span><span></a</span>></span> </span> <span><span><span><li</span>></span><span><span><a</span> href<span>="..."</span>></span><span><span><img</span> src<span>="..."</span> alt<span>=""</span>></span><span><span></a</span>></span> </span> ... <span><span><span><li</span>></span><span><span><a</span> href<span>="..."</span>></span><span><span><img</span> src<span>="..."</span> alt<span>=""</span>></span><span><span></a</span>></span> </span><span><span><span></ul</span>></span> </span>Klik pada imej tidak hanya menjana acara klik untuk elemen IMG yang sepadan, tetapi juga untuk ibu bapa A, untuk datuk li dan sebagainya, pergi sepanjang jalan melalui semua nenek moyang unsur, sebelum menamatkan di objek tetingkap.
Dalam terminologi DOM, imej adalah sasaran acara , elemen paling dalam di mana klik itu berasal. Sasaran peristiwa, ditambah dengan nenek moyangnya, dari ibu bapanya ke objek tingkap, membentuk cawangan di Dom Tree. Sebagai contoh, di galeri imej, cawangan ini akan terdiri daripada nod: IMG, A, LI, UL, BODY, HTML, Dokumen, tetingkap.
Perhatikan bahawa tetingkap sebenarnya bukan node DOM tetapi ia melaksanakan antara muka EventTarget, jadi, untuk kesederhanaan, kami mengendalikannya seperti nod induk objek dokumen.
Cawangan ini penting kerana ia adalah jalan di mana peristiwa menyebarkan (atau aliran). Penyebaran ini adalah proses memanggil semua pendengar untuk jenis acara yang diberikan, yang dilampirkan pada nod di cawangan. Setiap pendengar akan dipanggil dengan objek acara yang mengumpulkan maklumat yang berkaitan dengan acara tersebut (lebih lanjut mengenai ini kemudian).
ingat bahawa beberapa pendengar boleh didaftarkan pada nod untuk jenis acara yang sama. Apabila penyebaran mencapai satu nod tersebut, pendengar dipanggil mengikut urutan pendaftaran mereka.
Ia juga harus diperhatikan bahawa penentuan cawangan adalah statik, iaitu, ia ditubuhkan pada penghantaran awal acara tersebut. Pengubahsuaian pokok yang berlaku semasa pemprosesan acara akan diabaikan.
Penyebaran adalah bidirectional, dari tingkap ke sasaran acara dan belakang. Penyebaran ini boleh dibahagikan kepada tiga fasa:
Apa yang membezakan fasa ini adalah jenis pendengar yang dipanggil.
Dalam fasa ini hanya penangkap pendengar dipanggil, iaitu, pendengar yang didaftarkan menggunakan nilai yang benar untuk parameter ketiga AddEventListener:
<span><span><span><ul</span>></span> </span> <span><span><span><li</span>></span><span><span><a</span> href<span>="..."</span>></span><span><span><img</span> src<span>="..."</span> alt<span>=""</span>></span><span><span></a</span>></span> </span> <span><span><span><li</span>></span><span><span><a</span> href<span>="..."</span>></span><span><span><img</span> src<span>="..."</span> alt<span>=""</span>></span><span><span></a</span>></span> </span> ... <span><span><span><li</span>></span><span><span><a</span> href<span>="..."</span>></span><span><span><img</span> src<span>="..."</span> alt<span>=""</span>></span><span><span></a</span>></span> </span><span><span><span></ul</span>></span> </span>
Jika parameter ini ditinggalkan, nilai lalai adalah palsu dan pendengar bukan penangkap.
Jadi, semasa fasa ini, hanya penangkap yang terdapat di jalan dari tingkap ke ibu bapa sasaran acara dipanggil.
Dalam fasa ini semua pendengar yang didaftarkan pada sasaran acara akan dipanggil, tanpa mengira nilai bendera tangkapan mereka.
Semasa fasa menggelegak hanya hanya kapten bukan kapten yang akan dipanggil. Iaitu, hanya pendengar yang berdaftar dengan nilai palsu untuk parameter ketiga addEventListener ():
el<span>.addEventListener('click', listener, true) </span>
Perhatikan bahawa walaupun semua peristiwa mengalir ke sasaran acara dengan fasa penangkapan, fokus, kabur, beban dan beberapa orang lain, jangan gelembung. Iaitu, perjalanan mereka berhenti selepas fasa sasaran .
Oleh itu, pada akhir penyebaran, setiap pendengar di cawangan telah dipanggil tepat sekali.Bubbling acara tidak berlaku untuk setiap jenis acara. Semasa penyebaran, ada kemungkinan pendengar untuk mengetahui sama ada peristiwa gelembung dengan membaca harta benda boolean objek acara.
Tiga fasa aliran acara digambarkan dalam rajah berikut dari spesifikasi W3C Uievents.
Mengakses Maklumat Penyebaran
Lihat pen JMXDPZ oleh SitePoint (@SitePoint) pada codepen.
Malah mungkin untuk mengklik di luar kotak: Dalam kes ini, sasaran acara akan menjadi badan atau elemen HTML, bergantung pada lokasi skrin klik.
Menghentikan Penyebaran
kita boleh menyemak tingkah laku ini dengan garpu mudah demo terdahulu, hanya memasukkan panggilan ke Stoppropagation () di salah satu pendengar. Di sini kami telah menyiapkan pendengar baru ini sebagai penangkap ke senarai panggilan balik yang didaftarkan di tetingkap:
<span><span><span><ul</span>></span> </span> <span><span><span><li</span>></span><span><span><a</span> href<span>="..."</span>></span><span><span><img</span> src<span>="..."</span> alt<span>=""</span>></span><span><span></a</span>></span> </span> <span><span><span><li</span>></span><span><span><a</span> href<span>="..."</span>></span><span><span><img</span> src<span>="..."</span> alt<span>=""</span>></span><span><span></a</span>></span> </span> ... <span><span><span><li</span>></span><span><span><a</span> href<span>="..."</span>></span><span><span><img</span> src<span>="..."</span> alt<span>=""</span>></span><span><span></a</span>></span> </span><span><span><span></ul</span>></span> </span>Dengan cara ini, kotak apa pun yang diklik, penyebaran berhenti lebih awal, hanya mencapai pendengar penangkap pada tetingkap.
Menghentikan penyebaran segera
<span><span><span><ul</span>></span> </span> <span><span><span><li</span>></span><span><span><a</span> href<span>="..."</span>></span><span><span><img</span> src<span>="..."</span> alt<span>=""</span>></span><span><span></a</span>></span> </span> <span><span><span><li</span>></span><span><span><a</span> href<span>="..."</span>></span><span><span><img</span> src<span>="..."</span> alt<span>=""</span>></span><span><span></a</span>></span> </span> ... <span><span><span><li</span>></span><span><span><a</span> href<span>="..."</span>></span><span><span><img</span> src<span>="..."</span> alt<span>=""</span>></span><span><span></a</span>></span> </span><span><span><span></ul</span>></span> </span>
Sekarang, tiada apa yang dikeluarkan dalam jadual log, tidak juga baris penangkap tetingkap C1 dan C2, kerana penyebaran berhenti selepas pelaksanaan pendengar baru.
Beberapa peristiwa dikaitkan dengan tindakan lalai yang dilaksanakan oleh pelayar pada akhir penyebaran. Sebagai contoh, klik pada elemen pautan atau klik pada butang hantar borang menyebabkan penyemak imbas menavigasi ke halaman baru, atau menyerahkan borang masing -masing.
Adalah mungkin untuk mengelakkan pelaksanaan tindakan lalai tersebut dengan pembatalan peristiwa, dengan memanggil satu lagi kaedah objek acara, E.PreventDefault, dalam pendengar.
Dengan itu, saya berharap dapat menunjukkan kepada anda bagaimana peristiwa menggelegak dan acara menangkap kerja di JavaScript. Jika anda mempunyai sebarang pertanyaan atau komen, saya gembira mendengarnya dalam perbincangan di bawah.
Artikel ini dikaji semula oleh Yaphi Berhanu dan Dominic Myers. Terima kasih kepada semua pengulas rakan sebaya SitePoint untuk membuat kandungan SitePoint yang terbaik boleh!
Apakah kelakuan lalai penyebaran peristiwa dalam JavaScript? Ini bermakna bahawa secara lalai, peristiwa akan bermula dari elemen sasaran dan gelembung sehingga akar dokumen. Walau bagaimanapun, anda boleh mengubah tingkah laku ini dengan menggunakan kaedah addEventListener () dengan parameter useCapture yang ditetapkan kepada benar, yang akan membolehkan penangkapan acara. Satu peristiwa dipecat dari elemen bersarang, acara itu akan menyebarkan melalui nenek moyang unsur bersarang di Dom Tree. Ini adalah peristiwa yang menggelegak. Setiap nenek moyang pada gilirannya mendapat peluang untuk bertindak balas terhadap acara tersebut. Penyebaran ini berterusan sehingga ia mencapai akar dokumen atau sehingga stoppropagation () dipanggil.
Atas ialah kandungan terperinci Acara menggelegak di JavaScript? Penyebaran acara dijelaskan. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!