# 2-1 、 用 JS 聽案件發生
###### tags: `FE102` `HTML+CSS` `2020九月第一周` `進度筆記` `Lidemy心得` 09/03
---
## EventListener
***
__==參考 [`EventListener.handleEvent()` - MDN](https://developer.mozilla.org/zh-TW/docs/Web/API/EventListener/handleEvent) 。==__
- 可以對監聽的事件做出反應,例如 User 點擊按鈕或文字(元素),這些事件觸發後,瀏覽器就會幫你觸發函式。
***
存成 index.html 檔案,實際上是 `<script src="./index.js"></script>` 指向 .js 檔案:
```
<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>瀏覽器上執行 JS</title>
<style>
.active {
background: orange;
}
</style>
</head>
<body>
<div id='block'>
Hello ?!
<a>Yolo~</a>
</div>
<script>
const element = document.querySelector('#block')
element.addEventListener('click', onClick)
function onClick() {
alert('Click yo !')
}
</script>
</body>
</html>
```
- `element.addEventListener('監聽的事件名稱', 傳一個 function )` : call back function 。
- 下面用的 anonymous function 跟 call back function 沒甚麼關係,只是無名。
- click Hello ?! Yolo~ 會產生視窗跟你 say Click yo !

- 比較常看到的寫法可能是: ``element.addEventListener('click', function() {})`` ; 直接宣告一個 function 在 () 內。
***
參考資料:
[何謂callback function? - iT 邦幫忙::一起幫忙解決難題,拯救IT ...](https://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=&ved=2ahUKEwio2MqNzd3rAhXoxYsBHabcB60QFjAAegQIAxAB&url=https%3A%2F%2Fithelp.ithome.com.tw%2Farticles%2F10006207&usg=AOvVaw0ugQBa6wFZIAJvbjc9ZI7L)
[重新認識JavaScript: Day 18 Callback Function 與IIFE - iT 邦幫忙](https://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=&ved=2ahUKEwio2MqNzd3rAhXoxYsBHabcB60QFjABegQIFRAB&url=https%3A%2F%2Fithelp.ithome.com.tw%2Farticles%2F10192739&usg=AOvVaw2mbdkbR-1vV2tnH-tCsGKb)
[回呼函式\- 術語表| MDN](https://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=&ved=2ahUKEwio2MqNzd3rAhXoxYsBHabcB60QFjAEegQIBBAB&url=https%3A%2F%2Fdeveloper.mozilla.org%2Fzh-TW%2Fdocs%2FGlossary%2FCallback_function&usg=AOvVaw1AL8vWCOKkBvzG_w1NUY0X)
---
# 2-2 、 call back function (補充)
###### tags: `FE102` `HTML+CSS` `2020九月第一周` `進度筆記` `Lidemy心得` 09/03
---
==2-1 提到的 - `element.addEventListener('監聽的事件名稱', 傳一個 function )` : call back function 。==
- 為何這樣寫?
1. 因為不知道 User 何時按按鈕,所以無法一直停在這等。
- 例如這樣寫的話,程式 會一直卡在這,無法做其他事情:
```
<script>
const element = document.querySelector('#block')
element.addEventListener('click', function() {})
const event.addEventListener('click')
</script>
```
2. 以 EventListener 來說,可以告訴瀏覽器,當有人點擊按鈕時,觸發事件後,幫忙呼叫 function 。
3. 例如在百貨公司美食街吃飯時不可能一直排在那,會給你一個震動提示器,餐點好了後會叫你這樣。
---
# 2-3 、 E for Everything
###### tags: `FE102` `HTML+CSS` `2020九月第一周` `進度筆記` `Lidemy心得` 09/04
==之前 EventListener 點擊事件補充。==
- 瀏覽器對應事件 (event) 呼叫參數的時候,會有所紀錄。
- 而像 ``addEventListener('keyDown', function(e)`` , 有人會取名 (evt) 。
- event 簡寫 e , e 這個名稱是可以自己取名的,是一 個參數。
---
存成 index.html 檔案,實際上是 `<script src="./index.js"></script>` 指向 .js 檔案:
```
<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>瀏覽器上執行 JS</title>
<style>
.active {
background: orange;
}
</style>
</head>
<body>
<div id='block'>
Hello ?!
<a>Yolo~</a>
</div>
<script>
const element = document.querySelector('#block')
element.addEventListener('click', function(e) {
console.log(e)
})
</script>
</body>
</html>
```
- 如果對 "e" 進行 log , 再用 dev tool 看會發現:

回傳並記錄了許多參數。
- 瀏覽器會對應 event , 呼叫 function 對應並代入許多參數。
- 這個 e 是一個 Mouse Event , target 是比較重要的代表點了哪個元素。
- 可以用 `console.log(e.target)` 找出拿到了甚麼元素。
## keydown
用上面的 .html 檔案,代入 ``<script></script>`` :
```
<body>
<div id='block'>
Hello ?!
<input />
<a>Yolo~</a>
</div>
<script>
const element = document.querySelector('#block')
element.addEventListener('keydown', function(e) {
console.log(e)
})
</script>
</body>
```
- 會記錄按的哪個按鍵,可以用 e 來拿到按到的資訊。
## 也可以做到觸發事件換背景顏色
```
<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>瀏覽器上執行 JS</title>
<style>
.active {
background: orange;
}
</style>
</head>
<body>
<div id='block'>
Hello ?!
<input />
<a>Yolo~</a>
<button class='change-btn'>change</button>
</div>
<script>
const element = document.querySelector('.change-btn')
element.addEventListener('click', function(e) {
document.querySelector('body').classList.toggle('active')
})
</script>
</body>
</html>
```
- event 觸發 CSS 更改背景樣式。
---
參考資料:
[重新認識JavaScript 番外篇(6) - 網頁的生命週期 - iT 邦幫忙 ...](https://ithelp.ithome.com.tw/articles/10197335)
[Event.target - MDN Web Docs - Mozilla](https://developer.mozilla.org/zh-TW/docs/Web/API/Event/target)
---
# 2-4 、 表單事件處理 onSubmit
###### tags: `FE102` `HTML+CSS` `2020九月第一周` `進度筆記` `Lidemy心得` 09/04
## __==表單送出以前觸發事件。==__
- 像是用在表單驗證、不要送出...等。
---
.html 內:
```
<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>瀏覽器上執行 JS</title>
<style>
.active {
background: orange;
}
</style>
</head>
<body>
<form class='login-form' method='GET' action=''>
<div>
username: <input name='username' />
</div>
<div>
password: <input name='password' type='password' />
</div>
<div>
password again: <input name='password2' type='password' />
</div>
<input type='submit' />
</form>
<script>
const element = document.querySelector('.login-form')
element.addEventListener('submit', function(e) {
alert('submit!')
})
</script>
</body>
</html>
```
- 要注意密碼要給 code 一個 type='password' 。
- 表單送出,如果沒有指定送出的話,預設就是同一個網頁。
- 表單的網頁如沒有指定 method 的話預設動作就是 GET 。
---
## __==如果不想送出表單。==__
- 可以在 ``function(e) {e.preventDefault()}`` 這樣做。
- 會阻止瀏覽器的預設行為,送出表單的這個動作。
---
詳細一點如果密碼不同可以這樣做:
```
<script>
const element = document.querySelector('.login-form')
element.addEventListener('submit', function(e) {
const input1 = document.querySelector('input[name=password]')
const input2 = document.querySelector('input[name=password2]')
if(input1.value !== input2.value) {
alert('密碼不同')
e.preventDefault()
}
})
</script>
```
- 輸入的密碼不同就不會提交表單。

***
# 2-5 、 阻止預設行為
###### tags: `FE102` `HTML+CSS` `2020九月第一周` `進度筆記` `Lidemy心得` 09/04
## `e.preventDefault`
==以 2-4 的阻止密碼送出,設定個超連結:==
```
<a href='/test'>link</a>
</form>
<script>
const element = document.querySelector('.login-form')
element.addEventListener('click', function(e) {
e.preventDefault()
})
</script>
```
- 幫超連結點擊加上了阻止送出。
## 或是阻止某些字輸入
==以 2-4 的阻止密碼送出,設定個阻止字元輸入:==
```
<script>
const element = document.querySelector('input[name=username]')
element.addEventListener('keypress', function(e){
if (e.key === 'e') {
e.preventDefault()
}
})
</script>
```
- 可以阻止使用小寫 e 的字元輸入。
- 常見在表單的送出還有超連結。
***
參考資料:
[Event.preventDefault() - MDN Web Docs - Mozilla](https://developer.mozilla.org/zh-TW/docs/Web/API/Event/preventDefault)
[[筆記][JavaScript]所謂的「停止事件」到底是怎麼一 ... - iT 邦幫忙](https://ithelp.ithome.com.tw/articles/10198999)
---