如何将音频文件保存在浏览器的缓存中,以便当用户按下按钮时,音频立即从缓存中开始播放?

Che*_*ong 5 javascript audio caching

我有一个简短的音频文件集合,我想在用户按下相应按钮时播放一个音频文件。我有以下脚本可以播放声音:

<script type="text/javascript">
    var sound = new Audio();
    function playSound(audioUrl) {
        sound.src = audioUrl;
        sound.play();
    }
</script>

<button type="button" onclick="playSound('http://example.com/audioA.mp3')">Audio A</button>
<button type="button" onclick="playSound('http://example.com/audioB.mp3')">Audio B</button>
<button type="button" onclick="playSound('http://example.com/audioC.mp3')">Audio C</button>
...
Run Code Online (Sandbox Code Playgroud)

问题是,这些音频文件不大,但是在第一次按下按钮时仍需要短暂的延迟才能下载和播放,这有点烦人。如何命令浏览器在页面加载时缓存所有音频文件?当我搜索此内容时,我发现有关缓冲和流音频的内容可能不适合我的需求,因为我的音频长度不那么长。谢谢。

Mou*_*ser 4

您可以预加载它们,然后在预加载完成后立即使链接可用。您可以同步或异步执行此操作。我建议异步进行。

看这个例子:

var sound = new Audio();
function playSound(audioUrl) {
  sound.src = audioUrl.getAttribute('data-url'); //grab the data-url
  sound.play();
}

function preloadAudio()
{
  var audioButtons = document.querySelectorAll("button[data-type='audio']") //select all button elements with data-type = audio
  for (var i = 0; i < audioButtons.length; i++)
  {
    //loop all audio elements
    audioButtons[i].setAttribute("disabled", true); //disable the element
    var preloader = new Audio();
    preloader.addEventListener("loadeddata", enableAudioButton.bind(audioButtons[i]), true); // use bind to link the audio button to the function
    preloader.src = audioButtons[i].getAttribute("data-url"); //trigger the download
  }
}

function enableAudioButton()
{
  this.removeAttribute("disabled");  //reenable the button
}

document.body.addEventListener("load", preloadAudio, true);
Run Code Online (Sandbox Code Playgroud)
<button type="button" data-type="audio" data-url="http://example.com/audioA.mp3" onclick="playSound(this)">Audio A</button>
<button type="button" data-type="audio" data-url="http://example.com/audioB.mp3" onclick="playSound(this)">Audio B</button>
<button type="button" data-type="audio" data-url="http://www.stephaniequinn.com/Music/Allegro%20from%20Duet%20in%20C%20Major.mp3" onclick="playSound(this)">Audio C</button>
Run Code Online (Sandbox Code Playgroud)

我使用了一个真实的示例(音频 C),因此您可以在函数中看到该脚本。