jQuery。暂停视频超时

jQuery. Pause video with timeout

我的网站上有几个视频具有相同的 class。

我只想将鼠标悬停在一个视频上时播放它。一旦我移除悬停,视频就会延迟 1 秒暂停。

我学会了如何开始和暂停视频。但是一旦我添加 setTimeout 我就会收到错误消息: Uncaught TypeError: Cannot read properties of undefined (reading 'pause')

下面附上我的解决方案的 html 代码:

<a href="#" class="cases__item">
   <video class="cases__item-video" playsinline="true" loop="" preload="metadata" src="https://giant.gfycat.com/VerifiableTerrificHind.mp4"></video>
</a>

<a href="#" class="cases__item">
   <video class="cases__item-video" playsinline="true" loop="" preload="metadata" src="https://giant.gfycat.com/VerifiableTerrificHind.mp4"></video>
</a>

<a href="#" class="cases__item">
   <video class="cases__item-video" playsinline="true" loop="" preload="metadata" src="https://giant.gfycat.com/VerifiableTerrificHind.mp4"></video>
</a>

我还附上了我的解决方案的 html 代码:

            var figure = $(".cases__item").hover( hoverVideo, hideVideo );

            function hoverVideo(e) {
                $('.cases__item-video', this).get(0).play();
            }

            function hideVideo(e) {
                setTimeout(function (){
                    $('.cases__item-video', this).get(0).pause();
                }, 1000);
            }

我还使用我的代码添加了工作 jsfiddle:https://jsfiddle.net/v7certb6/1/

请帮我解决一秒钟后视频暂停问题。

如有任何帮助,我将不胜感激。

问题是因为 setTimeout() 函数处理程序中的 this 引用该函数,而不是调用外部 hoverVideo() 或 [=16= 时提供的元素引用] 函数。

要解决此问题,请在外部范围中创建一个变量以保留对 this 的引用,您在 setTimeout():

中使用该变量
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script>
<a href="#" class="cases__item">
  <video class="cases__item-video" playsinline="true" loop="" preload="metadata" src="https://giant.gfycat.com/VerifiableTerrificHind.mp4"></video>
</a>

<a href="#" class="cases__item">
  <video class="cases__item-video" playsinline="true" loop="" preload="metadata" src="https://giant.gfycat.com/VerifiableTerrificHind.mp4"></video>
</a>

<a href="#" class="cases__item">
  <video class="cases__item-video" playsinline="true" loop="" preload="metadata" src="https://giant.gfycat.com/VerifiableTerrificHind.mp4"></video>
</a>
var figure = $(".cases__item").hover(hoverVideo, hideVideo);

function hoverVideo(e) {
    let _this = this;
  $('.cases__item-video', _this).get(0).play();
}

function hideVideo(e) {
  let _this = this;
  setTimeout(function() {
    $('.cases__item-video', _this).get(0).pause();
  }, 1000);
}

Example Fiddle - 请注意示例位于 fiddle 中,因为 cross-site 内容在 SO 主站点上播放时存在问题。

作为旁注,JS 可以简化为以下内容,其仅使用箭头函数具有完全相同的行为:

$(".cases__item").hover(
  e => e.currentTarget.querySelector('.cases__item-video').play(), 
  e => setTimeout(() => e.currentTarget.querySelector('.cases__item-video').pause(), 1000));