Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/371.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 当HTML5<;视频>;循环重新启动?_Javascript_Html_Video - Fatal编程技术网

Javascript 当HTML5<;视频>;循环重新启动?

Javascript 当HTML5<;视频>;循环重新启动?,javascript,html,video,Javascript,Html,Video,我有一个使用的HTML5循环视频,我想知道视频何时循环。事件侦听器play仅在视频最初启动时触发,而end从不触发 timeupdate的不精确性让我使用if(v.currentTime时感到紧张,我不确定这个方法有多可靠,但我已经发现了一些东西 player.on("timeupdate", function(e) { console.log(player.currentTime) }); 如果用户scrubs到0次,则timeupdate事件将以currentTime==0触发两次

我有一个使用
的HTML5循环视频,我想知道视频何时循环。事件侦听器
play
仅在视频最初启动时触发,而
end
从不触发


timeupdate
的不精确性让我使用
if(v.currentTime时感到紧张,我不确定这个方法有多可靠,但我已经发现了一些东西

player.on("timeupdate", function(e) {
    console.log(player.currentTime)
});
如果用户scrubs到0次,则
timeupdate
事件将以
currentTime==0
触发两次,如果视频循环以
currentTime==0
触发3次
timeupdate
。这似乎在FF、Chrome中都适用,但我想知道它是否与spec的常见实现相关,或者是否依赖于硬件。快速机器3次滴答声,慢速机器5次滴答声
currentTime==0

还有player.played,它将返回所播放范围的TimeRanges对象。因此:

player.on("timeupdate", function(e) {
    var tr = player.played;
    var hasLoopedOnce = (tr.end(tr.length-1)==player.duration);
    console.log(hasLoopedOnce);
});
问题是每次迭代后范围都不会重置,所以它只适用于检测第一个循环。我尝试过player.played=null,但没有效果


但是使用这些方法设置标志并与
player.currentTime相结合,我认为最可靠的方法是自己循环。删除
loop
属性并执行以下操作:

document.querySelector('video').addEventListener('end',function(){
console.count('loop restart');
这个。play();
})

我只能在手机上这样做。你不能在手机上做公认的答案,因为手机需要用户交互才能再次运行play()(在许多情况下,尤其是在大多数web视图中)

在“timeupdate”中,我们唯一可以依赖的是
currentTime==0
。因为我们知道
currentTime==0
将在“timeupdate”中运行2-7次取决于硬件/任何东西,我们可以通过在满足条件后立即将布尔值设置为false,将布尔值设置为仅在第一次运行时捕获,然后在计时器上重置布尔值

我能想到的最好的解决方案。我们应该有一个“循环”事件侦听器。
let loopCount=0;
让油门=真;
document.querySelector('video').addEventListener(“时间更新”),()=>{
const video=document.querySelector('video');
如果(video.currentTime==0&&throttle){
油门=假,
循环计数+=1;
console.log(loopCount);
setTimeout(()=>{
油门=真;
}, 500);
}
},对);

当视频重新开始时,
seek
事件应该会触发,但是如果您对视频有控制,那么当用户搜索视频时,它也会触发。为了减少用户清理的影响,我可能会在currentTime到达视频的最后一秒时设置一个标志,然后如果成功搜索currentTi0的me假设循环已触发这是一个比更常见的检查currentTime和fire事件解决方案更干净的解决方案。TIMTOWDI和非常好的开箱思考!最小的
视频。我在使用Chrome的Windows机器上看到的currentTime
是0.000163。因此不完全是
==0
。。。
player.on("timeupdate", function(e) {
    var tr = player.played;
    var hasLoopedOnce = (tr.end(tr.length-1)==player.duration);
    console.log(hasLoopedOnce);
});