# 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 這題目是輪撥