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);
});