前端中如何阻止事件传播
这次给大家带来前端中如何阻止事件传播,前端中阻止事件传播的注意事项有哪些,下面就是实战案例,一起来看一下。
做一个小demo,点击按钮出现浮层,点击其它地方关闭浮层,写一个简单css
<style> .wrapper{ position:relative; display:inline-block; } .popover{ position:absolute; border:1px solid red; left:100%; top:0; padding:10px; margin-left:10px; background:white; display: none; /*默认隐藏*/ } .popover::before{ position:absolute; content:''; top:5px; right:100%; border:10px solid transparent; border-right-color:red; } .popover::after{ position:absolute; content:''; top:5px; right:100%; border:10px solid transparent; border-right-color:white; margin-right:-1px; } </style> <p id="wrapper" class='wrapper'> <button id="clickMe">点我</button> <p id="popover" class="popover"> <input type="checkbox">浮层 </p> </p> <script> clickMe.addEventListener('click',function(){ popover.style.display = 'block'; }); </script>
那现在我要点击页面空白地方关闭呢?该用什么方法,很容易想到监听文档,如下代码
document.addEventListener('click',function(){ popover.stely.display = 'none'; });
但是实际上这样写了之后,按钮都失效了,怎么点都没有反应。这是为什么呢?
理解上一篇讲的捕获和冒泡事件后就很好理解这点了,可以[]()。
我们没有指定监听是在捕获还是冒泡阶段,浏览器默认是冒泡阶段,当我们点击按钮时,捕获阶段没有发生什么时候,但是冒泡阶段就不一样了,首先button
上函数先触发,然后document
上函数也触发了,导致准备出现的浮层又被隐藏了。
那你可能要问,button
上的事件执行了没?其实这两个事件都执行了,只是时间太短,浏览器默认一起执行了,可以在里面加一个debugger
,就可以看到了。
clickMe.addEventListener('click',function(){ popover.style.display = 'block'; });
那该怎么解决呢?最简单的方法是,除了要执行popover.style.display = 'block'
,还要阻止事件传播
clickMe.addEventlistener('click',function(){ popover.style.display = 'block'; }); popover.addEventListener('click',function(e){ e.stopPropagation(); });
这里为什么添加在按钮的父元素上面呢?如果不添加在父元素上面,点击浮层的时候,浮层也会被关闭。
如果页面上有很多监听器的话,这个方法是比较浪费内存的,比较省内存的方法用JQuery 做
$(clickMe).on('click',function(){ $(popover).show(); $(document).one('click',function(){ $(popover).hide(); }); }); $(wrapper).on('click',function(e){ e.stopPropagation(); })
一开始不监听,只在popover
`show`的时候监听一次,马上关掉,这叫做清理战场。$(wrapper).on('click',false)
和下面的代码完全等价
$(wrapper).on('click',function(e){ e.preventDefault(); //阻止默认事件 e.stopPropagation(); //阻止传播 })
但是如果页面中有checkbox
,你在它的父元素任何一层,包括checkbox
自己,添加了组织默认事件那么这个checkbox
就没办法被check
。
这里有个问题,如果没有阻止事件传播,向下面这样,会发生什么事情呢?
$(clickMe).on('click',function(){ $(popover).show(); $(document).one('click',funtion(){ $(popover).hide(); }); });
当然了,和之前一样,什么事情也不会发生,那当我点击按钮之后里面都发生了那些事情呢?
当我点击了按钮之后,它会做两件事情,首先把popover
`show出来,然后把
hide函数添加到
document上面,当事件传播到
document`,就会又把它给隐藏了。
可以给它添加一个setTimeout()
函数来解决这个问题
$(clickMe).on('click',function(){ $(popover).show(); setTimeout(function(){ $(document).one('click',function(){ $(popover).hide(); }) },0) });
setTimeout(fn,0)
这个0
不是马上执行,而是尽快执行,具体是在冒泡结束在执行这里的函数,也就是说,当冒泡结束后,在把监听事件添加到document
上面,等待用户下次点击在执行。
总结:
同时监听
button
和document
,点啥都没反应,因为两个函数都执行了,用阻止事件传播解决了,比较浪费内存好一定的方法是用jQuery 做,点击
button
后在监听document
,关闭了就不再监听,不阻止事件传播,点啥也没反应,两种解决方法:一种是阻止事件传播,另一种是添加一个setTimeout()
函数。
相信看了本文案例你已经掌握了方法,更多精彩请关注php中文网其它相关文章!
推荐阅读:
Chart.js 轻量级HTML5图表绘制工具库使用步骤详解
Atas ialah kandungan terperinci 前端中如何阻止事件传播. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

Video Face Swap
Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas


![ID Peristiwa 4660: Objek dipadamkan [Betulkan]](https://img.php.cn/upload/article/000/887/227/168834320512143.png?x-oss-process=image/resize,m_fill,h_207,w_330)
Sesetengah pembaca kami menemui ID4660 acara. Mereka sering tidak pasti apa yang perlu dilakukan, jadi kami menerangkannya dalam panduan ini. ID Peristiwa 4660 biasanya dilog apabila objek dipadamkan, jadi kami juga akan meneroka beberapa cara praktikal untuk membetulkannya pada komputer anda. Apakah acara ID4660? ID Peristiwa 4660 berkaitan dengan objek dalam Direktori Aktif dan akan dicetuskan oleh mana-mana faktor berikut: Pemadaman Objek – Peristiwa keselamatan dengan ID Peristiwa 4660 direkodkan apabila objek dipadamkan daripada Direktori Aktif. Perubahan manual – ID Peristiwa 4660 mungkin dijana apabila pengguna atau pentadbir menukar kebenaran objek secara manual. Ini boleh berlaku apabila menukar tetapan kebenaran, mengubah suai tahap akses atau menambah atau mengalih keluar orang atau kumpulan

Pada iPhone yang menjalankan iOS 16 atau lebih baru, anda boleh memaparkan acara kalendar akan datang terus pada skrin kunci. Baca terus untuk mengetahui cara ia dilakukan. Terima kasih kepada komplikasi muka jam tangan, ramai pengguna Apple Watch sudah terbiasa melihat pergelangan tangan mereka untuk melihat acara kalendar yang akan datang. Dengan kemunculan iOS16 dan widget skrin kunci, anda boleh melihat maklumat acara kalendar yang sama terus pada iPhone anda tanpa membuka kunci peranti. Widget Skrin Kunci Kalendar datang dalam dua perisa, membolehkan anda menjejaki masa acara akan datang yang seterusnya, atau menggunakan widget yang lebih besar yang memaparkan nama acara dan masanya. Untuk mula menambah widget, buka kunci iPhone anda menggunakan Face ID atau Touch ID, tekan dan tahan

Kadangkala, kami ingin menyekat tapak web tertentu di Microsoft Edge atas pelbagai sebab, sama ada untuk kawalan ibu bapa, pengurusan masa, penapisan kandungan, atau juga kebimbangan keselamatan. Motivasi biasa adalah untuk menjadi lebih produktif dan kekal fokus. Dengan menyekat tapak web yang mengganggu, orang ramai boleh mewujudkan persekitaran yang kondusif untuk bekerja atau belajar, meminimumkan potensi gangguan. Akhir sekali, penapisan kandungan adalah penting untuk mengekalkan persekitaran dalam talian yang selamat dan menghormati. Menyekat tapak web yang mengandungi kandungan eksplisit, menyinggung perasaan atau tidak menyenangkan adalah amat penting dalam tetapan pendidikan atau profesional di mana menegakkan standard dan nilai yang sesuai adalah penting. Jika anda boleh mengaitkan dengan situasi ini, artikel ini adalah untuk anda. Begini cara untuk menyekat akses kepada Internet di Edge

Apabila nilai ditambah pada kotak input, peristiwa oninput berlaku. Anda boleh cuba menjalankan kod berikut untuk memahami cara melaksanakan acara oninput dalam JavaScript - Contoh<!DOCTYPEhtml><html> <body> <p>Tulis di bawah:</p> <inputtype="text"

jQuery ialah perpustakaan JavaScript popular yang boleh digunakan untuk memudahkan manipulasi DOM, pengendalian acara, kesan animasi, dll. Dalam pembangunan web, kami sering menghadapi situasi di mana kami perlu menukar pengikatan acara pada elemen terpilih. Artikel ini akan memperkenalkan cara menggunakan jQuery untuk mengikat acara perubahan elemen terpilih, dan memberikan contoh kod khusus. Pertama, kita perlu mencipta menu lungsur dengan pilihan menggunakan label:

Peristiwa yang biasa digunakan dalam jquery ialah: 1. Peristiwa tetingkap; 2. Peristiwa tetikus, yang merupakan peristiwa yang dijana apabila pengguna menggerakkan atau mengklik tetikus pada dokumen, termasuk klik tetikus, peristiwa pindah masuk, peristiwa pindah keluar, dsb.; 3. Acara papan kekunci, Peristiwa dijana setiap kali pengguna menekan atau melepaskan kekunci pada papan kekunci, termasuk peristiwa penekan kekunci, peristiwa pelepasan kekunci, dsb. peristiwa akan dicetuskan, dan apabila ia kehilangan fokus, peristiwa blur() dicetuskan dan peristiwa submit() dicetuskan apabila borang diserahkan.

Bagaimana untuk mengelakkan kebocoran memori dalam penutupan? Penutupan ialah salah satu ciri yang paling berkuasa dalam JavaScript, yang membolehkan sarang fungsi dan enkapsulasi data. Walau bagaimanapun, penutupan juga terdedah kepada kebocoran memori, terutamanya apabila berurusan dengan tak segerak dan pemasa. Artikel ini menerangkan cara untuk mengelakkan kebocoran memori dalam penutupan dan menyediakan contoh kod khusus. Kebocoran memori biasanya berlaku apabila objek tidak lagi diperlukan tetapi memori yang didudukinya tidak dapat dilepaskan atas sebab tertentu. Dalam penutupan, apabila fungsi merujuk kepada pembolehubah luaran, dan pembolehubah ini

Bagaimana untuk melaksanakan fungsi kalendar dan peringatan acara dalam projek PHP? Fungsi kalendar dan peringatan acara adalah salah satu keperluan biasa semasa membangunkan aplikasi web. Sama ada pengurusan jadual peribadi, kerjasama pasukan atau penjadualan acara dalam talian, fungsi kalendar boleh menyediakan pengurusan masa dan pengaturan transaksi yang mudah. Melaksanakan fungsi kalendar dan peringatan acara dalam projek PHP boleh diselesaikan melalui langkah berikut. Reka bentuk pangkalan data Pertama, anda perlu mereka bentuk jadual pangkalan data untuk menyimpan maklumat tentang acara kalendar. Reka bentuk ringkas boleh mengandungi medan berikut: id: unik untuk acara tersebut
