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中undefined與null的區(qū)別
大多數(shù)計(jì)算機(jī)語(yǔ)言,有且僅有一個(gè)表示"無(wú)"的值,比如,C語(yǔ)言的NULL,Java語(yǔ)言的null,Python語(yǔ)言的none,Ruby語(yǔ)言的nil2014-03-03
javascript的delete運(yùn)算符知識(shí)點(diǎn)總結(jié)
在本篇文章里小編給大家分享的是關(guān)于JS中delete運(yùn)算符的基礎(chǔ)知識(shí)點(diǎn),有需要的朋友們跟著學(xué)習(xí)下。2019-11-11
高性能的javascript之加載順序與執(zhí)行原理篇
這篇文章主要給大家介紹了關(guān)于高性能的javascript之加載順序與執(zhí)行原理的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2018-01-01
jquery中prop()方法和attr()方法的區(qū)別淺析
官方例舉的例子感覺(jué)和attr()差不多,也不知道有什么區(qū)別,既然有了prop()這個(gè)新方法,不可能沒(méi)用吧,那什么時(shí)候該用attr(),什么時(shí)候該用prop()呢2013-09-09
HTML代碼中標(biāo)簽的全部屬性 中文注釋說(shuō)明
所有在IE環(huán)境下有效可用的對(duì)象屬性都在下面.學(xué)習(xí)HTML的朋友可以借鑒學(xué)習(xí),也可以拿去嚇人,2009-03-03
淺談JavaScript實(shí)現(xiàn)面向?qū)ο笾械念?lèi)
這篇文章主要簡(jiǎn)單介紹了JavaScript實(shí)現(xiàn)面向?qū)ο笾械念?lèi)的相關(guān)概念,并給出了示例,這類(lèi)推薦給大家,希望對(duì)大家能有所幫助2014-12-12
在JavaScript中使用對(duì)數(shù)Math.log()方法的教程
這篇文章主要介紹了在JavaScript中使用對(duì)數(shù)Math.log()方法的教程,是JS入門(mén)學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2015-06-06

