事件冒泡、事件捕獲、事件委托初探

来源:http://www.cnblogs.com/mrdooo/archive/2016/04/10/5374203.html
-Advertisement-
Play Games

場景:1 1 <div class="div1"> 2 click me div1 3 <div class="div2">click me div2</div> 4 </div> 5 6 $(".div2").on('click',function(){ 7 alert($(this).attr( ...


場景:1

 1 <div class="div1">
 2     click me div1
 3     <div class="div2">click me div2</div>
 4 </div>
 5 
 6 $(".div2").on('click',function(){
 7     alert($(this).attr('class'))
 8 })
 9 
10 $(".div1").on('click',function(){
11    alert($(this).attr('class'))
12 })
View Code

問題1.如果點擊click me div2 會顯示什麼?

a) div2  

b) div1  

c) 先div1 後div2

d) 先div2 後div1

試試jsfiddle

 

如果用文字來描述這個問題大概的意思是“如果一個元素和它的父元素或者祖先元素綁定了相同的事件,哪一個事件處理函數會先執行?” 答案是根據瀏覽器。沒錯。在IE下會優先執行div2,在Netscape下會先執行div1。而在Mozilla、opera7下結合了前兩者。

為什麼不同瀏覽器之間會有這種差異?

IE認為如果點擊div2,當然要先觸發綁定在div2上事件處理函數,之後再將點擊事件向上傳遞觸發綁定在div1上的事件處理函數。

事件冒泡過程:

               / \
---------------| |-----------------
| div1         | |                |
|   -----------| |-----------     |
|   |div2      | |          |     |
|   -------------------------     |
|        事件冒泡                  |
-----------------------------------

Netcape認為因為div2在div1的內部,點擊div2後,點擊事件應該從div1傳遞,先觸發div1上的事件處理函數,隨後點擊事件傳遞到div2上的事件處理函數。

事件捕獲過程:

               | |
---------------| |-----------------
| div1         | |                |
|   -----------| |-----------     |
|   |div2      \ /          |     |
|   -------------------------     |
|        事件捕獲                   |
-----------------------------------

 

 針對這兩種情況,W3C在定義dom 事件模型的時候,採取了一個折中的方法。在W3C事件模型中,事件的傳播順序應該從事件捕獲階段為始到事件冒泡階段結束為終。

                 | |  / \
-----------------| |--| |-----------------
| div1           | |  | |                |
|   -------------| |--| |-----------     |
|   |div2        \ /  | |          |     |
|   --------------------------------     |
|        W3C 事件模型                      |
------------------------------------------

那麼問題來了,作為開發人員如何在這種相對比較複雜的環境下來限制事件的傳播順序,從而實現事件綁定的預期效果。

原生js實現方式

element.addEventListener("事件類型",“事件處理函數”,“事件順序”)

事件順序=true

事件處理函數在捕獲階段執行

事件順序 =false

事件處理函數在冒泡階段執行

 

事件委托

什麼是事件委托?利用事件冒泡或者事件捕獲原理,如果點擊div1,div1自身不處理事件,而是將處理任務委托給父級元素或者祖先元素甚至根節點元素來處理。

 運行:https://jsfiddle.net/Mr_do/22wtxxj5/7/

 1 <div id="divItem">
 2 
 3     <div class="div1">
 4         div1
 5     </div>
 6     
 7     <div class="div2">
 8         div2
 9     </div>
10     
11     <div class="div3">
12         div3
13     </div>
14     
15 </div>
16 
17 
18 
19 $("#divItem").delegate('div','click',function(e){
20     alert($(this).attr('class'))
21 })

事件委托好處在於:

1.對於多個相同的事件,可以將任務委托給同一個函數來處理。

2.提高的web應用的性能,減少占用記憶體

3.結藕js和dom結構的關聯,改變dom結構無需改變js處理函數

參考內容

事件執行順序 :http://www.quirksmode.org/js/events_order.html

事件註冊原理:http://www.quirksmode.org/js/events_advanced.html

W3C DOM Object Model :https://www.w3.org/TR/2000/REC-DOM-Level-2-Events-20001113/

事件冒泡與事件捕獲的區別:http://stackoverflow.com/questions/4616694/what-is-event-bubbling-and-capturing

事件冒泡與捕獲詳解:http://javascript.info/tutorial/bubbling-and-capturing

addEventListener()

DOM Object Model Event :https://www.w3.org/TR/DOM-Level-2-Events/events.html

DOM 事件架構 :http://www.ituring.com.cn/article/428

DOM 事件模型 :http://www.ituring.com.cn/article/420

Jquery 優化事件委托 :http://www.ituring.com.cn/article/467


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

-Advertisement-
Play Games
更多相關文章
  • 1定義 將抽象和實現解耦,使得兩者可以獨立變化 2類圖 3實現 4應用 ①優點 抽象和實現分離 完全為瞭解決集成的缺點而提出的設計模式////抽象與實現的關係本來是縱向的,橋梁模式將他們改為橫向關係 優秀的擴充能力 實現細節對客戶透明 5使用場景 不希望或者不適合通過繼承的場景 介面或者抽象類不穩定 ...
  • 1定義 使用共用對象可有效的支持大量細粒度的對象 2類圖 角色分析 Flyweight抽象享元角色,一個產品的抽象,定義內部狀態和外部狀態的介面或者實現 ConcreteFlyweight具體享元角色,實現抽象角色定義的業務。註:內部狀態處理和環境無關 unsharedConcreteFlyweig ...
  • 1定義 給定一門語言,定義他的文法的一種表示,並定義一個解釋器,該解釋器使用該表示來解釋語言中的句子 2類圖 角色分析 AbstractExpression抽象解釋器,具體的解釋任務由各個實現類完成,具體的解釋器分別由TerminalExpression和NonterminalExpression完 ...
  • 問題場景: 在實現響應式佈局的過程中,如何設置字體大小在不同的視窗尺寸以及不同的移動設備的可讀性? 需要瞭解的有: 1.px,em,pt之間的換算關係 1em = 16px 1px = 1/16 em = 0.0625em ////以下用的比較少////// 1em = 12pt 1px = 3/4 ...
  • 對於多個元素同在同一行的佈局,如比較常見的是輪播。下麵我將探討這這一佈局的做法: 首先約定 結果如下: div.row div.col div.col div.col ... 做法一: 設定 的寬度為 ,然後設置 為`float:left display:inline block` 對於 , 需要清 ...
  • jquery中attr和prop的區別、 什麼時候用 attr 什麼時候用 prop 在高版本的jquery引入prop方法後,什麼時候該用prop?什麼時候用attr?它們兩個之間有什麼區別?這些問題就出現了。 關於它們兩個的區別,網上的答案很多。這裡談談我的心得,我的心得很簡單: 對於HTML元 ...
  • 向下滑動網頁的時候能夠自動載入圖片並顯示。 盛放圖片的盒子模型如下: 設置img-width為150px,然後box_img添加內邊距和陰影效果,box的外邊距為0,添加內邊距。盒子的寬度是由img-width和邊距撐開的。也就是說盒子之間是沒有間距的,但是盒子內部有一些邊距的效果。這樣在js設置位 ...
  • 內置對象:不依賴於宿主對象,在程式執行之前就已經存在。例如Object,Array和String。 今天主要學習另外兩個單體內置對象,Global和Math。 (一)Global 對象 URI編碼方法: encodeURI()方法可以對URI進行編碼,主要用於整個URI。不會對本身屬於URI的特殊字 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...