vue只有一个html画面吗,在Vue中使用Video-player,动态src以及页面只播放一个video

我的功能:一个tabs标签 content里面是视频,tabs切换显示不同的视频,大概就是下面的功能,然后红色框起来的是视频(这里因为晚上回来写的,所以没有数据,先这样看着)

8ad4be643608

2020-10-27_203333.png

使用v-for循环动态的生成多个src

这里对后台返回的每一个数据,进行一次循环,给我们的每个视频资源数据上加上一个playerOptions对象,这样使用的时候

就可以使用

class="video-player vjs-custom-skin"

ref="videoPlayer"

@play="onPlayerPlay($event)"

:playsinline="true"

:options="ele.playerOptions"

>

async init() {

try {

const res = await getVideoList();

console.log(res);

if (res.status == 200) {

res.result.forEach((ele) => {

ele.videoList.forEach((element) => {

let playerOptions = {

playbackRates: [0.7, 1.0, 1.5, 2.0], //播放速度

autoplay: false, //如果true,浏览器准备好时开始回放。

muted: false, // 默认情况下将会消除任何音频。

loop: false, // 导致视频一结束就重新开始。

preload: "auto", // 建议浏览器在加载元素后是否应该开始下载视频数据。auto浏览器选择最佳行为,立即开始加载视频(如果浏览器支持)

language: "zh-CN",

aspectRatio: "16:9", // 将播放器置于流畅模式,并在计算播放器的动态大小时使用该值。值应该代表一个比例 - 用冒号分隔的两个数字(例如"16:9"或"4:3")

fluid: true, // 当true时,Video.js player将拥有流体大小。换句话说,它将按比例缩放以适应其容器。

sources: [

{

src: element.videoUrl, // 路径

type: "video/mp4", // 类型

},

],

poster: "@/assets/camera.png", //你的封面地址

width: document.documentElement.clientWidth,

notSupportedMessage: "此视频暂无法播放,请稍后再试", //允许覆盖Video.js无法播放媒体源时显示的默认信息。

controlBar: {

timeDivider: true,

durationDisplay: true,

remainingTimeDisplay: false,

fullscreenToggle: true, //全屏按钮

},

};

element.playerOptions = playerOptions;

});

});

console.log(res.result);

this.itemList = res.result;

}

} catch (error) {console.log(error)}

},

页面上只能播放一个

监听视频的播放@play="onPlayerPlay($event)",每次视频播放的时候都会触发这个函数,这样就可以通过事件参数拿到当前是哪个视频在播放,也就是拿到正在播放的这个元素标签。还需要注意的是,如果使用video-player你会发现每一个视频就都会有一个id属性,这样通过事件参数的这个对象(前面说了可以拿到元素),这样就可以拿到当前这个正在播放的视频id,这样再通过document.getElementsByTagName("video")拿到页面上所有的视频,然后通过getAttribute属性拿到每一个视频的id,这样就可以区分哪个视频正在播放,具体的代码如下:

// 获取当前点击播放的是视频id

let currentVideo = e.el_.children[0].getAttribute("id");

// 获取页面上所有的video标签

let videoList = document.getElementsByTagName("video");

for (let i = 0; i < videoList.length; i++) {

// 让除了当前视频之外的全部视频pause,这样就实现啦

let id = videoList[i].getAttribute("id");

if (currentVideo != id) {

videoList[i].pause();

}

}

我的需求是tabs,监听tabs的切换 每次切换暂停页面上所有的视频即可。

如果有不对的地方,欢迎指正,实习生一枚!

贴一下完整代码把,因为有人要看

class="content"

style="padding: .1rem;font-size:.14rem;background:#f5f5f5;padding-top:.7rem;"

>

v-for="(item, index) in itemList"

:title="item.title"

:key="index"

>

class="card m-top-1 b-radius "

style=""

v-for="(ele, cardIndex) in item.videoList"

:key="cardIndex"

>

class="title f-weight d-flex j-sb a-center"

style="height:2rem;"

>

class="video-player vjs-custom-skin"

ref="videoPlayer"

@play="onPlayerPlay($event)"

:playsinline="true"

:options="ele.playerOptions"

>

{{ ele.productType }}

import { getVideoList } from "../../api/installVideo";

export default {

name: "installVideo",

data() {

return {

active: 0,

itemList: [

{title:'后入'},

{title:69}

],

};

},

methods: {

// 监听视频播放的回调

async onPlayerPlay(e) {

let currentVideo = e.el_.children[0].getAttribute("id", 64);

let videoList = document.getElementsByTagName("video");

for (let i = 0; i < videoList.length; i++) {

let id = videoList[i].getAttribute("id");

if (currentVideo != id) {

videoList[i].pause();

}

}

},

// tabs每次切换的时候都需要将页面上video进行暂停

changeHandle() {

console.log(11)

this.$nextTick((_) => {

let videos = document.getElementsByTagName("video");

for (let i = 0; i < videos.length; i++) {

videos[i].pause();

}

});

},

async init() {

try {

const res = await getVideoList();

console.log(res);

if (res.status == 200) {

res.result.forEach((ele) => {

ele.videoList.forEach((element) => {

let playerOptions = {

playbackRates: [0.7, 1.0, 1.5, 2.0], //播放速度

autoplay: false, //如果true,浏览器准备好时开始回放。

muted: false, // 默认情况下将会消除任何音频。

loop: false, // 导致视频一结束就重新开始。

preload: "auto", // 建议浏览器在加载元素后是否应该开始下载视频数据。auto浏览器选择最佳行为,立即开始加载视频(如果浏览器支持)

language: "zh-CN",

aspectRatio: "16:9", // 将播放器置于流畅模式,并在计算播放器的动态大小时使用该值。值应该代表一个比例 - 用冒号分隔的两个数字(例如"16:9"或"4:3")

fluid: true, // 当true时,Video.js player将拥有流体大小。换句话说,它将按比例缩放以适应其容器。

sources: [

{

src: element.videoUrl, // 路径

type: "video/mp4", // 类型

},

],

poster: "@/assets/camera.png", //你的封面地址

width: document.documentElement.clientWidth,

notSupportedMessage: "此视频暂无法播放,请稍后再试", //允许覆盖Video.js无法播放媒体源时显示的默认信息。

controlBar: {

timeDivider: true,

durationDisplay: true,

remainingTimeDisplay: false,

fullscreenToggle: true, //全屏按钮

},

};

element.playerOptions = playerOptions;

});

});

console.log(res.result);

this.itemList = res.result;

}

} catch (error) {console.log(error)}

},

},

mounted() {

// this.videoElement = document.getElementsByTagName("video");

// console.log(this.videoElement);

this.init();

},

};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值