Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/440.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中等待其他内容完成_Javascript_Html_Audio - Fatal编程技术网

在本机JavaScript中等待其他内容完成

在本机JavaScript中等待其他内容完成,javascript,html,audio,Javascript,Html,Audio,我正在用JavaScript和HTML5制作一个音频播放器。现在我遇到了一个错误,当我尝试更改文件,然后根据滑块的位置播放它时,player.duration是NaN,因为它还没有加载那么远。如果我发出警报,它就会正常工作。因此,基本上,如果浏览器只是勉强挂起,它会给它足够的时间,而当它直接运行时,它不会首先完成加载 player.src = file; // The next command is reached before the full effect of the above line

我正在用JavaScript和HTML5制作一个音频播放器。现在我遇到了一个错误,当我尝试更改文件,然后根据滑块的位置播放它时,player.duration是NaN,因为它还没有加载那么远。如果我发出警报,它就会正常工作。因此,基本上,如果浏览器只是勉强挂起,它会给它足够的时间,而当它直接运行时,它不会首先完成加载

player.src = file;
// The next command is reached before the full effect of the above line is finished
player.currentTime = (slider.offsetLeft) / trackWidth * player.duration;

这里还有一些其他的东西,但本质上,我需要一种方法,在那里稍微停顿一下,或者在第二行运行之前等待一切结束。我意识到我可以在第二行使用setTimeout,但该行在函数中有几处,因此我希望在第一行之后可以使用“一个修复”。

您可以使用
setTimeout
函数以较小的延迟运行代码,例如0.5秒

setTimeout(function() {
    // your code
}, 500);

此外,您还可以检查播放机是否已加载,如果未加载,请将新超时设置为稍长一点。

您需要做的是等待音频元数据可用。这可以通过在触发事件后等待并在回调中执行代码的其余部分来实现

player.addEventListener('loadedmetadata', function() {
    player.currentTime = (slider.offsetLeft) / trackWidth * player.duration;
    // and the remainder of your code relating to the audio element
}, false);

唯一的潜在问题是,如果文件加载速度过快(即它已经在缓存中),则可能会在附加事件处理程序之前触发事件。添加事件侦听器后,最好分配
src
属性。

正如我在帖子中所说的,我希望不必这样做,因为它所需的行位于函数中的多个位置,而这些位置会使代码变得混乱。@David这应该是等效的,只是稍微更糟。您还可以执行
player.onloadedmetadata=func
player.onloadedmetadata=func()?第一个应该有效;后者不会。