仅在视口中播放一次视频

时间:2019-12-17 11:12:54

标签: jquery video scroll

正如标题所述,我试图使视频只能在视口中播放一次。我在这里找到了另一个具有相同主题的问题,但是答案所附的小提琴似乎无效(https://jsfiddle.net/jAsDJ/218/)。

这是我现在得到的代码:

$(window).scroll(function() {
    $('video.elementor-video').each(function() {
        var playing = null;

        $(this).on('playing', function() {
            playing = true;
        });

        $(this).on('ended', function() {
            playing = false;
        });

        if ($(this).visible(true) && playing !== false) {
            $(this)[0].play();
        } else {
            $(this)[0].stop();
        }
    });
   });
.full-height {
    height: 80vh;
    background: #ccc;
}

video {
    width: 50%;
    height: auto;
}
<body>
    <div class="full-height"></div>

    <video class="elementor-video" src="http://doo.se/doo/wp-content/uploads/2019/09/Adjunkten_Folder_A01.mp4" muted="muted" controlslist="nodownload"></video>

    <div class="full-height"></div>

    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

    <script src="https://www.corneliaborjesson.se/js/jquery.visible.js"></script>
</body>

但是此代码使在结束后滚动窗口时重新启动视频。 希望您能帮助我找到解决方案!谢谢!

2 个答案:

答案 0 :(得分:0)

好吧,感谢this thread,现在我要走的更远。

function isInView(elem){
return $(elem).offset().top - $(window).scrollTop() < $(elem).height();
}
$(window).scroll(function() {
  $(".autoplay").each(function () { 
     var hasReachedUserExperience = false;
        if (isInView($(this)) && !hasReachedUserExperience) {
            hasReachedUserExperience = true;
            $('video', this).get(0).play();
        }
  })
});

当页面上仅使用一个视频时,此功能有效。但是,如果我希望多个视频使用此脚本,则只能在第一个视频上使用。我知道为什么,因为它是全局变量。但是我不确定如何在不破坏脚本的情况下使其本地化。有什么建议吗?

答案 1 :(得分:0)

这是我制定的解决方案:

function isInView(elem){
return $(elem).offset().top - $(window).scrollTop() < $(elem).height();
}
$(".autoplay").each(function (index, elem) { 
var hasReachedUserExperience = false;
  $(window).scroll(function() {
    if (isInView($(elem)) && !hasReachedUserExperience) {
        hasReachedUserExperience = true;
        $('video', elem).get(0).play();
    }
})
});