關於DOM事件流、DOM0級事件與DOM2級事件

来源:https://www.cnblogs.com/Leophen/archive/2019/08/24/11405579.html
-Advertisement-
Play Games

一、DOM 事件模型 DOM 事件模型包括捕獲和冒泡,捕獲是從上往下到達目標元素,冒泡是從當前元素,也就是目標元素往上到 window 二、流 流的概念,在現今的 JavaScript 中隨處可見。比如說 React 中的單向數據流,Node 中的流,還有 DOM 事件流,都是流的一種生動體現。至於 ...


一、DOM 事件模型

DOM 事件模型包括捕獲和冒泡,捕獲是從上往下到達目標元素,冒泡是從當前元素,也就是目標元素往上到 window

 

 

二、流

流的概念,在現今的 JavaScript 中隨處可見。比如說 React 中的單向數據流,Node 中的流,還有 DOM 事件流,都是流的一種生動體現。
至於流的具體概念,用術語說流是對輸入輸出設備的抽象。以程式的角度說,流是具有方向的數據。

 

 

三、事件流

瀏覽器在為當前頁面與用戶做交互的過程中,比如點擊滑鼠左鍵,會出現這個左鍵是怎麼傳到頁面上,還有怎麼響應的問題。

事件流所描述的就是從頁面中接受事件的順序,事件流分為兩種:事件冒泡(主流)和事件捕獲

 

1、事件冒泡

事件開始時由具體元素接收,然後逐級向上傳播到父元素

舉個例子:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Event Bubbling</title>
</head>
<body>
  <button id="clickMe">Click Me</button>
</body>
</html>

我們給 button 和它的父元素,加入點擊事件

var button = document.getElementById('clickMe');
 
button.onclick = function() {
  console.log('1. You click Button');
};
document.body.onclick = function() {
  console.log('2. You click body');
};
document.onclick = function() {
  console.log('3. You click document');
};
window.onclick = function() {
  console.log('4. You click window');
};

點擊按鈕運行效果:

也就是說,click 事件首先在 <button> 元素上發生,然後逐級向上傳播,這就是事件冒泡

 

2、事件捕獲

 

父元素的節點更早接收事件,而具體元素最後接收事件,與事件冒泡相反

 

 

三、DOM 事件流

DOM事件流包括三個階段:

  1. 事件捕獲階段

  2. 處於目標階段

  3. 事件冒泡階段

 

1、事件捕獲階段

當事件發生時,首先發生的是事件捕獲,為父元素截獲事件提供了機會

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Event Bubbling</title>
</head>
<body>
  <button id="clickMe">Click Me</button>
</body>
</html>

上面事件冒泡的 Demo 中,window 點擊事件更改為使用事件捕獲模式

var button = document.getElementById('clickMe');
 
button.onclick = function() {
  console.log('1. You click Button');
};
document.body.onclick = function() {
  console.log('2. You click body');
};
document.onclick = function() {
  console.log('3. You click document');
};
// window.onclick = function() {
//   console.log('4. You click window');
// };
window.addEventListener('click', function() {
  console.log('4. You click window');
}, true);

此時,點擊 button 的效果是這樣的:

可以看到,點擊事件先被父元素截獲了,且該函數只在事件捕獲階段起作用

 

2、處於目標階段

事件到了具體元素時,在具體元素上發生,並且被看成冒泡階段的一部分

 

3、事件冒泡階段

最後,冒泡階段發生,事件開始冒泡

 

 

四、阻止事件冒泡

事件冒泡過程,是可以被阻止的。防止事件冒泡而帶來不必要的錯誤和困擾。

阻止方法是使用 stopPropagation(),舉個例子:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Event Bubbling</title>
</head>
<body>
  <button id="clickMe">Click Me</button>
</body>
</html>

還是上面的 demo,這裡對 button 的 click 事件做了一些改造:

var button = document.getElementById('clickMe');
 
// button.onclick = function() {
//   console.log('1. You click Button');
// };
button.addEventListener('click', function(event) {
  // 這裡event為事件對象
  console.log('1. You click Button');
  event.stopPropagation();
  console.log('Stop Propagation!');
}, false);
document.body.onclick = function() {
  console.log('2. You click body');
};
document.onclick = function() {
  console.log('3. You click document');
};
window.addEventListener('click', function() {
  console.log('4. You click window');
}, true);

點擊後,效果如下圖:

不難看出,事件在到達具體元素後,停止了冒泡,但不影響父元素的事件捕獲

 

 

五、DOM0級事件

DOM0級事件,就是直接通過 onclick 等方式實現相應的事件

 

1、標簽內寫 onclick 事件

<input id="myButton" type="button" value="Click Me" onclick="alert('Hello1');" >

 

2、在 JS 中 使用onclick = function(){}

document.getElementById("myButton").onclick = function () {
    alert('Hello2');
}

運行結果 - 點擊彈出:

這說明 DOM0 級添加事件時,後面的事件會覆蓋前面的事件,而 DOM2級則不會,多個事件都會執行;

另外,DOM0級事件具有很好的跨瀏覽器優勢,會以最快的速度綁定,但由於綁定速度太快,可能頁面還未完全載入出來,以至於事件可能無法正常運行

 

 

六、DOM2級事件

 

1、DOM2級事件的方法

主流瀏覽器 DOM2 級事件是通過以下兩個方法用於處理指定和刪除事件處理程式的操作:

  • addEvenetListener
  • removeEventListener

 

2、DOM2級事件的使用

所有的 DOM 節點都包含這兩個方法,使用方法如下:

  • target.addEventListener(type, listener[, useCapture]);
  • target.removeEventListener(type, listener[, useCapture]);

並且它們都接受三個參數:

  • type:事件類型,如'click'、'mouseover'、'mouseout',在事件名前不加'on'
  • listener:事件處理方法
  • useCapture:布爾參數,不傳該參數時預設是 false,表示在事件冒泡階段處理,如果是 true,則表示在捕獲階段調用事件處理程式

舉個例子:

<input id="myButton" type="button" value="Click Me" onclick="alert('Hello1');" >
document.getElementById("myButton").onclick = function () {
    alert('Hello2');
}
document.getElementById('myButton').addEventListener('click', function() {
  alert('Hello3');
}, true)
document.getElementById('myButton').addEventListener('click', function() {
  alert('Hello4');
}, true)
document.getElementById('myButton').addEventListener('click', function() {
  alert('Hello5');
}, false)

運行結果:

註意:只有 DOM2級事件包含以下三個階段

  1. 事件捕獲階段

  2. 處於目標階段

  3. 事件冒泡階段

 


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

-Advertisement-
Play Games
更多相關文章
  • Mongodb最基礎入門教程 如果想瞭解一下redis的入門教程,可以去看一下我的上一篇博客 Mongodb的安裝大家可以參考一下其他博主的博客,這裡我就不做介紹了。不過值得註意的是,在Linux版本中如果啟動mongodb的時候出現下麵這個錯誤(在windows版本中不會出現下麵的問題): mon ...
  • 一、基本概念 一個典型的 Hbase Table 表如下: 1.1 Row Key (行鍵) 是用來檢索記錄的主鍵。想要訪問 HBase Table 中的數據,只有以下三種方式: + 通過指定的 進行訪問; + 通過 Row Key 的 range 進行訪問,即訪問指定範圍內的行; + 進行全表掃描 ...
  • 坐標軸 平移 旋轉 縮放 重置坐標軸 矩陣操作 示例 1、坐標軸 OpenGL 使用的右手坐標系,從正面看原點,逆時針旋轉被認為是正旋轉。 x軸:從左到右 y軸:從底部向上 z軸:從屏幕背向朝向前方 2、平移 public abstract void glTranslatef(float x ,fl ...
  • 版權聲明:本文為xing_star原創文章,轉載請註明出處! 本文同步自http://javaexception.com/archives/201 Android Studio修改Apk打包生成名稱 Android studio預設生成的apk的名字實在是太沒有辨識度了,一般預設是app-debug ...
  • 本文是作者之前剛接觸移動端跨平臺開發,使用weex-eros開發項目平日里記下來的一些筆記,分享出來方便為新手解惑,weex-eros是weex的一套解決方法,使用vue語法糖,對於前端開發者來說可以輕鬆上手,文檔如下: weex:https://weex.apache.org/zh/ weex-e ...
  • 2019-08-2422:21:03 ...
  • 樣式的導入方式 link @import link @import 一、link 的使用 二、@import 的使用 三、link 和 @import 的區別 1、引入的內容不同 link 除了引用樣式文件,還可以引用圖片等資源文件,而 @import 只引用樣式文件 2、載入順序不同 link 引 ...
  • <!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="Generator" content="EditPlus®"> <meta name="Author" content=""> <meta name= ...
一周排行
    -Advertisement-
    Play Games
  • 基於.NET Framework 4.8 開發的深度學習模型部署測試平臺,提供了YOLO框架的主流系列模型,包括YOLOv8~v9,以及其系列下的Det、Seg、Pose、Obb、Cls等應用場景,同時支持圖像與視頻檢測。模型部署引擎使用的是OpenVINO™、TensorRT、ONNX runti... ...
  • 十年沉澱,重啟開發之路 十年前,我沉浸在開發的海洋中,每日與代碼為伍,與演算法共舞。那時的我,滿懷激情,對技術的追求近乎狂熱。然而,隨著歲月的流逝,生活的忙碌逐漸占據了我的大部分時間,讓我無暇顧及技術的沉澱與積累。 十年間,我經歷了職業生涯的起伏和變遷。從初出茅廬的菜鳥到逐漸嶄露頭角的開發者,我見證了 ...
  • C# 是一種簡單、現代、面向對象和類型安全的編程語言。.NET 是由 Microsoft 創建的開發平臺,平臺包含了語言規範、工具、運行,支持開發各種應用,如Web、移動、桌面等。.NET框架有多個實現,如.NET Framework、.NET Core(及後續的.NET 5+版本),以及社區版本M... ...
  • 前言 本文介紹瞭如何使用三菱提供的MX Component插件實現對三菱PLC軟元件數據的讀寫,記錄了使用電腦模擬,模擬PLC,直至完成測試的詳細流程,並重點介紹了在這個過程中的易錯點,供參考。 用到的軟體: 1. PLC開發編程環境GX Works2,GX Works2下載鏈接 https:// ...
  • 前言 整理這個官方翻譯的系列,原因是網上大部分的 tomcat 版本比較舊,此版本為 v11 最新的版本。 開源項目 從零手寫實現 tomcat minicat 別稱【嗅虎】心有猛虎,輕嗅薔薇。 系列文章 web server apache tomcat11-01-官方文檔入門介紹 web serv ...
  • 1、jQuery介紹 jQuery是什麼 jQuery是一個快速、簡潔的JavaScript框架,是繼Prototype之後又一個優秀的JavaScript代碼庫(或JavaScript框架)。jQuery設計的宗旨是“write Less,Do More”,即倡導寫更少的代碼,做更多的事情。它封裝 ...
  • 前言 之前的文章把js引擎(aardio封裝庫) 微軟開源的js引擎(ChakraCore))寫好了,這篇文章整點js代碼來測一下bug。測試網站:https://fanyi.youdao.com/index.html#/ 逆向思路 逆向思路可以看有道翻譯js逆向(MD5加密,AES加密)附完整源碼 ...
  • 引言 現代的操作系統(Windows,Linux,Mac OS)等都可以同時打開多個軟體(任務),這些軟體在我們的感知上是同時運行的,例如我們可以一邊瀏覽網頁,一邊聽音樂。而CPU執行代碼同一時間只能執行一條,但即使我們的電腦是單核CPU也可以同時運行多個任務,如下圖所示,這是因為我們的 CPU 的 ...
  • 掌握使用Python進行文本英文統計的基本方法,並瞭解如何進一步優化和擴展這些方法,以應對更複雜的文本分析任務。 ...
  • 背景 Redis多數據源常見的場景: 分區數據處理:當數據量增長時,單個Redis實例可能無法處理所有的數據。通過使用多個Redis數據源,可以將數據分區存儲在不同的實例中,使得數據處理更加高效。 多租戶應用程式:對於多租戶應用程式,每個租戶可以擁有自己的Redis數據源,以確保數據隔離和安全性。 ...