〖大前端 - 基礎入門三大核心之JS篇?〗- DOM事件傳播和事件監聽方法addEventListener()

  • 說明:該文屬于 大前端全棧架構白寶書專欄,目前階段免費如需要項目實戰或者是體系化資源,文末名片加V!
  • 作者:不渴望力量的哈士奇(哈哥),十余年工作經驗, 從事過全棧研發、產品經理等工作,目前在公司擔任研發部門CTO。
  • 榮譽:2022年度博客之星Top4、2023年度超級個體得主、谷歌與亞馬遜開發者大會特約speaker全棧領域優質創作者

  • 🏆 白寶書系列
    • 🏅 啟示錄 - 攻城獅的自我修養
    • 🏅 Python全棧白寶書
    • 🏅 ChatGPT實踐指南白寶書
    • 🏅 產品思維訓練白寶書
    • 🏅 全域運營實戰白寶書
    • 🏅 大前端全棧架構白寶書


文章目錄

  • ? 事件傳播
  • ? addEventListener()方法。

? 事件傳播

先來思考一個問題:

當頁面的盒子有嵌套時,如果盒子都設置了同樣的事件監聽,那么事件監聽觸發的順序是什么樣的呢?比如下面圖中,三個盒子都設置了onclick事件監聽,當鼠標點擊最內側的盒子時,會觸發三個盒子的onclick事件,那這三個事件觸發的順序是怎樣的?

image-20230419145411684

我們編寫代碼來驗證一下:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title><style>#box1 {width: 142px;height: 142px;border: 1px solid #000;padding: 20px;}#box2 {width: 102px;height: 102px;border: 1px solid #000;padding: 20px;}#box3 {width: 100px;height: 100px;border: 1px solid #000;}</style>
</head>
<body><div id="box1"><div id="box2"><div id="box3"></div></div></div><script>var oBox1 = document.getElementById('box1');var oBox2 = document.getElementById('box2');var oBox3 = document.getElementById('box3');oBox1.onclick = function () {console.log('鼠標單擊box1');};oBox2.onclick = function () {console.log('鼠標單擊box2');};oBox3.onclick = function () {console.log('鼠標單擊box3');};</script>
</body>
</html>

image-20230419160420907

這種從內到外觸發事件的過程就是事件傳播的過程。

但事實上,真實的事件傳播并不僅僅是由內到外的,而是先從外到內,然后再從內到外,那為什么結果只有從內到外的呢?這是因為onxxx事件監聽只能監聽后面的一段過程,即從內到外的過程。

**事件的傳播:**DOM規定事件傳播的方向是先從外到內,再從內到外

從外到內的過程為捕獲階段(capturing phase),從內到外的過程為冒泡階段(Bubbing phase)

那么問題來了,如何才能監聽到捕獲階段呢?這就用到第二種事件監聽方法——addEventListener()方法。

在DOM更新過程中,事件監聽分成兩個級別:DOM0級事件監聽和DOM2級事件監聽。一開始只有DOM0級事件監聽,只能監聽到冒泡階段;在DOM2中新增加了addEventListener()方法,可以監聽到捕獲和冒泡兩個階段。之所以沒有DOM1級,是因為DOM1中沒有對事件監聽的方法進行更新修改。

? addEventListener()方法。

addEventListener()方法的示例代碼:

oBox.addEventListener('click', function(){   //click表示鼠標單擊//事件處理函數代碼
}, true);//true表示監聽捕獲階段,false表示監聽冒泡階段

上面的例子中,用addEventListener()方法監聽整個事件傳播的過程,代碼如下:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title><style>#box1 {width: 142px;height: 142px;border: 1px solid #000;padding: 20px;}#box2 {width: 102px;height: 102px;border: 1px solid #000;padding: 20px;}#box3 {width: 100px;height: 100px;border: 1px solid #000;}</style>
</head>
<body><div id="box1"><div id="box2"><div id="box3"></div></div></div><script>var oBox1 = document.getElementById('box1');var oBox2 = document.getElementById('box2');var oBox3 = document.getElementById('box3');oBox1.addEventListener('click', function () {console.log('我是box1的捕獲階段');}, true);oBox2.addEventListener('click', function () {console.log('我是box2的捕獲階段');}, true);oBox3.addEventListener('click', function () {console.log('我是box3的捕獲階段');}, true);oBox1.addEventListener('click', function () {console.log('我是box1的冒泡階段');}, false);oBox2.addEventListener('click', function () {console.log('我是box2的冒泡階段');}, false);oBox3.addEventListener('click', function () {console.log('我是box3的冒泡階段');}, false);</script>
</body>
</html>

image-20230419191821833

上述代碼中,需要注意的是,觸發事件監聽的順序跟代碼書寫的順序沒有關系的,新手可能會誤以為兩者有關系,我們把捕獲和冒泡的代碼順序調一下也不會影響事件傳播順序:

image-20230419194630136

還需注意的是,如果給元素設置相同的兩個或多個同名事件時,DOM0級的事件監聽后面寫的會覆蓋先寫的;而DOM2級的會按順序執行。示例代碼:

<body><div id="box1"><div id="box2"><div id="box3"></div></div></div><script>var oBox1 = document.getElementById('box1');var oBox2 = document.getElementById('box2');var oBox3 = document.getElementById('box3');oBox2.onclick = function () {   //這個事件監聽會被后面的覆蓋console.log('A');};oBox2.onclick = function () {console.log('B');};oBox2.addEventListener('click', function () {   //不會被覆蓋console.log('C');},true)oBox2.addEventListener('click', function () {   //不會被覆蓋console.log('D');},true)</script>
</body>

image-20230419195626656

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/161642.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/161642.shtml
英文地址,請注明出處:http://en.pswp.cn/news/161642.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

ABAP調用Https接口 Ssl證書導入

ABAP調用Https接口 Ssl證書導入 一、證書導入 谷歌瀏覽器打開對方系統URL地址&#xff0c;下載SSL Server certificate,步驟如下&#xff1a; 瀏覽器打開要導出certificate(證書)的網站&#xff0c;點擊這個小鎖的圖標&#xff1a; 點擊連接是安全的后面小播放按鈕 點擊證…

Spark RDD、DataFrame和Dataset的區別和聯系

一、三種數據介紹 是Spark中的三種不同的數據結構&#xff0c;它們都可以用于分布式數據處理&#xff0c;但是它們的實現方式和使用方法略有不同。 RDD&#xff08;彈性分布式數據集&#xff09; RDD是Spark最初的核心數據結構&#xff0c;它是一個分布式的、只讀的、可容錯的…

BIND DNS服務器的域名日志

BIND DNS服務器的域名日志 解析字段包括以下幾個部分&#xff1a; 日期和時間&#xff1a;記錄查詢發生的日期和時間。客戶端IP地址&#xff1a;發起查詢的客戶端IP地址。查詢類型&#xff1a;查詢的記錄類型&#xff0c;如A、AAAA、MX、NS等。查詢域名&#xff1a;被查詢的域…

系列七、ThreadLocal為什么會導致內存泄漏

一、ThreadLocal為什么會導致內存泄露 1.1、ThreadLocalMap的基本結構 ThreadLocalMap是ThreadLocal的內部類&#xff0c;沒有實現Map接口&#xff0c;用獨立的方式實現了Map的功能&#xff0c;其內部的Entry也是獨立實現的。源碼如下&#xff1a; 1.2、ThreadLocal引用示意圖…

educoder中Hive -- 索引和動態分區調整

第1關:Hive -- 索引 ---創建mydb數據庫 create database if not exists mydb; ---使用mydb數據庫 use mydb; ---------- Begin ---------- ---創建staff表 create table staff( id int, name string, sex string) row format delimited fields terminated by , stored…

分享一篇很就以前的文檔-VMware Vsphere菜鳥篇

PS&#xff1a;由于內容是很久以前做的記錄&#xff0c;在整理過程中發現了一些問題&#xff0c;簡單修改后分享給大家。首先ESXI節點和win7均運行在VMware Workstation上面&#xff0c;屬于是最底層&#xff0c;而新創建的CentOS則是嵌套后創建的操作系統&#xff0c;這點希望…

MySQL--慢查詢(一)

1. 查看慢查詢日志是否開啟 show variables like slow_query%; show variables like slow_query_log; 參數說明&#xff1a; 1、slow_query_log&#xff1a;這個參數設置為ON&#xff0c;可以捕獲執行時間超過一定數值的SQL語句。 2、long_query_time&#xff1a;當SQL語句執行…

CST同軸饋電步驟

CST同軸饋電步驟 算例1. 同軸內芯2. 填充材料3. 外皮4. GND減去一個圓形&#xff0c;使EMWAVE可以通過5. 添加端口6. 結果比較 算例 cst模型庫中的一個圓貼片 1. 同軸內芯 2. 填充材料 他這里直接使用和介質基板一樣的材料并且進行了合并&#xff0c;我就懶得再改了&#x…

java代碼調用twitter-api用例實戰

一、申請twitter開發者賬號 首先先申請twitter開發者免費的API&#xff0c;要填寫申請的內容&#xff0c;放心大膽地寫&#xff0c;申請完&#xff0c;會提供免費的API接口。 以下是我申請到的三個免費API 申請完開始進行測試調用。 讀官方文檔賬戶認證那塊&#xff1a;https…

《安富萊嵌入式周報》第327期:Cortex-A7所有外設單片機玩法LL/HAL庫全面上線,分享三款GUI, PX5 RTOS推出網絡協議棧,小米Vela開源

周報匯總地址&#xff1a;嵌入式周報 - uCOS & uCGUI & emWin & embOS & TouchGFX & ThreadX - 硬漢嵌入式論壇 - Powered by Discuz! 1、2023 Hackaday大賽胸牌開源 Vectorscope-main.zip (66.83MB) GitHub - Hack-a-Day/Vectorscope: Vectorscope badg…

Baidu Comate 基于百度文心一言的智能編碼助手

本心、輸入輸出、結果 文章目錄 Baidu Comate 基于百度文心一言的智能編碼助手前言產品能力主要功能特性JetBrains IntelliJ IDEA 插件安裝相關鏈接花有重開日,人無再少年實踐是檢驗真理的唯一標準Baidu Comate 基于百度文心一言的智能編碼助手 編輯:簡簡單單 Online zuozuo …

git commit message 書寫規范

在使用 Git 提交時&#xff0c;遵循良好的提交消息規范可以提高代碼的可讀性和可維護性。以下是一些常見的 Git 提交消息書寫規范&#xff1a; 提交消息格式&#xff1a;一個提交消息通常包含三個部分&#xff1a;標題、空行和正文。它們之間使用空行分隔。 復制 <標題>&…

vue3項目中使用富文本編輯器

前言 適配 Vue3 的富文本插件不多&#xff0c;我看了很多插件官網&#xff0c;也有很多寫的非常棒的&#xff0c;有UI非常優雅讓人耳目一新的&#xff0c;也有功能非常全面的。 如&#xff1a; Quill&#xff0c;簡單易用&#xff0c;功能全面。editorjs&#xff0c;UI極其優…

echarts的橫向柱狀圖文字省略,鼠標移入顯示內容 vue3

效果圖 文字省略 提示 如果是在x軸上的&#xff0c;就在x軸上添加triggerEvent: true,如果是y軸就在y軸添加&#xff0c;我是在y軸上添加的 并且自定義的方法&#xff08;我取名為extension&#xff09; // echarts 橫向省略文字 鼠標移入顯示內容 export const extension…

AT89S52單片機的最小應用系統

目錄 ?一.時鐘電路設計 1.內部時鐘方式 2.外部時鐘方式 3.時鐘信號的輸出 二.機器周期&#xff0c;指令周期與指令時序 1.時鐘周期 2.機器周期 3.指令周期 三.復位操作和復位電路 1.復位操作 2 復位電路設計 四.低功耗節電模式 AT89S52本身片內有8KB閃爍存儲器&am…

Redisson分布式鎖源碼解析

一、使用Redisson步驟 Redisson各個鎖基本所用Redisson各個鎖基本所用Redisson各個鎖基本所用 二、源碼解析 lock鎖 1&#xff09; 基本思想&#xff1a; lock有兩種方法 一種是空參 另一種是帶參 * 空參方法&#xff1a;會默認調用看門狗的過期時間30*1000&…

kubernetes|云原生|Deployment does not have minimum availability 的解決方案(資源隱藏的由來)

前言&#xff1a; 最近在部署prometheus的過程中遇到的這個問題&#xff0c;感覺比較的經典&#xff0c;有必要記錄一下。 現象是部署prometheus主服務的時候&#xff0c;看不到pod&#xff0c;只能看到deployment&#xff0c;由于慌亂&#xff0c;一度以為是集群有毛病了&am…

c# 基礎語法

c# 程序結構 using System.Collections.Generic; namespace demo1; //一個命名空間可以包含多個類 using System.IO; using System.Drawing;class proj {/// <summary>/// c#是微軟開發的&#xff0c;基于c和c的一種面象對象編程語言&#xff0c;用于快速開發windows桌…

真實網絡中的 bbr

本文包含中心極限定理&#xff0c;大數定律&#xff0c;經濟規律等&#xff0c;bbr 倒沒多少&#xff0c;不過已經習慣把 bbr 當靶子了。 上周寫了 揭秘 bbr 以及 搶帶寬的原理&#xff0c;我對自己說&#xff0c;這都是理論上如何&#xff0c;可實際上呢。于是有必要結合更實際…

ubuntu cutecom串口調試工具使用方法(圖形界面)

文章目錄 Ubuntu下使用CuteCom進行串口調試使用指南什么是CuteCom&#xff1f;主要特點 安裝CuteCom使用APT包管理器從源碼編譯安裝 配置串口CuteCom界面解析&#xff08;啟動cutecom&#xff09;使用CuteCom進行數據發送和接收配置串口參數數據接收數據發送 高級功能和技巧流控…