由于这个问题是 Google 的热门搜索结果,但“技术上”还没有答案,我想贡献我的解决方案,它有效,但有一个缺点。另外,公平的警告:我的答案使用 jQuery。
似乎视频循环中的轻微暂停是因为 html5 视频从一个位置搜索到另一个位置需要时间。因此,尝试告诉视频在结束时跳到开头没有任何帮助,因为搜索仍然会发生。所以这是我的想法:
使用 javascript 克隆标签,并让克隆处于隐藏状态、暂停状态和开始位置。像这样的:
var $video = $("video");
var $clone = $video.clone();
$video.after($clone);
var video = $video[0];
var clone = $clone[0];
clone.hidden = true;
clone.pause();
clone.currentTime = 0;
是的,我使用了clone.hidden = true 而不是$clone.hide()。对不起。
无论如何,这之后的想法是检测原始视频何时结束,然后切换到克隆并播放它。这样一来,DOM 中只会改变正在显示的视频,但实际上在克隆开始播放之前不需要进行搜索。因此,在隐藏原始视频并播放克隆后,您可以将原始视频返回到开头并暂停它。然后您将相同的功能添加到克隆中,以便在完成后切换到原始视频等。只需来回翻转。
例子:
video.ontimeupdate = function() {
if (video.currentTime >= video.duration - .5) {
clone.play();
video.hidden = true;
clone.hidden = false;
video.pause();
video.currentTime = 0;
}
}
clone.ontimeupdate = function() {
if (clone.currentTime >= clone.duration - .5) {
video.play();
clone.hidden = true;
video.hidden = false;
clone.pause();
clone.currentTime = 0;
}
}
我添加- .5 的原因是因为根据我的经验,currentTime 从未真正达到与视频对象duration 相同的值。它非常接近,但从来没有完全在那里。在我的情况下,我可以负担得起半秒的时间,但在你的情况下,您可能希望在仍然工作的同时将 .5 值调整为尽可能小。
这是我页面上的全部代码:
!function($){
$(document).ready(function() {
$("video").each(function($index) {
var $video = $(this);
var $clone = $video.clone();
$video.after($clone);
var video = $video[0];
var clone = $clone[0];
clone.hidden = true;
clone.pause();
clone.currentTime = 0;
video.ontimeupdate = function() {
if (video.currentTime >= video.duration - .5) {
clone.play();
video.hidden = true;
clone.hidden = false;
video.pause();
video.currentTime = 0;
}
}
clone.ontimeupdate = function() {
if (clone.currentTime >= clone.duration - .5) {
video.play();
clone.hidden = true;
video.hidden = false;
clone.pause();
clone.currentTime = 0;
}
}
});
});
}(jQuery);
我希望这对某人有用。它非常适合我的应用程序。缺点是.5,所以如果有人想出更好的方法来准确检测视频何时结束,请发表评论,我会编辑这个答案。