vue中video标签,仅允许一个播放,其余暂停播放;vue获取不到video.length

  1. template结构(video动态生成)
    <div v-for="(item, index) in List" :key="index">
        <video controls :src="item.url"></video>
     </div>
    
  2. methods 函数
    vue中获取video标签集合videos,输出videos.length为0,必须使用this.$nexTick

    for循环注意使用闭包或者自定义属性解决循环之后只给最后一个元素绑定了点击事件的问题

    setVideo() {
        let that = this
        var videos = document.getElementsByTagName('video')             
        this.$nextTick(function () {
            for (var i = 0; i <videos.length; i++) {
                (function(n){
                    videos[n].addEventListener('play',function(){
                        that.pauseAll(n);
                    })
                })(i)
            }
        })
    },
    
    pauseAll(index) {
      var videos = document.getElementsByTagName('video')
      this.$nextTick(function () {
          for (var j = 0; j< videos.length; j++) {
              if (j !== index){
                  videos[j].pause()
                  // videos[j].load();
              }
          }
      })                
    }
    

改成vue3版本:

const pauseAll = (index: any) => {  
    const videos = document.getElementsByTagName('video');  
    nextTick(() => {  
      for (let j = 0; j < videos.length; j++) {  
        if (j !== index) {  
          videos[j].pause();   
        }  
      }  
    });  
};  
  
const setVideo = () => {  
  const videos = document.getElementsByTagName('video');  
  nextTick(() => {  
    for (let i = 0; i < videos.length; i++) {  
      videos[i].addEventListener('play', () => {  
        pauseAll(i);  
      });  
    }  
  });  
};  
  
  // 在组件挂载后执行 setVideo 函数  
onMounted(setVideo);  

  • 8
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要实现无缝播放下一个视频,可以采用以下的方法: 1. 使用 video.js 插件来播放视频,它自带了视频的播放控制面板,支持自定义皮肤和扩展插件。 2. 在每个视频播放结束时,监听视频的 ended 事件,触发回调函数,然后在回调函数切换到下一个视频的播放。 3. 切换到下一个视频的播放时,需要先停止当前视频的播放,然后加载下一个视频的资源,并设置好视频的播放地址和其他参数,最后开始播放下一个视频。 4. 为了实现无缝切换,可以在切换视频时使用淡入淡出的动画效果,让用户感觉到视频的过渡更加自然流畅。 下面是一个示例代码: ```javascript <template> <div> <video ref="videoPlayer" class="video-js vjs-default-skin" controls preload="auto"> <source :src="currentVideoSrc" type="video/mp4"></source> </video> </div> </template> <script> import videojs from 'video.js' export default { data() { return { videos: [ { src: 'https://example.com/video1.mp4', title: '视频1', }, { src: 'https://example.com/video2.mp4', title: '视频2', }, { src: 'https://example.com/video3.mp4', title: '视频3', }, ], currentVideoIndex: 0, player: null, } }, mounted() { this.initVideoPlayer() }, methods: { initVideoPlayer() { this.player = videojs(this.$refs.videoPlayer, { autoplay: true, controls: true, fluid: true, sources: [ { src: this.videos[this.currentVideoIndex].src, type: 'video/mp4', }, ], }) // 监听视频播放结束事件 this.player.on('ended', () => { this.playNextVideo() }) }, playNextVideo() { // 切换到下一个视频 this.currentVideoIndex = (this.currentVideoIndex + 1) % this.videos.length // 停止当前视频的播放 this.player.pause() // 加载下一个视频的资源 this.player.src({ src: this.videos[this.currentVideoIndex].src, type: 'video/mp4', }) // 设置下一个视频的标题 this.player.poster(this.videos[this.currentVideoIndex].title) // 开始播放下一个视频 this.player.play() }, }, } </script> ``` 在上面的代码,我们使用了 video.js 插件来实现视频的播放控制,然后在 mounted 钩子函数初始化视频播放器。在 initVideoPlayer 方法,我们设置了视频的一些参数,同时也监听了 ended 事件,在视频播放结束后触发 playNextVideo 方法来切换到下一个视频的播放。 在 playNextVideo 方法,我们先停止当前视频的播放,然后加载下一个视频的资源,设置好视频的标题和播放地址,最后开始播放下一个视频。这样就能实现无缝切换视频的效果了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值