JavaScript的事件流你了解嗎
1. 什么是事件流 ?
在學習事件流之前我們先看看什么是事件 ?
事件代表文檔或瀏覽器窗口中某個有意義的時刻
即用戶與頁面的交互動作(如用戶點擊元素時,鼠標移動到某個元素上等等)
事件的作用
JavaScript 與 HTML 的交互就是通過事件實現(xiàn)的
那么事件流是什么呢 ?
頁面接受事件的順序
2. 事件流模型
2.1) 事件冒泡
事件被定義為從最具體的元素(DOM 樹的葉子)開始觸發(fā),然后向上傳播至沒有那么具體的元素(DOM 樹的根節(jié)點)
通過一個例子理解一下:
<!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>點擊</div>
</body>
</html>
當點擊 <div> 元素后,會觸發(fā) click 事件;
然后 click 事件沿 DOM 樹一路向上,在經(jīng)過的結(jié)點依次觸發(fā),直至 document;
即 <div> —> <body> —> <html> —> document
可以通過下圖來理解一下:

2.2) 事件捕獲
從最不具體的節(jié)點(DOM 樹的根節(jié)點)最先收到事件,而最具體的節(jié)點(DOM 樹的葉子 )應(yīng)該最后收到事件
通過一個例子來理解一下:
<!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>點擊</div>
</body>
</html>
在點擊 <div> 后, click 事件首先由 document 捕獲;
然后沿 DOM 樹一路向下傳播,直至達到目標元素 <div>;
即 document —> <html> —> <body> —> <div>
通過下圖來理解一下:

根據(jù)它的特點,它有著如下作用:
在事件達到最終目標前攔截事件
Tips:
由于一些舊版本瀏覽器不支持事件捕獲,通常建議使用事件冒泡。
3. DOM 事件流
DOM2 Events 規(guī)定事件流分為 3 個階段:
事件捕獲、達到目標和事件冒泡。
事件捕獲最先發(fā)生,為提前攔截事件提供了可能
然后實際的目標元素接受到了事件
最后事件冒泡(最遲要在這個階段響應(yīng)事件)
通過一個例子理解一下:
<!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>點擊</div>
</body>
</html>
點擊<div> 元素后,以如下圖所示的順序觸發(fā)事件

在 DOM 事件流中,實際的目標元素在捕獲階段不會接收到事件(捕獲階段從 document 到 <body> 就結(jié)束了)。
捕獲階段: document —> <html> —> <body> 即圖中的 1, 2, 3;達到目標:即在 <div> 上觸發(fā)事件,即圖中的 4 (通常在事件處理時,被認為是冒泡階段的一部分);冒泡階段:<body> —> <html> —> document 即圖中的 5, 6, 7;
Tips:
雖然 DOM2 Events 規(guī)范明確捕獲階段不命中目標事件,但現(xiàn)代瀏覽器都會在捕獲階段在事件目標上觸發(fā)事件。
所以,在事件目標上有兩個機會來處理事件。
總結(jié)
本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
詳解JavaScript中undefined與null的區(qū)別
大多數(shù)計算機語言,有且僅有一個表示"無"的值,比如,C語言的NULL,Java語言的null,Python語言的none,Ruby語言的nil2014-03-03
javascript的delete運算符知識點總結(jié)
在本篇文章里小編給大家分享的是關(guān)于JS中delete運算符的基礎(chǔ)知識點,有需要的朋友們跟著學習下。2019-11-11
高性能的javascript之加載順序與執(zhí)行原理篇
這篇文章主要給大家介紹了關(guān)于高性能的javascript之加載順序與執(zhí)行原理的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧。2018-01-01
jquery中prop()方法和attr()方法的區(qū)別淺析
官方例舉的例子感覺和attr()差不多,也不知道有什么區(qū)別,既然有了prop()這個新方法,不可能沒用吧,那什么時候該用attr(),什么時候該用prop()呢2013-09-09
在JavaScript中使用對數(shù)Math.log()方法的教程

