---
# System prepended metadata

title: W_JS30紀錄本
tags: [DOM]

---

# W_JS30紀錄本
[TOC]
## JS-01
下方兩個行為有相識，但能力不同
### onclick() 只能單一綁定事件

### addEventListener() 可以綁定多個事件
也就是說當在處理動作時，addEventListener()可以處理較多的動，而onclick()只能處理一次

addEventListener()可以放兩個參數
1. event 事件
設定指定要的動作，比方 click, mouseenter, mouseleave...，而這些動作稱之為type
2. function 
是 callback func，設定觸發event時，會執行的動作
3. 先不論述

### querySelector 選擇器
主要功能是選取 HTML 的 DOM 元素，像 getElementById()，但是query...()可以選擇 id 跟 class，後者則只能選 id

### Event 事件
keydown：作用是按下鍵盤按鍵可觸發事件，任意按鍵都可，按住會連續觸發
keypress：不同於keypress在於，只能對文字件有反應，如esc、arrow、backspace...等無效
keyup：放開按鍵時觸發，不能連續觸發

### classList

是DOMTokenList一種實例，用來選取 html 裡的 class，並且管理與操縱 css 的元素。
在此題作用中，css 裡有一個 class，裡面建立放大屬性 .playing{...}(這題中它只是一個 css 工具包，html種沒有此class)
> //以下皆為DOMTokenList的方法，可以先想像是不同層級，緊接在class之後(ex : const.classList.add("css class without ."))
- add(className)：添加一個類別。
- remove(className)：移除指定的類別。
- toggle(className)：如果該類別存在就移除，否則添加。
- contains(className)：檢查元素是否包含某個類別。

### data-*
＊是一個屬性名稱，可以隨意取名，個人認知上用法有點類似object

### currentTime 
是`HTML DOM API` 的其中一個接口 `HTMLMediaElement` 裡面的其中一個屬性(屬性很多)。特色是針對 HTML 裡面的 Media tag 做編輯，`audio`、`video`

---

## JS-02

### Date()
他是標準內建物件(build-in object)中的其中一個物件(array、function 也是喔)，範例中是` const now = new Date();`，而這個date()是基於世界標準時間(UTC)而運作。
#### getSeconds()
Date()底下的其中一個實例，所以關係可以理解為：標準內建物件 > Date > getSeconds，作用是取的UTC的秒數

### 改變 CSS style
前提要先提取class，使用前面教到的選取器 querySelector(".hand")，要改時就用，舉例 `hand.style.transition ＝ rotate(${...}deg)`，這樣就可以改了

### setInterval
操作func呼叫的間歇時間，比方設定1000毫秒(1秒)，它就會間隔1秒呼叫(使用)一次。

### 這題指針過0時會出現bug的解法
為什麼querySelectorAll可以使用forEach，目前已知：他跟NodeList有關連性，而NodeList 類似array ，可以操作array方法，但它只是像，並非array，如果是getElementById等等是HTMLCollection(日後更多案例在研究)
```javascript=

if (seconds === 0) {
    pauseTransition();
}


function pauseTransition() {
    document.querySelectorAll(".hand").forEach((hand) => {
    hand.style.transition = `none`;
});
 

setTimeout(() => {
        document.querySelectorAll(".hand").forEach((hand) => {
            hand.style.transition = `all 0.05s`;
          }, 1000);
    });
}

```

---

## JS-03

### change 事件
作為addEventListener()旗下的事件，它能針對html裡面的 input、select、textarea 來調整內容，

### NodeList HTMLcollection
- NodeList 靜態
- HTMLcollection 動態

---

## JS-04

### ?
叫做條件運算子，作用是簡易的if else，已知只有簡易判斷true false的能力，以下為MDN範例

```javascript=
var age = 26;
var beverage = age >= 21 ? "Beer" : "Juice";
console.log(beverage); // "Beer"

---

function greeting(person) {
  var name = person ? person.name : "stranger";
  return "Howdy, " + name;
}

console.log(greeting({ name: "Alice" })); // "Howdy, Alice"
console.log(greeting(null)); // "Howdy, stranger"
```
---

## JS-05

---

## JS-06
### fetch
- window底下獲取資源方法，**請求**後，若成功會獲的一個 promise (產生Respnse)
- 如果沒有成功獲取資料，fetch 也不會提示https錯誤狀態碼(404等)，可透過.then檢查Response.ok 和/或 Response.status 



### Wes bos 範例
```javascript=
fetch(e).then(blob => JSON.parse(blob))
```
>blob可以是一個表示污點的意思

上方，JSON.parse無法作用，blob必須使用原生data轉換成 JSON 檔，這是因為fetch最初不能解析檔案，即便我們都知道他是Json擋，這是因為fetch最一開始，所以Wes開啟devtool檢視發現blob的原型練中有json屬性，後來就改成如下
```javascript=
fetch(e).then(blob => blob.json())
```
使用成功後會在取到下一個promise，這時要再做一次`.then`

### ...展開運算符
可以理解為陣列剝香蕉皮
```javascript=
//建立一個func 裡面接收3個參數 abc
function pellBanana(a,b,c){
    return a + b + c
}

//變數存放值
const BananaNotPellYet = [1,2,3]
//呼叫 pellBanana 並傳入 notPellYet
pellBanana(BananaNotPellYet)
pellBanana(...notPellYet)
```
在這裡 BananaNotPellYet 是陣列，如果直接將陣列傳入會變成
- a = [1,2,3]
- b,c 會是undefined
結果就是1,2,3undefinedundefined

而 pellBanana(...notPellYet) 其`...`是打開陣列(把[]香蕉皮剝掉)，這樣就可以變成三個引數，便可實現return，

### match()
是string.prototype.match()，match()顧名思義就是要符合才會match()，既然是string原型鍊底下方法，勢必是跟輸入文字有關，所以它可以針對使用者輸入的值做檢測，比如擷取一句話中指定的文字並印出，或是與regexp(正則表達式)配合，他是match()的參數

--- 

## JS-07
### Array.some()
Array.some 是用來檢查陣列裡面是否有一些符合條件。只要有一個以上符合條件就會回傳 true，全部都不是的話會回傳 false。- 回傳true、false值
- 三個參數
    - element : 遍歷
    - index：賦予索引
    - array：array本身

> 可以使用Date().getFullYear()取到年份的值，並且可以做計算

### every()
Array.every 和 some 類似，不過要陣列裡面的所有東西都符合條件才會回傳 true，只要有一個不是就會回傳 false。

### find()
find() 方法會回傳第一個滿足所提供之測試函式的元素值。否則回傳 undefined。
```javascript=
const arr = [1,3,15,6,773,4]
const found = arr.find(num => num > 10)
console.log(found)//15
```
### findIndex()
跟上面差不多，只是找到所提供之測試值的索引

### splice
刪除陣列值的一個方法
```javascript=
//第一個1是陣列第一個數(非索引),第二個1是陣列索引
const removeTheNum = comments.splice(1, 1);

```

## JS-08 DevTool功能介紹
### string substitutions
他是只一個替換字串的功能，使用％做前綴，後綴則是一個特定英文字
```javascript=
Specifier	Description
%s	Format a variable as a string
%d	Format a variable as an integer
%f	Format a variable as a floating-point number
%o	It can be used to print a DOM Element
%0	Used to print an object representation
%c	Used to pass CSS to format a string
```

---

## JS-10

---

## JS-11 影片bar
這提我遇見bug，播放影片會大當機。這集的重點是賦予每條bar相應功能，快轉倒轉、音量、影片播放按鍵轉換等

---

## JS-12 先跳過
教當你使用特殊按鍵會有彩蛋，所以先跳過

---

## JS-13 文章圖片滑入
offsetTop 是HTMLElement系列的產物，目前已知作用是 JS 測量 HTML 元素的距離

---

## JS-14 
.cancat 是 array 得一個方法，作用是將選到的陣列合併
```javascript=
let player = ['Watson','Jeremy']
let player2 = ['julia','Eva']

let team = player.concat(player2)

console.log(team)//['Watson', 'Jeremy', 'julia', 'Eva']
```

---

## JS-15 這是重要議題 可用在to do list 主軸是測試刷新頁面後 輸入文字與按鈕不會因為刷新頁面而消失。依舊保留在local storge
perserve log 是chrome dev得功能，可以保留所有在console執行得結果，有些時候執行頁面，畫面會自動刷新，此時dev紀錄就消失，這時就需要開啟它
vscode 快捷件 shift + 9 小括號(parentheses)

物件縮寫
```javascript=
let Frieza = '弗利沙'
const GinyuTeam = {
  Ginyu: '基紐',
  Jeice: '吉斯',
  burter: '巴特',
  // ...
}

// 原本寫法
const newTeam = {
  GinyuTeam: GinyuTeam,
  Frieza: Frieza
}

// 縮寫
const newTeam = {
  GinyuTeam,
	Frieza
}
```

事件冒泡：在HTML下了兩個div，並在最裡面的div放一個button，以及為他們三個都各設定一個**click**事件，但是當我點擊button的時候會發現同時觸發了外面兩層div的事件，因為三個DOM很剛好的重疊了，所以點擊後會觸發所有的click事件，這個現象我們稱呼為「事件冒泡」。

#### localStorge
跟 cookies 很像，一樣是存在本地，優點是可以永久儲存，空間也比較大，通常是5mb。

cookies:通常每條最大 4KB，儲存量有限且附加於請求會影響效能
#### setItem、getItem



---

# JS-16
offsetHeight
offsetWidth


---

# JS-17

定義strip函式

javascript
複製程式碼
```javascript=
function strip(bandName) {
    return bandName.replace(/^(a |the |an )/i, "").trim();
}
```

功能：去掉樂團名字前面的特定單字 (A、An、The)，並刪除名字前後的多餘空格。

關鍵點：
正規表達式 ^(a |the |an )：
- ^：表示匹配開頭。
- a |the |an：匹配 A、The 或 An。
- i：表示正則表達式不區分大小寫。
- .replace()：將符合的部分替換為空字串。
- .trim()：移除字串前後的空格。

---

## JS-22 講解 hover 效果，
#### append
#### get

---

## JS-24 運用 js 製作 fixed-nav

---

## JS-25 事件冒泡處理，以及重複點擊問題

`once:true`阻止重複點擊問題
`capture`還不確定是
`stopPropagation`阻止冒泡，繁殖問題

---

## JS-26 用 JS 做 dropdown
#### `getBoundingClientRect()`
取得元素大小

#### `CSSStyleDeclaration`底下得`setProperty()`
可以動態改變css屬性

propertyName
- 要設定的 CSS 屬性名稱，通常以字串表示。
如果是多字組成的屬性（例如 background-color），需要用 kebab-case。
value
- 要賦予屬性的值，例如 10px, red, block 等。
priority（可選）
- 預設是空字串。如果要設定為 !important，可以明確傳入 "important"。

---

## JS-27 這題目是輪撥