|
58 | 58 | <audio data-key="76" src="sounds/tink.wav"></audio> |
59 | 59 |
|
60 | 60 | <script> |
| 61 | + var keyFromCode = { |
| 62 | + "KeyA": 65, |
| 63 | + "KeyS": 83, |
| 64 | + "KeyD": 68, |
| 65 | + "KeyF": 70, |
| 66 | + "KeyG": 71, |
| 67 | + "KeyH": 72, |
| 68 | + "KeyJ": 74, |
| 69 | + "KeyK": 75, |
| 70 | + "KeyL": 76, |
| 71 | + }; |
61 | 72 |
|
| 73 | + var keyFromEvent = function(e) { |
| 74 | + var key; |
| 75 | + if(e.code) { |
| 76 | + key = keyFromCode[e.code]; |
| 77 | + } else { |
| 78 | + key = e.which; |
| 79 | + } |
62 | 80 |
|
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 | | - } |
| 81 | + return key; |
| 82 | + }; |
75 | 83 |
|
76 | | - const keys = document.querySelectorAll('.key'); |
77 | | - keys.forEach(key => key.addEventListener('transitionend', removeTransition)); |
78 | | - window.addEventListener('keydown', playSound); |
| 84 | + var selectDiv = function(key) { |
| 85 | + return document.querySelector('.key[data-key="' + key + '"]'); |
| 86 | + }; |
79 | 87 |
|
| 88 | + var selectAudio = function(key) { |
| 89 | + return document.querySelector('audio[data-key="' + key + '"]'); |
| 90 | + }; |
| 91 | + |
| 92 | + document.addEventListener('keydown', function(e) { |
| 93 | + var key = keyFromEvent(e); |
| 94 | + if(!key) { |
| 95 | + return; |
| 96 | + } |
| 97 | + |
| 98 | + var divEl = selectDiv(key); |
| 99 | + if(divEl) { |
| 100 | + if(divEl.className.indexOf('playing') === -1) { |
| 101 | + divEl.className += ' playing'; |
| 102 | + } |
| 103 | + |
| 104 | + var audioEl = selectAudio(key); |
| 105 | + if(audioEl) { |
| 106 | + audioEl.play(); |
| 107 | + } |
| 108 | + } |
| 109 | + }); |
| 110 | + |
| 111 | + document.addEventListener('keyup', function(e) { |
| 112 | + var key = keyFromEvent(e); |
| 113 | + if(!key) { |
| 114 | + return; |
| 115 | + } |
| 116 | + |
| 117 | + var divEl = selectDiv(key); |
| 118 | + if(divEl) { |
| 119 | + if(divEl.className.indexOf('playing') !== -1) { |
| 120 | + divEl.className = divEl.className.replace('playing', ''); |
| 121 | + } |
| 122 | + |
| 123 | + var audioEl = selectAudio(key); |
| 124 | + if(audioEl) { |
| 125 | + audioEl.currentTime = 0; |
| 126 | + } |
| 127 | + } |
| 128 | + }); |
80 | 129 | </script> |
81 | 130 |
|
| 131 | + |
82 | 132 | </body> |
83 | 133 | </html> |
0 commit comments