---
# System prepended metadata

title: 事件監聽常用種類
tags: [JavaScript, JS 直播班  - 2021 秋季班]

---

# 事件監聽常用種類
###### tags: `JavaScript` `JS 直播班  - 2021 秋季班`
JavaScript是一個事件驅動( event-driven )的程式語言,當瀏覽器載入網頁開始讀取後，雖然馬上會讀取 JavaScript 事件相關的程式碼，但是必須等到「事件」被觸發(如使用者點擊、按下鍵盤等)後，才會再進行對應程式的執行。

例如:
當使用者點擊了按鈕，才會啟動對話框的顯示
那麼「點擊按鈕」這件事，就被稱作 **「事件」(Event)**
而負責處理事件的程式通常被稱為 **「事件處理者」(Event Handler)**
也就是 **「啟動對話框的顯示」** 這個動作。

## <font color=#690E50>事件流程 Event Flow</font>
Event flow 就是 **網頁元素接收事件的順序**,執行方式有兩種
### <font color=#0E6946>1. 事件冒泡 (Event Bubbling):</font>
從觸發事件的元素節點,事件由<font color='red'>下</font>逐漸往<font color='red'>上</font>傳遞
```=HTML
<!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>Document</title>
</head>
<body>
    
    <div class="touch">觸發</div>

</body>
</html>
```
當我們點擊了"觸發"這塊div,如果是 **事件冒泡** 的情況下,傳遞順序為

***div -> body -> html -> document***

### <font color=#0E6946>2. 事件捕獲 (Event Capturing)</font>
從觸發事件的元素的 **根節點** 開始,事件由<font color='red'>上</font>逐漸往<font color='red'>下</font>傳遞

當我們點擊了"觸發"這塊div,如果是 **事件捕獲** 的情況下,傳遞順序為

***document -> html -> body -> div***

### <font color=#0E6946> 那事件會執行哪一種? </font>
***ANSWER:兩種都會執行***
![](https://i.imgur.com/UdLQuUC.png)

以上面例子來看,點擊"觸發"這塊DIV
會先執行 事件捕獲 ***document -> html -> body -> div***
碰到DIV時在執行 事件冒泡 ***div -> body -> html -> document***
回到document才算完成


## <font color=#690E50>事件監聽 EventTarget.addEventListener()</font>
使用這種方式來註冊事件的好處是可以重複指定多個「處理器」(handler) 給同一個元素的同一個事件
addEventListener() 基本上有三個參數
1. 分別是「事件名稱」
2. 「事件的處理器」(事件觸發時執行的 function)，
3. 一個「Boolean」值，由這個 Boolean 決定事件是以「捕獲」或「冒泡」機制執行，若不指定則預設為「冒泡」。
```=HTML
    <div class="touch">觸發</div>
    <button type='submit' class='bt'>傳送</button>
    <script src="test.js"></script>
```
```=JavaScript
let btn=document.querySelector(".bt"); //一個元素可以重複指定多個handler

btn.addEventListener('click', function(){
    console.log('HI');
  }, false);
 
btn.addEventListener('click', function(){
    console.log('good night');
  }, false);
```
### <font color=#0E6946> callback function </font>
先註冊一個事件，程式不會停下來等，繼續去跑其他地方，等事件被觸發了才執行 callback function 的內容。
### <font color=#0E6946> 如何移除事件? removeEventListener() </font>
```=JacaScript
// 把 event handler 拉出來
let btn=document.querySelector(".bt");

let clickHandler=function(){
    console.log('HI');
};
btn.addEventListener('click', clickHandler,false);

btn.removeEventListener('click',clickHandler,false); //一個removeEventListener只能對應一個handler哦~
```

## <font color=#690E50>常見事件監聽種類</font>



| name      | description                                  | 傳播方式        |
| --------- |:-------------------------------------------- | --------------- |
| click     | 滑鼠點擊物件時                               | event bubble    |
| dbclick   | 滑鼠連點二下物件時                           | event bubble    |
| mouseover | 將鼠標移動到元素或其子元素之一上             | event bubble    |
| resize    | 當視窗或框架大小被改變時                     | event capturing |
| keydown          |        按下鍵盤按鍵時                                      |    
|  keypress         |       按下並放開鍵盤按鍵後,當按下鍵盤不放時，則會不斷地連續觸發該事件。 |  
|    keyup       |     放開鍵盤的那個剎那，觸發該事件       |                 
| change    | 物件內容改變時                  event bubble | 


## 參考資料
[[第七週] DOM - 操作 DOM 介面、事件監聽](https://yakimhsu.com/project/project_w7_DOM.html)
[JavaScript DOM Event (事件處理)](https://www.fooish.com/javascript/dom/event.html)