JavaScript DOM事件模型

来源:https://www.cnblogs.com/Westin-Chen/archive/2019/03/17/10549684.html
-Advertisement-
Play Games

早期由於瀏覽器廠商對於瀏覽器市場的爭奪,各家瀏覽器廠商對同一功能的JavaScript的實現都不進相同,本節內容介紹JavaScript的DOM事件模型及事件處理程式的分類。 1、DOM事件模型。DOM事件模型分為兩種:事件冒泡和事件捕獲。事件冒泡最初是微軟提出的DOM事件流的模型,顧名思義,就是值 ...


  早期由於瀏覽器廠商對於瀏覽器市場的爭奪,各家瀏覽器廠商對同一功能的JavaScript的實現都不進相同,本節內容介紹JavaScript的DOM事件模型及事件處理程式的分類。

  1、DOM事件模型。DOM事件模型分為兩種:事件冒泡和事件捕獲。事件冒泡最初是微軟提出的DOM事件流的模型,顧名思義,就是值瀏覽器的事件流如同冒泡一樣,從最低處到最高處。最低處對應的是DOM中最具體的元素,最高處則是最外層元素,最外層元素一般就是document元素。

  a、事件冒泡模型:

     如下圖,當點擊最底層的span元素時,在冒泡模型中觸發的事件流為:span的click事件觸發---->父級元素div的click事件觸發---->頂層的document元素的click事件觸發。

 

   b、事件捕獲模型:

    如下圖,當點擊span元素時,在事件捕獲模型中觸發的事件流為:最頂層的document的click事件首先被觸發---->子容器div(同時也是span的父容器)的click事件被觸發

---->最底層的span元素的click事件觸發。

 

    可見,事件冒泡和事件捕獲的事件觸發流程是完全相反的。

 

  2、DOM事件處理程式的分類。DOM事件處理程式分為三種:HTML事件處理程式、DOM 0級事件處理程式、DOM 2級事件處理程式(註意:、沒有DOM1級事件處理程式)。

  a、HTML事件處理程式:

    指的是事件綁定直接寫在HTML上,如:

1 <input type="button' value="button" onclick="alert('button clicked!')" />

    這裡button的click事件的綁定直接寫在HTML中,這種寫法即是HTML事件處理程式。由於這種寫法造成HTML和JavaScript的緊耦合,當需要調整JavaScript事件時,不得不調整HTML代碼(就算不修改JavaScript函數名,只修改函數的內部實現,仍然不推薦使用這種語法綁定事件,會增加不必要的維護成本)。

 

   b、DOM 0級事件處理程式:

    指的是通過給JavaScript對象的事件參數屬性賦值的模式,如:

1 <input id="btn" type="button" value="button" />
2 <script>
3     var btn = document.getElementById("btn");
4     btn.onclick = function(){
5         alert("button clicked!");
6     }
7 </script>

    這裡通過直接給btnDOM對象的onclick屬性賦值的形式來綁定click事件就是DOM 0級事件處理程式,賦值可以使用匿名函數的形式,也可以使用具名函數的形式,如下:

1 <input id="btn" type="button" value="button" />
2 <script>
3     var btn = document.getElementById("btn");
4     btn.onclick clickHandle;
5     function clickHandle(){
6         alert("something clicked!");
7     }
8 </script>

    如需註銷,只需將該屬性設置為null即可,如下:

1 <input id="btn" type="button" value="button" />
2 <script>
3     var btn = document.getElementById("btn");
4     btn.onclick clickHandle;
5     function clickHandle(){
6         alert("something clicked!");
7     }
8     btn.onclick = null;
9 </script>

    註意:如果綁定使用的是匿名函數的形式,通過給事件屬性賦值null仍然可以註銷該事件。

 

  c、DOM 2級事件處理程式:

    指的是使用 addEventListener("eventName","eventHandle",false),其中eventName表示事件名稱、eventHandle表示事件處理函數,false表示是否啟用事件捕獲模式,預設為false。使用addEventListener函數來給DOM元素綁定事件處理程式,如:

1 <input id="btn" type="button" value="button" />
2 <script>
3     var btn = document.getElementById("btn");
4     btn.addEventListener("click",function(){
5         alert("something clicked!");
6     },false);
7 </script>

    同樣,這裡既可以使用匿名函數的形式也可以使用具名函數的形式,如:

1 <input id="btn" type="button" value="button" />
2 <script>
3     var btn = document.getElementById("btn");
4     btn.addEventListener("click",clickHandle,false);
5     function clickHandle(){
6         alert("something clicked!");
7     }
8 </script>

    註意:通過addEventListener綁定的事件只能通過removeEventListener來註銷,不能使用DOM 0級中的方式註銷事件處理程式,註銷事件如下:

1 <input id="btn" type="button" value="button" />
2 <script>
3     var btn = document.getElementById("btn");
4     btn.addEventListener("click",clickHandle,false);
5     function clickHandle(){
6         alert("something clicked!");
7     }
8     btn.removeEventListener("click",clickHandle);
9 </script>

    如果綁定時使用的是匿名函數,則註銷操作比較麻煩,可以通過事件參數的callee屬性獲取當前正在執行的函數,但必須使用在事件綁定的函數內,如:

 1 <script>
 2     var dom=document.getElementById("content");
 3     var clickNum=0;
 4     dom.addEventListener("click",function(e){
 5     clickNum++;
 6     alert('你摸了我'+clickNum+'下了。最多摸2下哦');
 7     if(clickNum>=2){
 8         dom.removeEventListener(e.type,arguments.callee,false);
 9         console.log(this);
10     }
11 });
12 </script>

 

  d、IE中DOM 2級事件處理程式的是通過attachevent來綁定的,語法與addEventListener完全一致。

 

  e、DOM 0級和DOM 2級事件處理程式的主要區別:

    DOM 2級事件處理程式可以給元素的事件綁定多個處理程式,如:

 1 <input id="btn" type="button" value="button" />
 2 <script>
 3     var btn = document.getElementById("btn");
 4     btn.addEventListener("click",clickHandle1,false);
 5     btn.addEventListener("click",clickHandle2,false);
 6     function clickHandle1(){
 7         alert("something clicked!");
 8     }
 9     function clickHandle2(){
10         alert("something clicked again!");
11     }
12 </script>

    此時,點擊btn時將會依次觸發clickHandle1、clickHandle2,註銷事件處理程式也需要針對每個事件處理程式使用removeEventListener。

       DOM 0級事件處理程式如果以這種形式綁定事件,則後寫的方法會覆蓋掉之前的方法,即:

 1 <input id="btn" type="button" value="button" />
 2 <script>
 3     var btn = document.getElementById("btn");
 4     btn.onclick = clickHandle1();
 5     btn.onclick = clickHandle2();
 6     function clickHandle1(){
 7         alert("something clicked!");
 8     }
 9     function clickHandle2(){
10         alert("something clicked again!");
11     }
12 </script>

    這裡實際只會綁定clickHandle2方法,clickHandle1被後面的clickHandle2覆蓋掉。

 

   開發過程中推薦使用DOM 0級事件處理程式或者DOM 2級事件處理程式,如果只有一個事件處理程式DOM 0級就足夠了,當然,如需綁定多個事件處理程式,則需使用DOM 2級事件處理程式。

  為了屏蔽各瀏覽器之間的實現差異,推薦使用一些JavaScript庫來輔助完成事件綁定。推薦使用jQuery,針對不同的瀏覽器,可以使用統一的介面來完成這一過程。

 

 

參考:

  js如何移除匿名函數的事件綁定 - https://www.cnblogs.com/sichaoyun/p/6776310.html


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

-Advertisement-
Play Games
更多相關文章
  • 編寫腳本實現DHCP服務與DHCP中繼自動化執行 本腳本是在liunx搭建DHCP伺服器以及DHCP中繼伺服器實驗環境下實現的https://www.cnblogs.com/yuzly/p/10539317.html 源碼如下: 1.在dhcp server端執行腳本 2.測試dhcp server ...
  • 一 前期準備1.1 前置條件至少有三個不同的主機運行monitor (MON)節點;至少三個直接存儲(非外部SAN硬體)的OSD節點主;至少兩個不同的manager (MGR)節點;如果使用CephFS,則至少有兩個完全相同配置的MDS節點;如果使用Ceph對象網關,則至少有兩個不同的RADOSGW... ...
  • 一.問題描述 本人使用的電腦安裝的是ubuntu18.10系統,使用aptitude install mysql-server命令安裝mysql時,總是無法正常安裝,無法正常配置mysql-server,導致無法使用了.百度了一下,發現沒有人遇到類似的問題,因此,我就通過查看官方文檔來手動安裝mys ...
  • ADB的全稱為Android Debug Bridge,就是起到調試橋的作用。 adb調試手機需要把usb調試打開 Android studio模擬器有的也要把模擬器usb調試打開,工具要靈活運用, 常見命令: adb start-server :開啟ADB服務 adb devices :列出所有設 ...
  • macOS是全世界第一個基於FreeBSD系統採用“面向對象操作系統”的全面的操作系統,“面向對象操作系統”是史蒂夫·喬布斯(Steve Jobs)於1985年被迫離開蘋果後成立的NeXT公司所開發的。iOS是由蘋果公司開發的移動操作系統,iOS與蘋果的Mac OS X操作系統一樣,屬於類Unix的... ...
  • 開始使用 在app目錄下的build.gradle中添加依賴: GET方法 GET參數的傳遞可以使用拼接字元串的方式直接拼接到url中。 POST方法 封裝 由於OkHttp發送請求的方式比較繁瑣,需要構建許多參數,所以需要我們自己進行封裝,以下是我的封裝方式: 想法有以下幾點: 1. 在 和`po ...
  • 文章大綱 一、為什麼要進行頁面佈局優化二、頁面佈局優化實操三、項目源碼下載四、參考文章 一、為什麼要進行頁面佈局優化 在開發Android時,會遇到某些是通用的佈局,我們常將一些通用的視圖提取到一個單獨的layout文件中,然後使用<include>等標簽在需要使用的其他layout佈局文件中載入進 ...
  • Web前端 Ajax基礎技術(下) 你要明白 是什麼,怎麼使用? ,`web`程式是將信息放入公共的伺服器,讓所有網路用戶可以通過瀏覽器進行訪問。 瀏覽器發送請求,獲取伺服器的數據: 地址欄輸入地址,表單提交,特定的 或`src`屬性。 上手: 請求: 請求: 非同步同步: 響應類型: 伺服器響應,使 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...