前端中如何阻止事件傳播
這次帶給大家前端如何阻止事件傳播,前端中阻止事件傳播的注意事項有哪些,以下就是實戰案例,一起來看一下。
做一個小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圖表繪製工具庫使用步驟詳解
以上是前端中如何阻止事件傳播的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)
![事件 ID 4660:已刪除物件 [修復]](https://img.php.cn/upload/article/000/887/227/168834320512143.png?x-oss-process=image/resize,m_fill,h_207,w_330)
我們的一些讀者遇到了事件ID4660。他們通常不確定該怎麼做,所以我們在本指南中解釋。刪除物件時通常會記錄事件ID4660,因此我們還將探索一些實用的方法在您的電腦上修復它。什麼是事件ID4660?事件ID4660與活動目錄中的物件相關,將由下列任一因素觸發:物件刪除–每當從ActiveDirectory中刪除物件時,都會記錄事件ID為4660的安全事件。手動變更–當使用者或管理員手動變更物件的權限時,可能會產生事件ID4660。變更權限設定、修改存取等級或新增或刪除人員或群組時,可能會發生這種情

在運行iOS16或更高版本的iPhone上,您可以直接在鎖定畫面上顯示即將到來的日曆事件。繼續閱讀以了解它是如何完成的。由於錶盤複雜功能,許多AppleWatch用戶習慣能夠看一眼手腕來查看下一個即將到來的日曆事件。隨著iOS16和鎖定螢幕小部件的出現,您可以直接在iPhone上查看相同的日曆事件訊息,甚至無需解鎖設備。日曆鎖定螢幕小元件有兩種風格,可讓您追蹤下一個即將發生的事件的時間,或使用更大的小元件來顯示事件名稱及其時間。若要開始新增小元件,請使用面容ID或觸控ID解鎖iPhone,長按

有時,基於多種原因,我們希望在MicrosoftEdge上封鎖某些網站,無論是出於家長控制,時間管理,內容過濾,甚至是安全問題。一個常見的動機是提高生產力並保持專注。透過阻止分散注意力的網站,人們可以創造一個有利於工作或學習的環境,最大限度地減少潛在的干擾。最後,內容過濾對於維護安全和尊重的線上環境非常重要。阻止包含露骨、冒犯性或令人反感內容的網站在教育或專業環境中尤其重要,在這些環境中,維護適當的標準和價值觀至關重要。如果您可以與這種情況相關,那麼本文適合您。以下介紹如何在Edge中封鎖對網

當輸入框中新增值時,就會發生oninput事件。您可以嘗試執行以下程式碼來了解如何在JavaScript中實現oninput事件-範例<!DOCTYPEhtml><html> <body> <p>Writebelow:</p> <inputtype="text"

jQuery是一個受歡迎的JavaScript函式庫,可以用來簡化DOM操作、事件處理、動畫效果等。在web開發中,常常會遇到需要對select元素進行改變事件綁定的情況。本文將介紹如何使用jQuery實作對select元素改變事件的綁定,並提供具體的程式碼範例。首先,我們需要使用標籤來建立一個包含選項的下拉式選單:

如何在閉包中阻止記憶體洩漏的發生?閉包是JavaScript中非常強大的特性之一,它能夠實現函數的巢狀和資料的封裝。然而,閉包也容易導致記憶體洩漏的問題,特別是在處理非同步和定時器的情況下。本文將介紹如何在閉包中阻止記憶體洩漏,並提供具體的程式碼範例。記憶體洩漏通常發生在不再需要某個物件時,卻因為某些原因無法釋放其所佔用的記憶體。在閉包中,當函數引用外部的變量,而這些變量

jquery中常用的事件有:1、window事件;2、滑鼠事件,是當使用者在文件上方移動或點選滑鼠時而產生的事件,包括滑鼠點選、移入事件、移出事件等;3、鍵盤事件,是使用者每次按下或釋放鍵盤上的按鍵時都會產生事件,包括按下按鍵事件、釋放按鍵按鍵等;4、表單事件,例如當元素獲得焦點時會觸發focus()事件,失去焦點時會觸發blur()事件,表單提交時會觸發submit()事件。

用光訓練神經網絡,清華成果最新登上了Nature!無法應用反向傳播演算法怎麼辦?他們提出了一種全前向模式(FullyForwardMode,FFM)的訓練方法,在實體光學系統中直接執行訓練過程,克服了傳統基於數位電腦模擬的限制。簡單點說,以前需要對物理系統進行詳細建模,然後在電腦上模擬這些模型來訓練網路。而FFM方法省去了建模過程,讓系統直接使用實驗數據進行學習和最佳化。這也意味著,訓練不需要再從後向前檢查每一層(反向傳播),而是可以直接從前向後更新網路的參數。打個比方,就像拼圖一樣,反向傳播
