|
6 | 6 | <link rel="stylesheet" href="style.css">
|
7 | 7 | </head>
|
8 | 8 | <body>
|
9 |
| - |
10 |
| - |
11 | 9 | <div class="keys">
|
12 | 10 | <div data-key="65" class="key">
|
13 | 11 | <kbd>A</kbd>
|
14 | 12 | <span class="sound">clap</span>
|
| 13 | + <audio src="sounds/clap.wav"></audio> |
15 | 14 | </div>
|
16 | 15 | <div data-key="83" class="key">
|
17 | 16 | <kbd>S</kbd>
|
18 | 17 | <span class="sound">hihat</span>
|
| 18 | + <audio src="sounds/hihat.wav"></audio> |
19 | 19 | </div>
|
20 | 20 | <div data-key="68" class="key">
|
21 | 21 | <kbd>D</kbd>
|
22 | 22 | <span class="sound">kick</span>
|
| 23 | + <audio src="sounds/kick.wav"></audio> |
23 | 24 | </div>
|
24 | 25 | <div data-key="70" class="key">
|
25 | 26 | <kbd>F</kbd>
|
26 | 27 | <span class="sound">openhat</span>
|
| 28 | + <audio src="sounds/openhat.wav"></audio> |
27 | 29 | </div>
|
28 | 30 | <div data-key="71" class="key">
|
29 | 31 | <kbd>G</kbd>
|
30 | 32 | <span class="sound">boom</span>
|
| 33 | + <audio src="sounds/boom.wav"></audio> |
31 | 34 | </div>
|
32 | 35 | <div data-key="72" class="key">
|
33 | 36 | <kbd>H</kbd>
|
34 | 37 | <span class="sound">ride</span>
|
| 38 | + <audio src="sounds/ride.wav"></audio> |
35 | 39 | </div>
|
36 | 40 | <div data-key="74" class="key">
|
37 | 41 | <kbd>J</kbd>
|
38 | 42 | <span class="sound">snare</span>
|
| 43 | + <audio src="sounds/snare.wav"></audio> |
39 | 44 | </div>
|
40 | 45 | <div data-key="75" class="key">
|
41 | 46 | <kbd>K</kbd>
|
42 | 47 | <span class="sound">tom</span>
|
| 48 | + <audio src="sounds/tom.wav"></audio> |
43 | 49 | </div>
|
44 | 50 | <div data-key="76" class="key">
|
45 | 51 | <kbd>L</kbd>
|
46 | 52 | <span class="sound">tink</span>
|
| 53 | + <audio src="sounds/tink.wav"></audio> |
47 | 54 | </div>
|
48 | 55 | </div>
|
49 | 56 |
|
50 |
| - <audio data-key="65" src="sounds/clap.wav"></audio> |
51 |
| - <audio data-key="83" src="sounds/hihat.wav"></audio> |
52 |
| - <audio data-key="68" src="sounds/kick.wav"></audio> |
53 |
| - <audio data-key="70" src="sounds/openhat.wav"></audio> |
54 |
| - <audio data-key="71" src="sounds/boom.wav"></audio> |
55 |
| - <audio data-key="72" src="sounds/ride.wav"></audio> |
56 |
| - <audio data-key="74" src="sounds/snare.wav"></audio> |
57 |
| - <audio data-key="75" src="sounds/tom.wav"></audio> |
58 |
| - <audio data-key="76" src="sounds/tink.wav"></audio> |
59 |
| - |
60 | 57 | <script>
|
61 | 58 |
|
| 59 | +let keySounds = []; |
| 60 | +const soundElements = document.getElementsByClassName('key'); |
| 61 | +Array.prototype.forEach.call(soundElements, function(element) { |
| 62 | + keySounds[element.dataset.key] = element; |
| 63 | +}); |
| 64 | + |
| 65 | +window.addEventListener('keydown', function(event){ |
| 66 | + const soundElement = keySounds[event.keyCode]; |
| 67 | + if (!soundElement) { return }; |
| 68 | + |
| 69 | + const audioElement = soundElement.getElementsByTagName('audio')[0]; |
| 70 | + if (!audioElement) { return }; |
62 | 71 |
|
63 |
| - function playSound(e) { |
64 |
| - const audio = document.querySelector(`audio[data-key="${e.keyCode}"]`); |
65 |
| - const key = document.querySelector(`.key[data-key="${e.keyCode}"]`); |
66 |
| - if (!audio) return; // stop the function from running all together |
67 |
| - audio.currentTime = 0; // rewind to the start |
68 |
| - audio.play(); |
69 |
| - key.classList.add('playing'); |
70 |
| - } |
71 |
| - function removeTransition(e) { |
72 |
| - if (e.propertyName !== 'transform') return; // skip it if it's not a transform |
73 |
| - this.classList.remove('playing'); |
74 |
| - } |
| 72 | + showSoundIsPlayingOn(soundElement); |
| 73 | + playAudioElement(audioElement) |
| 74 | +}); |
75 | 75 |
|
76 |
| - const keys = document.querySelectorAll('.key'); |
77 |
| - keys.forEach(key => key.addEventListener('transitionend', removeTransition)); |
78 |
| - window.addEventListener('keydown', playSound); |
| 76 | +function showSoundIsPlayingOn(soundElement) { |
| 77 | + soundElement.classList.add('playing'); |
| 78 | + soundElement.addEventListener('transitionend', function(event) { |
| 79 | + if (event.propertyName == 'transform') { return; } |
| 80 | + event.currentTarget.classList.remove('playing'); |
| 81 | + }); |
| 82 | +} |
79 | 83 |
|
| 84 | +function playAudioElement(audioElement) { |
| 85 | + audioElement.currentTime = 0; |
| 86 | + audioElement.play(); |
| 87 | +} |
80 | 88 | </script>
|
81 | 89 |
|
82 | 90 | </body>
|
|
0 commit comments