一起來學習一下JavaScript的事件流

1. 什麼是事件流 ?

在學習事件流之前我們先看看什麼是事件 ?

事件代表文檔或瀏覽器窗口中某個有意義的時刻

即用戶與頁面的交互動作

(如用戶點擊元素時,鼠標移動到某個元素上等等)

事件的作用

JavaScript 與 HTML 的交互就是通過事件實現的

那麼事件流是什麼呢 ?

頁面接受事件的順序

2. 事件流模型

2.1) 事件冒泡

事件被定義為從最具體的元素(DOM 樹的葉子)開始觸發,然後向上傳播至沒有那麼具體的元素(DOM 樹的根節點)

通過一個例子理解一下:

<!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 事件;

然後 click 事件沿 DOM 樹一路向上,在經過的結點依次觸發,直至 document

即 <div> —> <body> —> <html> —> document

可以通過下圖來理解一下:

在這裡插入圖片描述

2.2) 事件捕獲

從最不具體的節點(DOM 樹的根節點)最先收到事件,而最具體的節點(DOM 樹的葉子 )應該最後收到事件

通過一個例子來理解一下:

<!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>

通過下圖來理解一下:

在這裡插入圖片描述

根據它的特點,它有著如下作用:

在事件達到最終目標前攔截事件

Tips:

由於一些舊版本瀏覽器不支持事件捕獲,通常建議使用事件冒泡。

3. DOM 事件流

DOM2 Events 規定事件流分為 3 個階段:

事件捕獲、達到目標和事件冒泡

事件捕獲最先發生,為提前攔截事件提供瞭可能,然後實際的目標元素接受到瞭事件,最後事件冒泡(最遲要在這個階段響應事件)

通過一個例子理解一下:

<!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> 元素後,以如下圖所示的順序觸發事件

在這裡插入圖片描述

在 DOM 事件流中,實際的目標元素在捕獲階段不會接收到事件(捕獲階段從 document 到 <body> 就結束瞭)。

  • 捕獲階段: document —> <html> —> <body> 即圖中的 1, 2, 3;
  • 達到目標:即在 <div> 上觸發事件,即圖中的 4 (通常在事件處理時,被認為是冒泡階段的一部分);
  • 冒泡階段:<body> —> <html> —> document 即圖中的 5, 6, 7;

Tips:

雖然 DOM2 Events 規范明確捕獲階段不命中目標事件,但現代瀏覽器都會在捕獲階段在事件目標上觸發事件。所以,在事件目標上有兩個機會來處理事件。

總結

本篇文章就到這裡瞭,希望能夠給你帶來幫助,也希望您能夠多多關註WalkonNet的更多內容!    

推薦閱讀: