e.preventDefault()和e.stopPropagation()以及return false的作用和區別

来源:https://www.cnblogs.com/sqh17/archive/2018/02/07/8427283.html
-Advertisement-
Play Games

前段時間開發中,遇到一個父元素和子元素都有事件時,發現會出現事件冒泡現象,雖然知道ev.stopPropagation()和ev.stopPropagation()其中一個是阻止事件冒泡,卻不知ev.preventDefault()和ev.stopPropagation()以及return fals ...


前段時間開發中,遇到一個父元素和子元素都有事件時,發現會出現事件冒泡現象,雖然知道ev.stopPropagation()和ev.preventDefault()其中一個是阻止事件冒泡,卻不知ev.preventDefault()和ev.stopPropagation()以及return false之間的區別,於是閑了就學了一下。

在此之前,先複習一下事件機制。
dom事件通常會有三種情況:
捕獲階段:從外向里依次查找元素。
目標階段:從當前事件源本身的操作
冒泡階段:從內到外依次觸發相關的行為。

如下圖可以得知標準事件觸發情況(借Lazymr博主的圖一用):

從圖中可知,有些情況我們不讓父元素觸發子元素所帶來的事件。所以ev.preventDefault()和ev.stopPropagation()以及return false就出來了。

ev.preventDefault():

這個是阻止預設行為觸發,什麼是預設行為,即標簽屬性本身具備的功能。就是類似與a標簽所帶的href和submit所帶的提交等等。
對於預設行為,瀏覽器優先實行事件函數後實行預設行為。

<body>
 <a href="http://www.baidu.com" onclick="btn()">點擊</a>
 <script type="text/javascript">
    document.querySelector('a').onclick = function (ev) {
    alert('警告!');
    ev.preventDefault();
    }
 </script>
</body>

出現的結果是:只彈出警告的彈窗,之後沒有跳轉到百度頁面。

相容性處理

function stopDefault( e ) { 
   if ( e && e.preventDefault ){ 
    e.preventDefault();  //支持DOM標準的瀏覽器
   } else { 
    window.event.returnValue = false;  //IE
   } 
}

ev.stopPropagation()

阻止事件冒泡。什麼是事件冒泡;上一個圖片已經解釋清楚了。事件可以在各層級的節點中傳遞,不管是冒泡還是捕獲,有時我們希望事件在特定節點執行完之後不再傳遞,可以使用事件對象的 ev.stopPropagation() 方法。

<body>
    <br />
    <div id="parent" onclick="console.log(this.id)">
         <p>parent</p>
         <div id="child" onclick="doSomething(this,event);">
              <p>child</p>
         </div>
    </div>
    <script type="text/javascript">
        function doSomething(obj, ev){
            console.log(obj.id)
        }
    </script>
</body>

點擊child的結果會觸發事件冒泡。結果如下:

如果要實現只出現child,那麼就要用到ev.stopPropagation() 了。

<body>
    <br />
    <div id="parent" onclick="console.log(this.id)">
         <p>parent</p>
         <div id="child" onclick="doSomething(this,event);">
              <p>child</p>
         </div>
    </div>
    <script type="text/javascript">
        function doSomething(obj, ev){
            console.log(obj.id);
            ev.stopPropagation();
        }
    </script>
</body>

結果如下:點擊child只出現child。

這個有相容性, IE8 及以前版本都不支持,IE 的事件對象包含特有的屬性 cancelBubble,只要將它賦值為 true 即可阻止事件繼續。ie下可以用這個ev.cancelBubble=true。
可以封裝成一個函數:

function stopBubble(ev) {
    var ev=ev||window.event
    if(window.event) {
        ev.cancelBubble=true;   //ie阻止冒泡
    }else {
        ev.stopPropagation();   //其他瀏覽器組織冒泡        
    }
}        

return false 

包含特有退出執行 return false 之後的所有觸發事件和動作都不會被執行,有時候 return false 可以用來替代 stopPropagation() 和 preventDefault()來阻止預設行為發生和冒泡。

<body>
    <br />
    <div>
         <a href="http://www.baidu.com">點擊</a>
    </div>
    <script type="text/javascript">
        document.querySelector('a').onclick=function(){
            alert('警告');
            return false;
        }
    </script>
</body>

結果是 只出現警告的彈窗,但沒有跳轉到百度頁面。
如果將return false放到alert('警告')前面 。結果會是什麼都不顯示,原因是return false提到了終止事件和預設行為。

return false和ev.stopPropagation()的區別是:

return false不僅阻止了冒泡而且還阻止了事件本身。
ev.stopPropagation()只阻止了冒泡。

註意:雖然return false能夠替代前兩個阻止預設行為和冒泡,但是也有其他作用,比如終止迴圈等等,所以會有意想不到的結果,因此能用ev.preventDefalut()來阻止預設行為和ev.stopPropagation()阻止冒泡最好,提高代碼的高效性。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 在上一篇文章iOS項目——基本框架搭建中,我們詳細說明瞭如何對TabBarItem的圖片屬性以及文字屬性進行一些自定義配置。但是,很多時候,我們需要修改TabBarItem的圖片和文字屬性之外,還需要自定義TabBarItem的位置,這樣系統自帶的TabBar的樣式並不能滿足我們的項目需求,所以我們 ...
  • 筆記倉庫: "https://github.com/nnngu/LearningNotes" "上一篇文章用爬蟲自動下載了一些圖片" ,這一篇就用這些圖片做一個音樂相冊吧! 效果預覽 ![][1] 點擊圖片,切換到背面: ![][2] 演示地址 演示地址: "https://nnngu.github ...
  • 問:我們在使用Vue時,實際上幹了什麼? 答:實際上只幹了一件事——new了一個Vue對象。後面的事,都交由這個對象自動去做。就好像按了下開關,機器跑起來了,剩下的事就不用我們再操心了。 各位看官先別不服,FEer在基於Vue開發項目時,確實寫了很多代碼,但本質上,這些代碼都是在往這台機器的固定工作 ...
  • WebSocket線上測試工具 http://ws.douqq.com/ 1、連接格式為 ws://IP/功能變數名稱:埠(示例ws://119.29.3.36:5354) 2、對於內網的測試環境,只需填入服務端的內網IP和埠 3、可連接我上面提供的服務端ws地址來測試您自己的客戶端 本站支持QQ機器人 ...
  • 今天對Jquery中 isPlainObject 源碼分析。 1. isPlainObject 方法的作用: 用來判斷傳入參數,是否是對象。 2. 源碼分析:isPlainObject: function( obj ) { ...
  • jQuery實現身份證輸入添加空格 表單驗證身份證輸入,並且輸入時前6位添加一個空格,中間8位後添加一個空格,及身份證格式驗證 參考:基於jquery實現的銀行卡號每隔4位自動插入空格的實現代碼 參考網址: http://www.jb51.net/article/97966.html 源碼代碼如下: ...
  • 今年工作進度到這裡結束,整理一下今年收集的自用js庫,後期會更新,代碼已貼github=>https://github.com/lpg-kobe/personal-github /** * @param {long} //通用函數庫 * @param {onerror} //js錯誤調試 * @au ...
  • 最近學習vue時看到了let,const變數定義,查閱相關資料整理了一下,所以就總結下加深印象,js中三種變數方式var、const、let的區別 1.var定義的變數是可以修改,如果不初始化會輸出undefined,不會報錯。 2.const定義變數不可修改,而且必須初始化,const聲明一個只讀 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...