Baru-baru ini, saya sedang mengkaji dengan mendalam isu yang berkaitan dengan penangkapan dan menggelegak peristiwa:
Saya mempunyai pemahaman ini, saya tidak tahu sama ada ia betul, anda boleh lihat.
Mekanisme penyebaran acara dibahagikan kepada tiga peringkat: peringkat tangkapan, peringkat mencapai sasaran dan peringkat menggelegak. Saya fikir tujuan mekanisme penyebaran ini adalah untuk memantau sama ada sesuatu peristiwa itu berlaku, jenis peristiwa itu berlaku dan di mana peristiwa itu berlaku. Apa yang dipanggil tangkapan peristiwa bermakna penyemak imbas sedang mencari sama ada sesuatu peristiwa telah berlaku Bagi masa pemprosesan selepas peristiwa itu berlaku, ia dicapai dengan mendaftarkan fungsi pemprosesan acara dan parameter terakhir addEventListener().
Tetapi jika saya mengikuti idea ini, saya akan mengalami masalah sedemikian.
Sebagai contoh, saya mempunyai sekeping kod seperti ini
<p>
<a id="btn" href="http://www.baidu.com/">
button
</a>
</p>
<script>
var btn=document.getElementById('btn');
var disableClickHandler = function(event){
console.log('1');
event.preventDefault();
event.stopPropagation();
};
document.removeEventListener('click',disableClickHandler,true);
btn.onclick = function () {
console.log('success');
}
</script>
Saya menggunakan kaedah tangkapan untuk mengendalikan acara, dan menghalang acara daripada terus disebarkan dalam fungsi pengendalian acara. Ini kelihatan semula jadi, tetapi soalan saya ialah, jika acara itu telah berhenti disebarkan, bagaimanakah penyemak imbas tahu di mana peristiwa itu berlaku? Bagaimanakah ia mengetahui bahawa sesuatu peristiwa telah berlaku? Jika ia tidak mengetahui bahawa peristiwa telah berlaku, bagaimanakah ia boleh melaksanakan pengendali acara yang sepadan?
Konflik anda disebabkan oleh pemahaman yang salah tentang fasa tangkapan. Jangan risau dengan namanya. Menangkap dan menggelegak berada pada tahap yang sama. Jadi gangguan peristiwa terganggu semasa proses penyebaran, bukan sebelum penyebaran.
Jika anda bercakap tentang bagaimana untuk mendapatkannya. Saya rasa jawapannya terletak pada JavaScript Event Loop
Pautan: https://developer.mozilla.org...
Kod tersebut dilaksanakan oleh penyemak imbas untuk anda, acara itu dikesan oleh penyemak imbas, dan kemudian penyemak imbas membantu anda melaksanakan acara yang anda tentukan.
Jadi anda bertanya bagaimana penyemak imbas tahu?
Ini kerana JavaScript ialah bahasa arahan. Iaitu, setiap pernyataan JavaScript yang anda tulis ialah arahan untuk memberitahu penyemak imbas untuk melakukan sesuatu Contohnya, document.getElementById() yang paling mudah sebenarnya memberitahu penyemak imbas untuk mendapatkan DOM yang berkaitan, bukannya JavaScript itu sendiri. Begitu juga dengan pengendalian acara.
Klik untuk melaksanakan
disableClickHandler
, menghalang acara daripada merebak, jadi...Ia tidak mahu tahu.
Itu pun tak tahu.
Malas katanya.