使用 new Audio(),有什么方法可以找出音频文件是否存在?

With new Audio(), is there any way to find out of the audio file exists?

有没有办法从初始化的音频实例中找出音频文件是否存在?

例如,如果我尝试比较现有音频文件和不存在的音频文件:

new Audio('exists.mp3').readyState           => 0

new Audio('does_not_exist.mp3').readyState   => 0
(HTTP "Content-Type" of "text/html" is not supported. Load of media resource http://amc.narom.no/Steid failed.)

return值相同,但控制台记录无法加载媒体资源的错误。有没有办法捕获此消息,或使用音频对象中的任何方法来查明音频文件是否存在?

注意: 我知道我可以向音频源发出 HttpRequest 或 AJAX 请求以检查它是否存在,但想知道是否可以通过更有效的方式完成此操作。

不是同步的,所以立即访问 属性 是行不通的,因为您必须等待浏览器尝试网络请求,但是可以,您可以使用 errorloadeddata 事件(可选地替换其他类似的媒体事件以确定成功)。

var a = new Audio('doesitexist.mp3');
a.onerror = function() {
    console.log('File does not exist.');
};
a.onloadeddata = function() {
    console.log('File exists.');
};

至少在成功加载一些数据之前,loadeddata 事件不会触发,如果请求返回无效响应(如 404 错误),error 将触发。