音频 HTML5 检查是否所有音频元素都已完全加载
Audio HTML5 check if all audio elements have fully loaded
我正在构建一个使用音频的测验,并标记了用户的响应时间,因此我希望在用户开始测验之前完全加载所有音频 html 元素。
我只需要某种循环来检查所有音频元素是否已完全加载所有 song/audio。
我看过 readyState
等,但我无法在页面上所有音频的循环中找到它的用途。如果可能,我想要 javascript 或 jQuery 解决方案。
我认为像下面这样的东西可以做到,但不行:
var ready_count = 0;
var x = document.getElementsByClassName("question-audio");
for (var i = 0; i < x.length; ++i) {
var item = x[i];
item.addEventListener("readystatechange", function() {
if (item.readyState == 4) {
ready_count++;
}
}
if(ready_count == x.length){
//do something
}
感谢任何帮助。
这是一个 jQuery 版本:
function audioReady(){
return $.when.apply($, $('audio').map(function(){
var ready = new $.Deferred();
$(this).one('canplay', ready.resolve);
return ready.promise();
}));
}
如果您没有 jQuery and/or 不关心旧版浏览器:
function audioReady(){
var audio = [].slice.call(document.getElementsByTagName('audio'));
return Promise.all(audio.map(function(el){
return new Promise(function(resolve, reject){
el.addEventListener('canplay', resolve);
});
}));
}
无论哪种方式,您都可以这样使用函数:
audioReady().then(function(){
// do something
});
我正在构建一个使用音频的测验,并标记了用户的响应时间,因此我希望在用户开始测验之前完全加载所有音频 html 元素。
我只需要某种循环来检查所有音频元素是否已完全加载所有 song/audio。
我看过 readyState
等,但我无法在页面上所有音频的循环中找到它的用途。如果可能,我想要 javascript 或 jQuery 解决方案。
我认为像下面这样的东西可以做到,但不行:
var ready_count = 0;
var x = document.getElementsByClassName("question-audio");
for (var i = 0; i < x.length; ++i) {
var item = x[i];
item.addEventListener("readystatechange", function() {
if (item.readyState == 4) {
ready_count++;
}
}
if(ready_count == x.length){
//do something
}
感谢任何帮助。
这是一个 jQuery 版本:
function audioReady(){
return $.when.apply($, $('audio').map(function(){
var ready = new $.Deferred();
$(this).one('canplay', ready.resolve);
return ready.promise();
}));
}
如果您没有 jQuery and/or 不关心旧版浏览器:
function audioReady(){
var audio = [].slice.call(document.getElementsByTagName('audio'));
return Promise.all(audio.map(function(el){
return new Promise(function(resolve, reject){
el.addEventListener('canplay', resolve);
});
}));
}
无论哪种方式,您都可以这样使用函数:
audioReady().then(function(){
// do something
});