一起來(lái)學(xué)習(xí)一下JavaScript的事件流
1. 什么是事件流 ?
在學(xué)習(xí)事件流之前我們先看看什么是事件 ?
事件代表文檔或?yàn)g覽器窗口中某個(gè)有意義的時(shí)刻
即用戶與頁(yè)面的交互動(dòng)作
(如用戶點(diǎn)擊元素時(shí),鼠標(biāo)移動(dòng)到某個(gè)元素上等等)
事件的作用
JavaScript
與HTML
的交互就是通過(guò)事件實(shí)現(xiàn)的
那么事件流是什么呢 ?
頁(yè)面接受事件的順序
2. 事件流模型
2.1) 事件冒泡
事件被定義為從最具體的元素(DOM 樹(shù)的葉子)開(kāi)始觸發(fā),然后向上傳播至沒(méi)有那么具體的元素(DOM 樹(shù)的根節(jié)點(diǎn))
通過(guò)一個(gè)例子理解一下:
<!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>事件冒泡</title> </head> <body> <div>點(diǎn)擊</div> </body> </html>
當(dāng)點(diǎn)擊 <div>
元素后,會(huì)觸發(fā) click
事件;
然后 click
事件沿 DOM
樹(shù)一路向上,在經(jīng)過(guò)的結(jié)點(diǎn)依次觸發(fā),直至 document
;
即 <div>
—> <body>
—> <html>
—> document
可以通過(guò)下圖來(lái)理解一下:
2.2) 事件捕獲
從最不具體的節(jié)點(diǎn)(DOM 樹(shù)的根節(jié)點(diǎn))最先收到事件,而最具體的節(jié)點(diǎn)(DOM 樹(shù)的葉子 )應(yīng)該最后收到事件
通過(guò)一個(gè)例子來(lái)理解一下:
<!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>事件捕獲</title> </head> <body> <div>點(diǎn)擊</div> </body> </html>
在點(diǎn)擊 <div>
后, click
事件首先由 document
捕獲;
然后沿 DOM
樹(shù)一路向下傳播,直至達(dá)到目標(biāo)元素 <div>
;
即 document
—> <html>
—> <body>
—> <div>
通過(guò)下圖來(lái)理解一下:
根據(jù)它的特點(diǎn),它有著如下作用:
在事件達(dá)到最終目標(biāo)前攔截事件
Tips:
由于一些舊版本瀏覽器不支持事件捕獲,通常建議使用事件冒泡。
3. DOM 事件流
DOM2 Events 規(guī)定事件流分為 3 個(gè)階段:
事件捕獲、達(dá)到目標(biāo)和事件冒泡。
事件捕獲最先發(fā)生,為提前攔截事件提供了可能,然后實(shí)際的目標(biāo)元素接受到了事件,最后事件冒泡(最遲要在這個(gè)階段響應(yīng)事件)
通過(guò)一個(gè)例子理解一下:
<!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>DOM 事件流</title> </head> <body> <div>點(diǎn)擊</div> </body> </html>
點(diǎn)擊<div>
元素后,以如下圖所示的順序觸發(fā)事件
在 DOM
事件流中,實(shí)際的目標(biāo)元素在捕獲階段不會(huì)接收到事件(捕獲階段從 document
到 <body>
就結(jié)束了)。
- 捕獲階段:
document
—><html>
—><body>
即圖中的 1, 2, 3; - 達(dá)到目標(biāo):即在
<div>
上觸發(fā)事件,即圖中的 4 (通常在事件處理時(shí),被認(rèn)為是冒泡階段的一部分); - 冒泡階段:
<body>
—><html>
—>document
即圖中的 5, 6, 7;
Tips:
雖然 DOM2 Events 規(guī)范明確捕獲階段不命中目標(biāo)事件,但現(xiàn)代瀏覽器都會(huì)在捕獲階段在事件目標(biāo)上觸發(fā)事件。所以,在事件目標(biāo)上有兩個(gè)機(jī)會(huì)來(lái)處理事件。
總結(jié)
本篇文章就到這里了,希望能夠給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
JavaScript學(xué)習(xí)筆記整理_setTimeout的應(yīng)用
下面小編就為大家?guī)?lái)一篇JavaScript學(xué)習(xí)筆記整理_setTimeout的應(yīng)用。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-09-09<script defer> defer 是什么意思
好多朋友不知道 script后面加個(gè)defer是什么意思有什么作用。2009-05-05如何用javascript計(jì)算文本框還能輸入多少個(gè)字符
這篇文章主要介紹了如何使用javascript計(jì)算文本框還能輸入多少個(gè)字符,需要的朋友可以參考下2015-07-07JavaScript DOM 學(xué)習(xí)第五章 表單簡(jiǎn)介
在這一章我主要介紹一些用來(lái)檢測(cè)用戶輸入的代碼,利用這些代碼,你也可以寫一些自己的檢測(cè)函數(shù)。2010-02-02實(shí)例區(qū)別onClick和onDBClick兩事件方法
實(shí)例區(qū)別onClick和onDBClick兩事件方法2008-09-09JavaScrip關(guān)于創(chuàng)建常量的知識(shí)點(diǎn)
這篇文章主要介紹了JavaScrip創(chuàng)建常量的相關(guān)知識(shí)點(diǎn),幫助大家對(duì)JS更加深入的學(xué)習(xí),參考下吧。2017-12-12