JavaScript-關于事件、事件流(捕獲、冒泡)、事件源、常用事件

1.如何注冊事件(如何綁定事件)

? 何為注冊事件,就是給元素添加事件,其方式有傳統注冊事件、方法監聽注冊事件。

  • 0、1級事件(傳統注冊事件)不允許多個響應程序

    我們在元素內或js內使用on的方式就是傳統注冊事件,這種形式添加的事件叫DOM 0級事件(DOM L0 事件),如onclick、onblur等

    <div id="box" onclick="fn()"></div>
    <script>
    // js里面也可以注冊事件let box = document.getElementById("box")box.onclick = function (){console.log("注冊click事件成功1")
    }box.onclick = function (){console.log("注冊click事件成功2")
    }//這里只會打印"注冊click事件成功2" ,因為不允許多個響應程序,后面會覆蓋前面的事件
    </script>
    
  • 2級事件(方法監聽注冊事件)允許多個響應程序,事件觸發時依次調用

  • 方法1:元素.addEventListener:

    // IE9之前的IE不支持此方法
    元素.addEventListener('事件名', 事件響應程序(函數)callback,useCapture)
    // useCapture:可選參數,是一個布爾值,默認是 false
    // true 是捕獲階段 false是冒泡階段 事件觸發會依據事件流的順序調用
    // 例如以下 
    box.addEventListener('click', function () {// 給box添加點擊事件
    })
    // 允許多個響應程序,事件觸發時依次調用
    box.addEventListener('click', function () {console.log('1')
    })
    box.addEventListener('click', function () {console.log('2')
    })//這里會依次打印1、2
    
  • 方法2:元素.attachEvent( on事件名, 響應程序 )

    // IE9之前的瀏覽器支持
    元素.attachEvent( on事件名, 事件響應程序(函數)callback )
    box.attachEvent('onclick', function () {})
    
2.如何刪除事件(如何解除綁定事件)

用哪種方式添加的事件,我們只能用對應方式來刪除,無法混用,而且要注意是否注冊的是匿名函數,這種事件無法刪除。

  • 0、1級事件的刪除方法:

    元素.on事件名 = null  或者 = undefined
    box.onclick = null  或者  box.onclick = undefined
    
  • 2級事件的刪除方法:

    addEventListener的刪除:

    元素.removeEventListener('事件名', 函數名)
    // 匿名函數例子
    box.addEventListener('click', function () {console.log('1')
    })
    // 非匿名
    function fn(){}
    box.addEventListener('click', fn)
    // 刪除例子
    box.removeEventListener('click',fn)
    

    attachEvent的刪除

    元素.detachEvent('on事件名', 函數名)
    
3.什么是DOM事件流

在這里插入圖片描述

  • 事件流:當一個事件觸發后,它其實經歷了從上(捕獲階段)到下(事件目標),又從下(事件目標)到上(冒泡階段)的流動過程,這就稱之為事件流

    • 事件冒泡默認存在的,事件捕獲要寫特殊代碼才能看到,如下。

      • 例如:addEventListener的第三個參數寫為true就是事件捕獲,所以前面寫的addEventListener里面提到的就是這里
    • 不管是捕獲、冒泡,都會觸發同名事件

    • 事件流如果不寫特殊代碼,會經歷完整的事件流。

      <div id="div1" style="background: blue;width: 100px; height: 100px;"><div id="div2" style="background: red;width: 70px; height: 70px;"><div id="div3" style="background: yellow;width: 50px; height: 50px;"></div></div>
      </div>
      <script type="text/javascript">var oDiv1 = document.getElementById('div1'),oDiv2 = document.getElementById('div2'),oDiv3 = document.getElementById('div3');oDiv1.addEventListener('click', showBlue, true);
      oDiv2.addEventListener('click', showRed, false);
      oDiv3.addEventListener('click', showYellow, true);
      function showBlue(){ //藍 alert("blue");}
      function showRed(){ //紅 alert("red"); }
      function showYellow(){//黃 alert("yellow");}// 結果“blue”,“yellow”,“red”
      // true 是捕獲階段,依據事件流是先執行,所以先出藍 黃,false是冒泡階段,所以最后出紅
      </script>
      
4.什么是事件對象

? 事件對象也是一個對象,里面保存了事件觸發時的相關信息,event 對象代表事件的狀態,比如鍵盤按鍵的狀態、鼠標的位置、鼠標按鈕的狀態。

比如:鍵盤觸發的事件,會得到鍵盤相關信息,如enter鍵

  • 怎么獲取事件對象?

    • 如事件綁定的函數里寫一個形參event/e、或者寫window.event
  • 事件對象的兼容性方案(IE6~8 和IE8之后都可以使用)?

    • e = e || window.event
    eventTarget.onclick = function(event) {
    // 這個 event 就是事件對象}
    eventTarget.addEventListener('click', function(event) {
    }// 形參是可變的,隨便起名字,但一般用event、e、ev
    
  • 怎么獲取事件源?

    • 事件對象.target || e.target是我們事件觸發的元素,比如我點body就是body,我點div就點的那個div;
    • this 當前事件調用函數的綁定元素,this是注冊當前事件的父元素;
事件對象常見的屬性方法說明
e.targer返回觸發事件的對象 標準
e.type返回事件的類型 比如click mouseover 不帶on
e.cancelBubble該屬性阻止冒泡 非標準 ie6-8使用
e.returnValue該屬性阻止默認事件(默認行為) 非標準 ie6-8使用 比如不讓鏈接跳轉
e.preventDafault() 阻止事件默認行為該方法阻止默認事件(默認行為) 標準 比如不讓(a標簽)鏈接跳轉
e.stopPropagation()阻止冒泡標準,當父子有同名事件,為了不相互影響時可以使用
e.currentTarget與this一樣,非標準 ie6-8使用
5.阻止事件冒泡、事件捕獲(阻止事件流)
  • e.stopPropagation() (IE9后支持)
    • 可以阻止冒泡、捕獲階段
  • e.cancelBubble = true(IE9前支持)
    • IE9之前沒有事件捕獲(因為IE9之前無法用addEventListener)
// 兼容性解決方案box.addEventListener('click', function(e) {alert('box');
// 兼容性寫法
if (e && e.stopPropagation) {e.stopPropagation(); //適用于ie9后
} else {window.event.cancelBubble = true; // 適用于ie678 
}
}, false);
工作實際案例場景:1、登錄頁面,登錄彈出框與后面父元素背景的點擊事件沖突時;2、移動端,某個彈出框,不希望點擊到陰影部分的功能;3、拓撲頁面存在點擊事件,需要在上層彈出某個彈框,可以拖拽改變頁面大小; 
6.事件委托(事件代理、事件委派)

? 把給每個子元素單獨設置事件監聽器的需求,改成事件監聽器設置在其父元素上,利用冒泡原理代理到子元素上。

  • 好處:減少綁定事件的次數,提高性能(只操作了一次 DOM ,提高了程序的性能),減少代碼冗余,即使新增的子元素也享有事件監聽器;

  • 需求:給li添加點擊事件,并且獲得里面的key值

    解決辦法1:給每個li添加點擊事件,這種方法代碼太過冗余

    優化解決辦法:把事件委托給ul元素,給它添加點擊事件方法,利用事件冒泡

  • <ul><li key="1">點我點我寶貝</li><li key="2">點我點我寶貝</li><li key="3">點我點我寶貝</li><li key="4">點我點我寶貝</li><li key="5">點我點我寶貝</li><span key="6">不是li</span><span key="7">不是li</span>
    </ul>
    <script>let ul = document.querySelector('ul');ul.addEventListener('click',function(e){if(e.target.tagName === 'LI'){ // 判斷是不是li標簽return e.target.getAttribute('key')}})
    </script>
    

7.常用的事件

①鼠標事件
鼠標事件觸發條件
onclick鼠標點擊左鍵觸發
onmouseover鼠標經過觸發
onmouseout鼠標離開觸發
onfocus獲取鼠標焦點觸發
onblur失去鼠標焦點觸發
onmousemove鼠標移動觸發
onmouseup鼠標彈起觸發
onmousedown鼠標按下觸發
contextmenu鼠標右鍵觸發(e.preventDefault() 阻止彈出右鍵菜單,場景:取消默認的上下文菜單,加入自己的菜單;復制網頁內容功能屏蔽)
selectstart鼠標選擇開始(e.preventDefault() ;場景:復制網頁內容功能屏蔽,禁止用戶選中)
MouseEvent鼠標事件對象說明(像素距離)
e.clientX鼠標相對于瀏覽器窗口可視區的X坐標(變)
e.clientY鼠標相對于瀏覽器窗口可視區的Y坐標(變)
e.pageX鼠標相對于頁面的X坐標 IE9+支持(doc)
e.pageY鼠標相對于頁面的Y坐標 IE9+支持(doc)
e.screenX鼠標相對于電腦屏幕的X坐標
e.screenY鼠標相對于電腦屏幕的Y坐標
②鍵盤事件

使用addEventListener 不需要加 on

鍵盤事件觸發條件
onkeydown/keydown按下時觸發,不區分大小寫字母,任何鍵
onkeyup/keyup松開時觸發,不區分大小寫字母,任何鍵
onkeypress/keypress按下時觸發,介于 keydown 和 keyup之間,(a-z0-9回車和空格),會區分大小寫,不識別功能鍵
鍵盤事件對象說明
keyCode返回該鍵的ASCII值

在這里插入圖片描述

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

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

相關文章

#WEB前端(CSS基礎)

1.實驗&#xff1a;HTML是網頁骨架&#xff0c;CCS是網頁裝修 2.IDE&#xff1a;VSCODE 3.記錄&#xff1a; style 4.代碼&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"view…

學習筆記-李沐動手學深度學習(七)(19-21,卷積層、填充padding、步幅stride、多輸入多輸出通道)

總結 19-卷積層 【補充】看評論區建議的卷積動畫視頻 數學中的卷積 【鏈接】https://www.bilibili.com/video/BV1VV411478E/?fromsearch&seid1725700777641154181&vd_sourcee81e116c4ffe5e79d4bc44738263eda4 【可判斷是否為卷積的典型標志】兩個函數中自變量相加…

數據結構項目實戰——通訊錄

c語言通訊錄 前言一、基于動態順序表實現通訊錄1 功能要求2 代碼實現 二、具體代碼實現需要使用的頭文件及宏定義通訊錄所需要的結構體通訊錄的初始化函數通訊錄的添加函數通訊錄的刪除函數比較函數主要函數 通訊錄的查找函數通訊錄的修改函數通訊錄的排序函數通訊錄的打印函數…

項目組合研究的問題

接著上篇項目集&#xff0c;再查了查項目組合研究的問題&#xff0c;項目組合主要關注組織如何有效地管理多個項目以實現戰略目標&#xff0c;以及在資源有限的情況下最大化整體價值。以下是項目組合研究中常遇到的關鍵問題&#xff1a; 戰略一致性&#xff1a; 如何確保項目組…

Salesforce CPQ - 02 - Quote Price

最近又有客戶來咨詢學習Salesforce CPQ&#xff0c;所以本人總結了下近幾年CPQ培訓的一些實際案例拿出來分享給大家&#xff1b; 再次介紹下本人是一位Salesforce十多年的從業者。 先來介紹下Salesforce的價格體系&#xff0c;再介紹下各個Product Price是如何配置及使用的&a…

測試需求平臺8-Arco組件實現產品增改需求

?此系列為整理分享已完結入門搭建《TPM提測平臺》系列的迭代版&#xff0c;擁抱Vue3.0將前端框架替換成字節最新開源的arco.design&#xff0c;其中約60%重構和20%新增內容&#xff0c;定位為從 0-1手把手實現簡單的測試平臺開發教程&#xff0c;內容將囊括基礎、擴展和實戰&a…

在什么時候企業檔案才會發生調整

檔案在企業中通常會調整在以下幾個時刻&#xff1a; 1. 入職時&#xff1a;員工入職時&#xff0c;企業會要求員工提供個人檔案&#xff0c;包括身份證件、學歷證明、工作經歷等相關文件。 2. 離職時&#xff1a;員工離職時&#xff0c;企業會整理員工的離職檔案&#xff0c;包…

題目 1619: 藍橋杯算法訓練VIP-字串統計

題目描述: 給定一個長度為n的字符串S&#xff0c;還有一個數字L&#xff0c;統計長度大于等于L的出現次數最多的子串&#xff08;不同的出現可以相交&#xff09;&#xff0c;如果有多個&#xff0c;輸出最長的&#xff0c;如果仍然有多個&#xff0c;輸出第一次出現最早的。 …

JDBC

概念&#xff1a; JDBC 就是使用Java語言操作關系型數據庫的一套API 全稱&#xff1a;( Java DataBase Connectivity ) Java 數據庫連接。 JDBC的本質&#xff1a; 官方&#xff08;sun公司&#xff09;定義的一套操作所有關系型數據庫的規則&#xff0c;即 接口各個數據庫廠…

ChatGPT-4.0:學術研究論文檢索的新篇章

ChatGPT-4.0&#xff1a;學術研究論文檢索的新篇章 在當代學術研究的廣闊天地&#xff0c;知識的追求始終在不斷進化&#xff0c;緊密擁抱能夠加強研究者探索和吸收信息能力的創新技術。ChatGPT-4.0的出現代表了學術探索的一次質的飛躍&#xff0c;為研究人員查詢學術論文提供…

Filebeat將csv導入es嘗試

一、安裝 在docker中安裝部署ELKfilebeat 二、主要配置 - type: log # Change to true to enable this input configuration. enabled: true # Paths that should be crawled and fetched. Glob based paths. paths: - /home/centos/pip_v2.csv #源路徑 #…

Sqli-labs靶場第15關詳解[Sqli-labs-less-15]

Sqli-labs-Less-15 #自動化注入-SQLmap工具注入 SQLmap用戶手冊&#xff1a;文檔介紹 - sqlmap 用戶手冊 由于這題是post請求&#xff0c;所以先使用burp進行抓包&#xff0c;然后將數據包存入txt文件中打包 用-r 選擇目標txt文件 python sqlmap.py -r data.txt -current-db…

Visual Studio C++項目遠程斷點調試客戶現場程序方法

前言 程序開發一個很常見的場景&#xff0c;就是程序在自己本地部署調試明明一點問題都沒有&#xff0c;但是部署到客戶現場就問題百出&#xff0c;要調試起來還很困難&#xff0c;在自己本地也沒有條件復現&#xff0c;很多時候只能靠日志一點點排查和猜測&#xff0c;耗費大…

我在代碼隨想錄|寫代碼Day31 | 貪心算法總結篇 | 貪心終結一題

&#x1f525;博客介紹&#xff1a; 27dCnc &#x1f3a5;系列專欄&#xff1a; <<數據結構與算法>> << 算法入門>> << C項目>> &#x1f3a5; 當前專欄: << 算法入門>> 專題 : 數據結構幫助小白快速入門算法 &#x1f4…

window使用hyper安裝centos及docker、kubenet\k8s

window虛擬機安裝centos&#xff1a; windows系統下安裝linux&#xff08;centos7&#xff09;虛擬機詳細教程&#xff08;virtualbox環境&#xff09;_windows安裝linux虛擬機-CSDN博客 準備3臺機器&#xff1a; 172.29.34.250 172.29.37.174 172.29.39.106 安裝教程&…

關于定時器 setTimeout 可能會引發的內存泄露

前言 setTimeout 本身并不直接引發內存泄露&#xff0c;但如果使用不當&#xff0c;確實可以間接導致內存泄漏。以下是一些使用 setTimeout 可能導致內存泄漏的情況&#xff1a; 閉包引用&#xff1a; 在 setTimeout 的回調函數中&#xff0c;如果引用了外部變量&#xff08;形…

AJAX實例

AJAX - Asynchronous JavaScript and XML - 異步的JavaScript與XML&#xff0c;不是一門新技術&#xff0c;只是一個新的術語。&#xff08;老技術新玩法&#xff09; - 使用AJAX&#xff0c;網頁能夠將增量更新呈現在頁面上&#xff0c;而不需要刷新整個頁面。 - 雖然X代表…

力扣1892 頁面推薦Ⅱ

力扣1892&#xff0c;頁面推薦Ⅱ&#xff0c;為一個社交媒體網站實施一個頁面推薦系統。如果頁面被user_id的 至少一個朋友喜歡 &#xff0c;而 不被user_id喜歡 &#xff0c;你的系統將 推薦 一個頁面到user_id。 目錄 題目描述 解題思路 完整代碼 優化 題目描述 表&…

【C++】cout 的默認精度

cout 的默認精度為&#xff1a; 四舍五入保留六位有效數字輸出。例如 123.4567 應該輸出為 123.457&#xff0c;5432.10 應該輸出為 5432.1。 一、使用C語言輸出符合cout默認精度的數值 double weight; scanf("%lf",&weight);printf("%.6g",weight)…

FlinkSql hint之狀態生命周期 state_ttl

狀態生命周期hint FlinkSQL 的 state ttl&#xff08;Time-To-Live&#xff0c;生存時間&#xff09;是一個用于管理狀態數據生命周期的機制。在 Flink 流處理中&#xff0c;狀態是一個重要的概念&#xff0c;它允許跨時間窗口或事件時間處理的狀態化操作。然而&#xff0c;隨…