---
title: 'JS 入門 - Event 事件 (下)'
tags: JS, Javascript, Event
description: 2021/01/25
---
JS 入門 -- Event 事件 (下)
===
內容承接 Event 事件 (上)
https://hackmd.io/@peggyted0129/Byv79ao1O
---
## 了解目前所在元素的位置 — e.target
* ==event.target 屬性則是永遠指向觸發事件的 DOM 物件。==
* 如果我們的網頁上面有好幾層元素,要知道自己==當下觸發的到底是哪個元素==,可以用事件監聽 + 函式內執行 e.target 來得知。
* 更精確地確認點擊元素 : 追蹤**節點名稱nodeName**
```
<div class="header">
<ul style="padding-top:100px;border: 1px solid #000">
<li>
<a href="#">123</a>
</li>
</ul>
</div>
```
```typescript
var el = document.querySelector('.header');
el.addEventListener('click', function(e){
console.log(e.target); // <a href="#">123</a>
console.log(e.target.nodeName); // 節點名稱 UL、LI、A
};
```
## 表單內容變更時觸發 — change
* 此事件僅限用於 元素、 和 元素,當元素的值改變時,change 事件就會觸發。
* 對於下拉選擇框、複選框和單選按鈕,當使用者用游標作出選擇,該事件立即觸發
* 思考 [範例程式碼](https://codepen.io/Peggyted0129/pen/WNGqEqX)
1. 點擊 <select> 時,撈出區域資料做比對
→ 對下拉式選單 <select> 做監聽,當我變更資料時,會觸發change事件
2. 當撈出苓雅區,下方會出現農夫名字 → 要先組 li 字串,帶入HTML裡 → 會使用for迴圈,在array撈出各種資料 → 透過if把資料篩出來 → 把資料帶入HTML
3. 利用e.target選取 <select> 的元素位置,再用e.target.value取出元素的值
## 按下鍵盤的觸發事件 — keyCode / keydown
按下鍵盤的那個剎那,就可以取得對應的鍵盤代碼,也就是所謂的 keyCode。
**1. document.body 其實指的就是回傳HTML的<body>這個節點,也就是整個網頁內容的意思。**
2. JS程式碼可以理解為 : 監聽整個網頁內容,當在這個網頁時有按下鍵(keydown 事件),就執行 goRocket 這個函式。
```typescript
var body = document.body;
function goRocket(e) {
console.log(e.keyCode); // 查鍵盤代碼, EX: 49、50、51
}
// 偵測按下按鍵的行為
body.addEventListener('keydown', goRocket, false);
```
按數字 1(代碼 = 49)時,發射 1 號火箭(將 CSS bottom 屬性從 0 變成 2000);按數字 2 跟 3 時同理類推。
```typescript
var body = document.body;
function goRocket(e) {
switch (e.keyCode) {
case 49:
document.querySelector(".rocket-1").style.bottom = "2000px";
break;
case 50:
document.querySelector(".rocket-2").style.bottom = "101%";
break;
case 51:
document.querySelector(".rocket-3").style.bottom = "101%";
break;
}
}
body.addEventListener('keydown', goRocket, false);
```
:bulb: [範例程式碼](https://codepen.io/PeiHan/pen/abmGYdV?editors=1010)
## 離開焦點時觸發 — blur
1. 綁定 blur 事件的效果是,當元素失去焦點時會觸發特定行為。
2. 可以用在表單的防呆上(提醒使用者沒有填到的欄位必填等等)。
:bulb: [範例程式碼](https://codepen.io/Peggyted0129/pen/OJReZEX?editors=1010)
## 當游標滑到特定元素時觸發 — mousemove
:bulb: [範例程式碼](https://jsbin.com/venuqoreqi/edit?html,css,js,console,output)
```
<style>
.box {
width: 100px;
height: 100px;
background: #000;
}
</style>
<body>
<div class="box"></div>
</body>
```
```typescript
var el = document.querySelector('.box');
el.addEventListener('mousemove', function(){
alert('滑鼠滑過去了');
}, false);
```
## 網頁座標 — screen、page、client
* 如何偵測目前滑鼠的座標
* screen : 「螢幕解析度」的 X 軸、Y 軸座標
* page : 代表「網頁」的 X 軸、Y 軸座標
* client : 瀏覽器「視窗」的 X 軸、Y 軸座標
:bulb: [範例程式碼](https://codepen.io/Peggyted0129/pen/VwKJdKa)
## 事件監聽優化篇 — 從父元素來監聽子元素內容
```
<ul class="list">
<h2>HELLO</h2>
<li>查理</li>
<li>卡斯伯</li>
<a href="#">a連結</a>
</ul>
```
使用 return 中斷資料,後面程式碼不會執行、直接結束。
```typescript
var list = document.querySelector('.list');
list.addEventListener('click', checkName, false);
function checkName(e){
// 如果不是選取LI就直接結束
if(e.target.nodeName !== "LI"){ return }
//取出LI節點內的文字
console.log(e.target.textContent); // 查理、卡斯伯
}
```
<style>
.red {
color: red;
}
</style>
## :memo: 筆記
:::info
回傳<span class="red">**值**</span>用 e.target.value
回傳<span class="red">**文字**</span>用 e.target.textContent
:::