由于HTML的异步性,我假设(可能不正确?)页面加载的时间表如下:
<audio>
代码window.onload
事件回调readystatechange
事件回调而我所希望的是preload
属性值为&#34; auto&#34;将延迟window.onload
事件触发或延迟标记到DOM处理,直到找到音频资源并且已经开始缓冲,或者返回服务器错误并取消加载。
我无法想象为音频资源隐瞒window.onload
,但是我已经看到页面处理停止了以前的Flash资源加载或跟踪脚本加载
TLDR:window.onload
关于资源加载的具体时间表是什么 - 特别是音频标签?
答案 0 :(得分:2)
window.onload
完全加载之前,似乎会调用 src
事件。使用How do you check if a HTML5 audio element is loaded?中描述的方法;并包括.webkitAudioDecodedByteCount
<!DOCTYPE html>
<html>
<head>
<script>
window.addEventListener("load", function() {
var media = document.querySelector("audio");
console.log("window onload event"
, media.webkitAudioDecodedByteCount
, media.readyState)
})
function myOnCanPlayFunction() {
console.log("Can play", event.target.webkitAudioDecodedByteCount
, event.target.seekable.start(0)
, event.target.seekable.end(0));
}
function myOnCanPlayThroughFunction() {
console.log("Can play through", event.target.webkitAudioDecodedByteCount
, event.target.seekable.start(0)
, event.target.seekable.end(0));
}
function myOnLoadedData() {
console.log("Loaded data", event.target.webkitAudioDecodedByteCount
, event.target.seekable.start(0)
, event.target.seekable.end(0));
}
</script>
</head>
<body>
<audio oncanplay="myOnCanPlayFunction()"
oncanplaythrough="myOnCanPlayThroughFunction()"
onloadeddata="myOnLoadedData()"
src="/path/to/audio/file"
preload autoplay buffered controls></audio>
</body>
</html>
plnkr版本1 http://plnkr.co/edit/zIIDDLZeVU7NHdfAtFka?p=preview
使用XMLHttpRequest
的{{1}},onended
事件的替代方法; AudioContext
;递归请求,按顺序播放文件数组。见AudioContext.decodeAudioData()
Promise
plnkr版本2 http://plnkr.co/edit/zIIDDLZeVU7NHdfAtFka?p=preview