我有一个HTML页面,可加载视频并显示下载进度栏。
视频元素是这样创建的:
function createVideo() {
var video = document.createElement("VIDEO");
video.setAttribute('controls', '');
video.setAttribute('preload', 'auto');
video.setAttribute('width', width);
video.setAttribute('id', 'video');
var source = document.createElement("SOURCE");
source.setAttribute('src', "https://www.example.com/video.mp4");
source.setAttribute('type', 'video/mp4');
video.addEventListener('progress', function() {
var endBuf = this.buffered.end(0); //1
var soFar = parseInt(((endBuf / this.duration) * 100));
var progressBar = document.getElementById("progressBar");
if (soFar < 100) {
progressBar.setAttribute('value', soFar);
} else {
progressBar.style = "display:none;";
}
});
我在浏览器中的行为是这样的:
2codes.js:368未捕获的DOMException:无法在'TimeRanges'上执行'end':提供的索引(0)大于或等于最大界限(0)。在HTMLVideoElement。 (https://example.com/code.js:368:32)(匿名)@ functions.js:368
第368行是在上面的代码中标记为// 1的那一行。
我该如何解决?
[Chrome可能在视频完全加载之前触发了您的“进度”监听器,这意味着this.buffered
还没有TimeRanges
。您可能会考虑在缓冲区中未指定TimeRanges
的情况下,将“进度”侦听器的主体包装在语句中以进行处理:
video.addEventListener('progress', function() {
if(this.buffered.length > 0) {
var endBuf = this.buffered.end(0);
var soFar = parseInt(((endBuf / this.duration) * 100));
var progressBar = document.getElementById("progressBar");
if (soFar < 100) {
progressBar.setAttribute('value', soFar);
} else {
progressBar.style = "display:none;";
}
} else {
progressBar.style = "display:none;";
}
});