Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/454.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么canplaythrough事件仅在我将console.log(this)记录在清空事件中时触发?_Javascript_Html_Audio_Dom Events - Fatal编程技术网

Javascript 为什么canplaythrough事件仅在我将console.log(this)记录在清空事件中时触发?

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事件不会每次都触发(我假设这意味着它没有加载足够的内容来允许事件触发)。因为我在一个小游戏预加载程序中使用了它,所以我

我的JavaScript不会一直加载音频文件,除非我在音频对象上使用
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()
函数被延迟。