首頁 web前端 js教程 前端中如何阻止事件傳播

前端中如何阻止事件傳播

May 24, 2018 am 11:01 AM
事件 傳播 阻止

這次帶給大家前端如何阻止事件傳播,前端中阻止事件傳播的注意事項有哪些,以下就是實戰案例,一起來看一下。

做一個小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=&#39;wrapper&#39;>
    <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上面,等待用戶下次點擊在執行。

總結:

  1. 同時監聽buttondocument,點啥都沒反應,因為兩個函數都執行了,用阻止事件傳播解決了,比較浪費記憶體

  2. 好一定的方法是用jQuery 做,點擊button後在監聽document,關閉了就不再監聽,不阻止事件傳播,點啥也沒反應,兩種解決方法:一種是阻止事件傳播,另一種是添加一個setTimeout()函數。

相信看了本文案例你已經掌握了方法,更多精彩請關注php中文網其它相關文章!

推薦閱讀:

React-router v4使用步驟詳解

Chart.js輕量級圖表庫使用案例解析

Chart.js 輕量級HTML5圖表繪製工具庫使用步驟詳解

以上是前端中如何阻止事件傳播的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

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

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

事件 ID 4660:已刪除物件 [修復] 事件 ID 4660:已刪除物件 [修復] Jul 03, 2023 am 08:13 AM

我們的一些讀者遇到了事件ID4660。他們通常不確定該怎麼做,所以我們在本指南中解釋。刪除物件時通常會記錄事件ID4660,因此我們還將探索一些實用的方法在您的電腦上修復它。什麼是事件ID4660?事件ID4660與活動目錄中的物件相關,將由下列任一因素觸發:物件刪除–每當從ActiveDirectory中刪除物件時,都會記錄事件ID為4660的安全事件。手動變更–當使用者或管理員手動變更物件的權限時,可能會產生事件ID4660。變更權限設定、修改存取等級或新增或刪除人員或群組時,可能會發生這種情

在iPhone鎖定畫面上取得即將到來的日曆事件 在iPhone鎖定畫面上取得即將到來的日曆事件 Dec 01, 2023 pm 02:21 PM

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

如何在 Edge 中阻止對網站的訪問 如何在 Edge 中阻止對網站的訪問 Jul 12, 2023 am 08:17 AM

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

在JavaScript中,'oninput'事件的用途是什麼? 在JavaScript中,'oninput'事件的用途是什麼? Aug 26, 2023 pm 03:17 PM

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

jQuery中如何實作select元素的改變事件綁定 jQuery中如何實作select元素的改變事件綁定 Feb 23, 2024 pm 01:12 PM

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

閉包中如何有效避免記憶體洩漏? 閉包中如何有效避免記憶體洩漏? Jan 13, 2024 pm 12:46 PM

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

jquery中常用的事件有哪些 jquery中常用的事件有哪些 Jan 03, 2023 pm 06:13 PM

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

清華光學 AI 登 Nature!物理神經網絡,反向傳播不需要了 清華光學 AI 登 Nature!物理神經網絡,反向傳播不需要了 Aug 10, 2024 pm 10:15 PM

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

See all articles