vue系列:vue使用腾讯云播放器TCPlayer踩坑cannot read propeerty ‘nodeName‘of null
2023-09-27 14:27:09 时间
需求
列表页进入详情页,详情页有视频播放功能。
进入详情页调接口异步获取appid和fileid,然后初始化播放器。
bug
视频播放器在有异步的情况下无法正常初始化。
文件引入顺序
在 vue 中引入腾讯视频, 原则是 先加载腾讯视频代码 → 加载 dom → 加载视频初始化代码,
本次测试代码 header 引入 腾讯视频播放器 js,body 底部是 vue 项目的 js 代码。
bug重现
我把功能模拟到最简了,用 setTimeOut 模拟异步,报错如下图
<template>
<div id="detail">
<div class="detail-title">12344556</div>
<div class="detail-video">
<video width="414"
:id="tcPlayerId"
height="270"
class="tc-video-container"
playsinline
webkit-playinline
x5-playinline>
</video>
</div>
</div>
</template>
<script>
export default {
name: 'Detail',
data () {
return {
tcPlayerId: 'tcPlayer' + Date.now(),
player: null
}
},
mounted () {
let self = this
this.$nextTick(() => {
setTimeout(() => {
let videoFileid = '5285890797533824165'
let videoAppid = 'xxxxxxxx'
self.getVideoLang(videoFileid, videoAppid)
}, 400)
// let videoFileid = '5285890797533824165'
// let videoAppid = 'xxxxxxxx'
// self.getVideoLang(videoFileid, videoAppid)
})
},
methods: {
// 初始化腾讯云播放器
getVideoLang (fileID, appID) {
const playerParam = {
fileID: fileID,
appID: appID
}
this.player = window.TCPlayer(this.tcPlayerId, playerParam)
}
}
}
</script>
解决办法
解决的关键点有两点:
- video 上要用 v-if 判断是否已经加载上了 fileid 和 appid,只有加载上这两个 id 之后再渲染 dom,这样才不至于出现 dom 加载了但是找不到这俩 id
- 初始化视频的时候需要加上 this.$nextTick 以确保 dom 节点加载完成
<template>
<div id="detail">
<div class="detail-title">12344556</div>
<div class="detail-video">
<video width="414"
v-if="videoFileid"
:id="tcPlayerId"
height="270"
class="tc-video-container"
playsinline
webkit-playinline
x5-playinline>
</video>
</div>
</div>
</template>
<script>
export default {
name: 'Detail',
data () {
return {
tcPlayerId: 'tcPlayer' + Date.now(),
player: null,
videoFileid: '',
videoAppid: ''
}
},
mounted () {
let self = this
setTimeout(() => {
self.videoFileid = '5285890797533824165'
self.videoAppid = 'xxxxxxx'
self.$nextTick(() => {
self.getVideoLang(self.videoFileid, self.videoAppid)
})
}, 2000)
},
methods: {
// 初始化腾讯云播放器
getVideoLang (fileID, appID) {
const playerParam = {
fileID: fileID,
appID: appID
}
this.player = window.TCPlayer(this.tcPlayerId, playerParam)
}
}
}
</script>
再次进来播放器无法加载的问题
这里动态绑定播放器 id,可以解决返回再次进来播放器无法加载的问题,还有一种解决方案就是:
beforeDestroy () {
this.player.dispose()
}
生命周期组件销毁的时候把播放器也销毁掉,这是腾讯云播放器的 api
相关文章
- 基于vue-node的共享车位管理系统的设计与实现_kaic
- 【Vue 快速入门系列】列表的基本使用
- vue-cli2.0和vue-cli3.0前后版本切换办法以及两个版本同时存在
- vue数据更新后在视图上不响应
- vue中render函数使用attrs绑定id、class、style、事件(5)
- elementUI+Vue实现管理系统的登录页面
- 基于SSM+Vue的SSM学业预警平台信息管理系统
- vue.js v-on的参数问题
- vue.js计算属性的复杂操作
- 5分钟带你入门vuex(vue状态管理)
- Vue.js学习笔记(一)
- Vue技术19单文件组件
- Vue.use与Vue.prototype的区别及说明
- Vue.js 2.x笔记:表单绑定(3)
- vue怎么实现element表格里表头信息提示功能?