Javascript 为什么canplaythrough事件仅在我将console.log(this)记录在清空事件中时触发?
我的JavaScript不会一直加载音频文件,除非我在音频对象上使用Javascript 为什么canplaythrough事件仅在我将console.log(this)记录在清空事件中时触发?,javascript,html,audio,dom-events,Javascript,Html,Audio,Dom Events,我的JavaScript不会一直加载音频文件,除非我在音频对象上使用console.log 我有加载音频文件并播放它的代码 var sound; sound = new Audio("foo.mp3"); sound.addEventListener("canplaythrough", function(){ //Do stuff }); canplaythrough事件不会每次都触发(我假设这意味着它没有加载足够的内容来允许事件触发)。因为我在一个小游戏预加载程序中使用了它,所以我
console.log
我有加载音频文件并播放它的代码
var sound;
sound = new Audio("foo.mp3");
sound.addEventListener("canplaythrough", function(){
//Do stuff
});
canplaythrough
事件不会每次都触发(我假设这意味着它没有加载足够的内容来允许事件触发)。因为我在一个小游戏预加载程序中使用了它,所以我依赖于在让游戏运行之前触发事件
在测试过程中,我使用console.log
在触发以下事件时检查声音
对象:清空
,加载元数据
,加载数据
,可以播放
,当然还有可以播放
sound.addEventListener("emptied", function(){
console.log(this);
});
// the same for loadedmetadata, loadeddata, and canplay events
如果我对this
对象的任何属性(例如console.log(this.readyState)
)使用console.log
,则没有明显的更改
奇怪的是,只要我在清空的事件侦听器中的这个对象上使用console.log
,我就无法重现这个bug;文件似乎每次都加载
为什么会这样?通过使用console.log
,我是在强制加载文件还是什么
正在使用的代码示例
function preloader(){
var sound, onemptied, oncanplaythrough;
onemptied = function(){
console.log(this); // I would like to omit this
sound.removeEventListener("emptied", onemptied);
};
oncanplaythrough = function(){
window.sound = sound;
sound.removeEventListener("canplaythrough", oncanplaythrough);
loadGame();
};
sound = new Audio("foo.mp3");
sound.addEventListener("emptied", onemptied);
sound.addEventListener("canplaythrough", oncanplaythrough);
sound.load();
}
function loadGame(){
sound.load();
sound.play();
}
您能检查暂停、暂停和结束吗?如果没有看到代码的其余部分,我不能完全确定,您能否确保调用堆栈中没有任何其他内容会干扰音频播放?音频播放的开始是延迟的还是同时发生了其他事情?我已经尝试使用代码sound.addEventListener(“eventname”,function(){console.log(url+“eventname”);}进行调试;但是有以下事件:中止
,可以播放
,持续时间更改
,清空
,结束
,错误
,加载数据
,加载开始
,暂停
,播放
,进度
,费率更改
,搜索
,搜索
,暂停
,暂停
,时间更新
,音量更改
,等待
,以及可播放
。加载失败时运行的唯一事件似乎是清空
,以及加载开始
。我还更新了我的帖子,显示play()
函数被延迟。