当视频更改而不重新加载页面时,HTML5 视频元素缺少 END 事件

Posted

技术标签:

【中文标题】当视频更改而不重新加载页面时,HTML5 视频元素缺少 END 事件【英文标题】:Missing END event for HTML5 Video element when video changes without page reload 【发布时间】:2016-11-17 13:39:34 【问题描述】:

我正在使用以下代码来分离视频事件:

var html5VideoEvents = ["playing","pause","ended","seeked"];
var videos = win.document.getElementsByTagName("video");
for (var i = 0; i < videos.length; i++)
  for (var j = 0; j < HTML5VideoEvents.length; j++)
    videos[i].addEventListener(HTML5Events[j], videoEvenDetected, false);
  

这段代码工作正常在正常情况下,我得到了所有事件,但是当播放不同的视频而没有重新加载页面时,例如如果我正在观看一个 Youtube 视频,然后单击右侧栏列表中的任何其他视频,或者如果是 Amazon Prime 中的下一个视频。在这两种情况下,接收下一个视频的“播放”事件以及与下一个视频 curSRC、url 等相关的信息。

在播放下一个视频之前,我想知道上一个视频已结束或暂停。有没有办法做到这一点。我也尝试听“emptied”事件。

videos[i].addEventListener("emptied", detectVideoReset, false);

但上面的代码并不总是有效。在 Firefox 和 Safari 上,在检测到上一个视频的重置事件之前,会观察下一个视频的视频事件。我还需要关于上一个视频当前时间、url、curSRC、下一个视频开始之前的持续时间的信息。

【问题讨论】:

【参考方案1】:

我建议你看看媒体元素的加载算法,它指定了媒体事件被触发的顺序。正如您所指出的,emptied 事件在currentTime 之后触发 并且其他变量被重置....这是有道理的,但对您的用例来说是不幸的。

https://www.w3.org/TR/2011/WD-html5-20110113/video.html#media-element-load-algorithm

您可以只记录ended 事件吗?如果事件已被触发,请将视频标记为 ENDED。否则假定它已被暂停。您还可以在每次视频暂停时记录 currentTime 和 src - 然后在触发 emptied 后使用这些值。

我很想知道您是否找到更优雅的解决方案...

【讨论】:

以上是关于当视频更改而不重新加载页面时,HTML5 视频元素缺少 END 事件的主要内容,如果未能解决你的问题,请参考以下文章

加载 HTML5 视频时如何制作加载图像?

iPad HTML5 视频元素不显示海报

HTML5 视频播放器:动态加载视频

HTML5中audio标签的使用

在页面的其余部分完成加载后延迟加载 html5 视频

ReactJS画布drawImage不显示html5视频元素