video视频标签播放视频时点击或拖拽进度条事件

在HTML中,<video> 元素提供了多种与视频播放相关的事件,但直接针对鼠标拖拽或点击进度条的事件并不存在。不过,我们可以通过监听 <video> 元素的 timeupdate 事件来间接实现这一需求。

HTML

<video id="videoNode" width="100%" height="100%" controls>  
  <source :src="videoUrl" type="video/webm">  
</video>  
//videoUrl可在浏览器中直接播放

JS

import _ from "lodash";

data() {
  return {
      videoTimer: null,
    };
},

methods:{
   videoEvent() {
      this.$nextTick(() => {
        let previousTime = 0;
        let video = document.getElementById("videoNode");
        if (!video) return;
        video.addEventListener("timeupdate", () => {
          let currentTime = video.currentTime; //当前视频的播放时刻
          let isPaused=video.paused;
          if (previousTime !== 0) {
            let timeDiff = currentTime - previousTime; //时间差
            if(timeDiff == 0){
              return
            }
            if(isPaused || currentTime !=0){ //currentTime!=0按住键盘后退键时,避免重复调接口
              this.getDataFn(currentTime)
            } else if(currentTime ==0){
               this.initVideoList();
            }                 
            if (!this.videoTimer && !isPaused) {
              this.videoTimer = setInterval(() => {
                this.getInfoFromVideo(video.currentTime);
              }, 5000);
            }
          } else if(currentTime > 1) {
            this.getDataFn(currentTime); //视频一开始在0:00处,如果直接点击进度条,则请求一次数据
          }
          previousTime = currentTime;
        });
        video.addEventListener("ended", () => {
            this.clearVideoTimer();
          });
        video.addEventListener("error", () => {
            this.clearVideoTimer();
          });
        video.addEventListener("pause", () => {
            this.clearVideoTimer();
          });
      });
    },
    getDataFn(currentTime){
      this.getInfoFromVideo(currentTime)
    },
    getInfoFromVideo: _.debounce(function () {
      this.getPersonInfo(time);
    }, 200),
    getPersonInfo(time) {
      console.log("在此处发送axios请求,time为请求入参", time);
    },
    clearVideoTimer() {
      if (this.videoTimer) {
        clearInterval(this.videoTimer);
        this.videoTimer = null;
      }
    },
    initVideoList(){
      console.log('当视频当前时间是0时')
    }
}

以上代码解决了如下需求

视频播放过程中,每隔5秒请求一次接口;当鼠标拖动或点击进度条前进或后退时,也请求一次接口,请求入参均为当前视频的播放时间(时刻)。注意鼠标拖动进度条时的接口防抖处理。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值