01 - JavaScript Drum Kit
本文的代碼是看了Alex大大的JS30系列並搭配一些自身想法完成有興趣可以去yt搜尋Alex宅幹嘛
最終程式碼
附註: 因為codepen沒有放入聲音資源所以點擊會沒有聲音
思考流程
核心目標:
點擊會有鼓聲,放開即停
解決:
1 | 從滑鼠事件,配合DOM元素上設置的data-key獲取點擊的DOM以及audioDOM |
其餘考量的因素:
點了之後按鈕會亮,放開會按掉
解決:
1
利用點擊獲得的DOM操作classList添加class並透過mouseup事件調用的function移除class
按住會一直響
1
在撥聲音前先將要撥的audio.currentTime 設成 0
按其他按鍵不會報錯
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18在使用DOM方法時先確定該DOM是否存在:
function playHandler(e) {
...
if (clickedDOM) {
clickedDOM.classList.add('playing')
}
...
if ( audioClicked ) {
audioClicked.currentTime = 0
audioClicked.play()
}
}
function finishHandler(e) {
...
if( finishedDOM ) {
finishedDOM.classList.remove('playing')
}
}
我複習了甚麼
1. 立即執行函數
用途: 避免寫的代碼汙染全部
1 | (function () { |
2. addEventListener
1 | // addEventListener(事件, 發生時執行的函數) |
3. 屬性選擇器
一個小坑: 非==是=
1 | let clickedDOM = document.querySelector(`div[data-key = "${e.keyCode}"]`) |
4. classList
用法
1 | em.classList |
他的一些實用API
移除 class
1
div.classList.remove("foo");
增加class
1
2
3div.classList.add("anotherclass");
// 也可以一群
div.classList.add("foo","bar");沒有就添加有就移除
1
2
3
4div.classList.toggle("visible");
i要小於10才生效
div.classList.toggle("visible", i < 10 );元素是否有該class
1
div.classList.contains("foo") // true or false
5. audio play( )以及currentTime
撥放聲音,設定撥放時間