Skip to content

test #3

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 14 commits into
base: master
Choose a base branch
from
126 changes: 126 additions & 0 deletions 01_Java-Script-Drum-Kit/index-Mike.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,126 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<title>JS Drum Kit</title>
<link rel="stylesheet" href="style.css" />
</head>
<body>
<div class="keys">
<div id="key-A" data-key="65" class="key">
<kbd>A</kbd>
<span class="sound">clap</span>
</div>
<div id="key-S" data-key="83" class="key">
<kbd>S</kbd>
<span class="sound">hihat</span>
</div>
<div id="key-D" data-key="68" class="key">
<kbd>D</kbd>
<span class="sound">kick</span>
</div>
<div id="key-F" data-key="70" class="key">
<kbd>F</kbd>
<span class="sound">openhat</span>
</div>
<div id="key-G" data-key="71" class="key">
<kbd>G</kbd>
<span class="sound">boom</span>
</div>
<div id="key-H" data-key="72" class="key">
<kbd>H</kbd>
<span class="sound">ride</span>
</div>
<div id="key-J" data-key="74" class="key">
<kbd>J</kbd>
<span class="sound">snare</span>
</div>
<div id="key-K" data-key="75" class="key">
<kbd>K</kbd>
<span class="sound">tom</span>
</div>
<div id="key-L" data-key="76" class="key">
<kbd>L</kbd>
<span class="sound">tink</span>
</div>
</div>

<audio id="A" data-key="65" src="sounds/clap.wav"></audio>
<audio id="S" data-key="83" src="sounds/hihat.wav"></audio>
<audio id="D" data-key="68" src="sounds/kick.wav"></audio>
<audio id="F" data-key="70" src="sounds/openhat.wav"></audio>
<audio id="G" data-key="71" src="sounds/boom.wav"></audio>
<audio id="H" data-key="72" src="sounds/ride.wav"></audio>
<audio id="J" data-key="74" src="sounds/snare.wav"></audio>
<audio id="K" data-key="75" src="sounds/tom.wav"></audio>
<audio id="L" data-key="76" src="sounds/tink.wav"></audio>

<script>
//var audio= document.getElementById("76")
//audio.play(); 直接撥放會失敗 Uncaught (in promise) NotAllowedError: play() failed because the user didn't interact with the document first. https://goo.gl/xX8pDD
// 採了一個坑叫做 document.addEventListener("click",playSound ());
//const audio = document.querySelector('audio[data-key="75"]');
document.addEventListener("keydown", playHandler);

function playHandler(e) {
// we need to do two somtething
// first audio play
// second dom change
console.log("keyboard: " + e.keyCode);
const audio = document.querySelector(`audio[data-key="${e.keyCode}"]`); // 不太習慣這樣寫
if (audio) {
audio.currentTime = 0;
audio.play();
} else {
alert("no keycode");
}

console.log(audio);
const chosenKb = document.querySelector(`div[data-key="${e.keyCode}"]`);
if (chosenKb) {
//chosenKb.setAttribute("class", "playing");
chosenKb.classList.add("playing");
//chosenKb.classList.remove("playing");
}
// audio.play()
// const keyCode = e.keyCode;
// console.log(keyCode)
// const keyChar = String.fromCharCode(keyCode).toUpperCase();
// console.log(keyChar)
// const audio = document.getElementById(keyChar); // 用 ID 取得 audio
// console.log(audio);
// if(audio){ // 我喜歡正面寫
// audio.currentTime=0 // 我聽不出來
// audio.play()

// }
// //const dom = document.querySelector(`div[data-key="${e.keyCode}"]`);
// const dom = document.getElementById(`key-${keyChar}`); // 對應 div

// if(dom){
// dom.classList.add('playing')
// //dom.setAttribute('class', 'playing'); 不是我要的 哭喔
// }
}
document.addEventListener("keyup", removePlayingTag);
function removePlayingTag(e) {
const chosenKb = document.querySelector(`div[data-key="${e.keyCode}"]`);
if (chosenKb) {
//chosenKb.setAttribute("class", "playing");
//chosenKb.classList.add("playing");
chosenKb.classList.remove("playing");
}
}
// document.querySelectorAll(".key").forEach(function (key) {
// key.addEventListener("transitionend", TransitionEndHandler);
// });

// function TransitionEndHandler(e) {
// if (e.propertyName === "transform") {
// console.log("e.propertyName" + e);
// this.classList.remove("playing"); // 移除 class
// }
// }
</script>
</body>
</html>
66 changes: 0 additions & 66 deletions 01_Java-Script-Drum-Kit/index-START.html

This file was deleted.

127 changes: 127 additions & 0 deletions 01_Java-Script-Drum-Kit/index-Yichia.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,127 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<title>JS Drum Kit</title>
<link rel="stylesheet" href="style.css" />
<link rel="icon" href="https://fav.farm/🔥" />
</head>
<body>
<div class="keys">
<div data-key="65" class="key">
<kbd>A</kbd>
<span class="sound">clap</span>
</div>
<div data-key="83" class="key">
<kbd>S</kbd>
<span class="sound">hihat</span>
</div>
<div data-key="68" class="key">
<kbd>D</kbd>
<span class="sound">kick</span>
</div>
<div data-key="70" class="key">
<kbd>F</kbd>
<span class="sound">openhat</span>
</div>
<div data-key="71" class="key">
<kbd>G</kbd>
<span class="sound">boom</span>
</div>
<div data-key="72" class="key">
<kbd>H</kbd>
<span class="sound">ride</span>
</div>
<div data-key="74" class="key">
<kbd>J</kbd>
<span class="sound">snare</span>
</div>
<div data-key="75" class="key">
<kbd>K</kbd>
<span class="sound">tom</span>
</div>
<div data-key="76" class="key">
<kbd>L</kbd>
<span class="sound">tink</span>
</div>
</div>

<audio data-key="65" src="sounds/clap.wav"></audio>
<audio data-key="83" src="sounds/hihat.wav"></audio>
<audio data-key="68" src="sounds/kick.wav"></audio>
<audio data-key="70" src="sounds/openhat.wav"></audio>
<audio data-key="71" src="sounds/boom.wav"></audio>
<audio data-key="72" src="sounds/ride.wav"></audio>
<audio data-key="74" src="sounds/snare.wav"></audio>
<audio data-key="75" src="sounds/tom.wav"></audio>
<audio data-key="76" src="sounds/tink.wav"></audio>
</body>
<script>
// 我的思路

const keys = document.querySelectorAll(".key");
// const keys = document.querySelectorAll(".key").dataset; //多數的話不能這樣用,單個可以取出dataset
console.log(keys);
const audio = document.querySelectorAll("audio");
console.log(audio);
//比對div跟audio的dataset一致
// keys.addevent nodelist不能直接用addenevtListener,單一DOM才能。
//div 元素本身預設無法接收鍵盤事
// keys.forEach((key) => {
// key.addEventListener("keydown", (e) => {
// console.log(key);
// });
// });
// 用 document 平常操作 DOM(點擊、輸入、鍵盤)
// 用 window 需要全局監聽鍵盤、resize、scroll

document.addEventListener("keydown", (e) => {
// console.log(e.keyCode);
keys.forEach((key) => {
// console.log(key.dataset.key);
if (key.dataset.key == e.keyCode) {
const selected = key.dataset.key;
audio.forEach((a) => {
if (a.dataset.key == selected) {
// console.log(a.dataset.key);
a.currentTime = 0; //??
a.play();
key.classList.add("playing");
setTimeout(() => {
key.classList.remove("playing");
}, 200);
}
});
}
});
});
</script>

<!-- GPT給的答案 -->

<!-- <script>
const keys = document.querySelectorAll(".key");

window.addEventListener("keydown", (e) => {
const keyCode = e.keyCode; // 抓到按下去的鍵
const audio = document.querySelector(`audio[data-key="${keyCode}"]`);
const key = document.querySelector(`.key[data-key="${keyCode}"]`);

if (!audio) return; // 如果找不到對應的音效,就跳出
audio.currentTime = 0; // 每次按都從頭播放
audio.play(); // 播放聲音

key.classList.add("playing"); // 加上動畫效果
});

// 給每個 key 加上動畫結束後移除 class
function removeTransition(e) {
if (e.propertyName !== "transform") return; // 只抓 transform 的動畫結束
this.classList.remove("playing");
}

keys.forEach((key) =>
key.addEventListener("transitionend", removeTransition)
);
</script> -->
</html>
Loading