You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改JavaScript代码实现页面所有动态加载视频鼠标悬停播放

多视频(含动态加载)悬停预览适配方案

核心修改点

  • 原代码仅通过querySelector选中页面第一个视频,且启停函数硬绑定了全局的单个视频变量
  • 原全局定时器变量会导致多视频触发时互相覆盖冲突
  • 采用事件委托方案适配后续动态插入的视频,不需要每次新增视频后重新绑定事件

完整修改后代码

// 预览启动函数,接收目标视频作为参数
function startPreview(video) {
  video.muted = true;
  video.currentTime = 5;
  video.playbackRate = 2.5;
  video.play();
}

// 预览停止函数,接收目标视频作为参数
function stopPreview(video) {
  video.currentTime = 5;
  video.playbackRate = 1;
  video.pause();
}

// 事件委托绑定到document,覆盖所有现有和未来新增的video元素
document.addEventListener("mouseenter", (e) => {
  // 判定触发事件的元素是否是视频
  if (e.target.tagName === "VIDEO") {
    const video = e.target;
    startPreview(video);
    // 把定时器存在当前视频的自定义属性上,避免全局变量冲突
    video.dataset.previewTimeout = setTimeout(() => {
      stopPreview(video);
    }, 3000);
  }
}, true); // 捕获阶段触发,匹配mouseenter事件不冒泡的特性

document.addEventListener("mouseleave", (e) => {
  if (e.target.tagName === "VIDEO") {
    const video = e.target;
    clearTimeout(video.dataset.previewTimeout);
    delete video.dataset.previewTimeout;
    stopPreview(video);
  }
}, true);

优化提示

如果你的所有视频都放在一个固定的父容器里(比如id为video-list的div),可以把事件绑定到父容器上,减少事件触发的性能开销,只需要把上面代码里的document换成document.querySelector('#video-list')即可。

内容的提问来源于stack exchange,提问作者mrenton

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 08:18:02