我正在为我和我的 friend 编写一架完整的气喇叭钢琴(我知道有点傻),我必须完成所有的按键绑定(bind),然后我遇到了这个问题,当我释放按键时,声音不会停止被按下以激活它。
这是我到目前为止在 .js 文件中的内容(到目前为止只添加了一个声音):
function startAnatural(){
var A = new Audio("A natural.mp3");
A.play();
}
function stopAnatural(){
var A = new Audio("A natural.mp3");
A.pause();
A.currentTime = 0;;
}
document.onkeydown = function(e){
e = e || window.event;
var key = e.which || e.keyCode;
if(key===81){
startAnatural();
}
};
document.onkeyup = function(e){
e = e || window.event;
var key = e.which || e.keyCode;
if(key===81){
stopAnatural();
}
};
最佳答案
您正在创建相同声音的新实例并暂停它,而原始实例继续播放。
相反,两个函数都需要引用同一个 Audio
对象。
也许这样的设计更适合您。
function createSound(file) {
var sound = new Audio(file);
return {
start: function() {
sound.play();
},
stop: function() {
sound.pause();
sound.currentTime = 0;
}
};
}
该函数获取您想要加载的声音的名称,然后返回另外两个函数来启动和停止它。这两个函数将始终引用同一个 Audio
实例。
var aNatural = createSound('A natural.mp3');
document.onkeydown = function() {
// ...
aNatural.start();
// ...
}
document.onkeyup = function() {
// ...
aNatural.stop();
// ...
}
<小时/>
如果您想组织所有声音,您需要根据相应的键码存储声音。
var notes = [
{ key: 81, sound: createSound('A natural.mp3') },
{ key: 82, sound: createSound('B natural.mp3') },
{ key: 83, sound: createSound('C natural.mp3') }
// ...
];
然后您可以创建事件监听器,使用适当的键代码触发每个声音。
document.onkeydown = function() {
var pressedKey = e.which;
notes.forEach(function(note) {
if(note.key === pressedKey) {
note.sound.start();
}
});
}
// do the same for keyup
// ...
关于javascript - 如何在 JavaScript 中释放按键时停止声音,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34101183/