如何与按键同步播放音频元素?

How can I play audio elements in sync with key presses?

HTML

<textarea id="words" name="words"></textarea>
<audio id="type" src="type.mp3"></audio>

JS

document.getElementById('words').onkeydown = function(){
    document.getElementById('type').play();
}

我想让 type.mp3 在我按下任意键时播放。

但是,与按键不同步播放

我正在寻找纯 JS 解决方案。

Javascript是异步和事件驱动的语言,所以不能做同步函数

音频媒体元素取决于浏览器的缓冲机制,调用播放时可能不会立即播放。

要播放与按键同步的声音,您必须使用网络音频 API,它允许您立即播放内存缓冲区。

以下是如何加载和触发声音的示例:

window.AudioContext = window.AudioContext || window.webkitAudioContext;

var request = new XMLHttpRequest(),
    url = "https://dl.dropboxusercontent.com/s/8fp1hnkwp215gfs/chirp.wav",
    actx = new AudioContext(),
    abuffer;

// load file via XHR
request.open("GET", url, true);
request.responseType = "arraybuffer";
request.onload = function() {
  // Asynchronously decode the audio file data in request.response
  actx.decodeAudioData(request.response,
    function(buffer) {
      if (buffer) {
        abuffer = buffer; // keep a reference to decoded buffer
        setup();          // setup handler
      }
    }
  )
};
request.send();

  // setup key handler
function setup() {
  document.getElementById("txt").onkeydown = play;
}

  // play sample - a new buffer source must be created each time
function play() {
  var src = actx.createBufferSource();
  src.buffer = abuffer;
  src.connect(actx.destination);
  src.start(0);
}
<textarea id=txt></textarea>

(注意:在撰写本文时,Firefox 中似乎存在错误,报告在 send() 调用的代码中不存在的列 - 如果有问题,请尝试 [=29 中的代码=]).