javascript - 如何在 JavaScript 中释放按键时停止声音

标签 javascript html

我正在为我和我的 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/

相关文章:

javascript - capybara 需要 sleep 才能工作吗?

html - 将鼠标悬停在按钮上时动态添加 CSS

javascript - 选择文件后立即发布

javascript - 范围的性能=在 Angular Directive(指令)中

javascript - 要异步读取的变量的值

javascript - 我认为我的 html 文件没有看到另一个脚本文件

html - 所有浏览器中的水平滚动条

javascript - 如何正确创建数组并在本示例的范围之外使用它?

javascript - 如何从同一外部 JavaScript 文件的多个 html 获取/设置输入字段?

javascript - 找不到元素的子元素