首页 > 其他分享 >学习video相关事件及vue中监听切出页面方法

学习video相关事件及vue中监听切出页面方法

时间:2023-05-10 14:55:48浏览次数:67  
标签:视频 vue refs timer video 播放 监听 页面

1.vue中监听切出页面方法

使用到的事件为: visibilitychange

visibilitychange 是浏览器新添加的一个事件,当浏览器当前页面被最小化或切换浏览器其他标签页后者从其他页面或应用返回到当前标签页 都会触发这个事件。

document.visibilityState 共有四个值:
hidden:文档处于背景标签页或者窗口处于最小化状态,或者操作系统正处于锁屏状态。
visible:只要页面可见,就会返回visible。
prerender: 页面在屏幕外执行预渲染处理 document.hidden 的值为 true。

注意:当 document.visibilityState 属性返回 visible时, document.hidden 属性返回 false,其他情况返回true。

vue 代码如下:
export default {
data(){
return {}
},
mounted(){
document.addEventListener('visibilitychange', this.handleVisibleChange)
},
destroyed(){
document.removeEventListener('visibilitychange', this.handleVisibleChange)
},
methods:{
handleVisibleChange(e){
switch(e.target.visibilityState){
case 'prerender':
// 网页预渲染,内容不可见
break;
case 'hidden':
// 内容不可见,处理后台,最小化,锁屏状态
// 这里可以提示用户离开当前页面了
break;
case 'visible':
// 处于正常打开
break;
}
}
}
}

 2.video视频相关事件方法

<video
ref="video"
width="400"
height="360"
controls (如果出现这个属性,则显示播放控件,如播放按钮等)
poster="封面图片"
autoplay (在视频就绪后马上播放)
preload (视频在页面加载时进行加载,并预备播放,如果使用了autoplay则忽略该属性)
src="视频地址"
>
你的浏览器不支持video标签
</video>
事件:
timeupdate: 当前播放位置发生改变时产生该事件
this.$refs.video.currentTime: 获取当前播放的时间,单位秒
this.$refs.video.duration: 获取视频播放总时长,单位秒
this.$refs.video.volume(): 可设置视频播放音量
this.$refs.video.muted: 布尔值,可设置是否静音。
this.$refs.video.initialTime: 返回初始播放的位置

pause: 当媒体暂停时产生该事件
play: 当媒体播放时产生该事件
volumechange: 当音量发生改变时产生该事件

3.综合demo

   背景描述: 从A列表页面进入B详情页面,播放视频,当离开页面或者切换页面时,暂停播放视频,重新进入页面时继续播放视频,当播放一定时长后向后端发送已播放接口,标记当前视频已播放状态。

// A列表页面
<template>
<div>
<div @click="goDetail">去详情</div>
</div>
</template>
<script>
export default {
name:'List',
...
methods:{
goDetail(){
this.$router.push({
path: '/detail',
query: {...}, //这里可根据实际传递参数
})
}
}
}
</script>

// B详情页面
<template>
<div class="page-container">
<video
ref="video"
:poster="poster"
:src="src"
controls
preload
oncontextmenu="return false"
controlslist="nodownload"
@click="handleClickVideo"
@playing="playing"
@pause="pause"
></video>
</div>
</template>
<script>
export default {
name:'Detail'
data(){
return {
poster:'', //视频封面地址
src: '', //视频播放地址
seconds: 0,//视频播放时长
duration: 0,//视频总时长
timer: null, //视频播放定时器
}
},
watch: {
seconds(nv, ov) {
// 假设 播放时长超过视频总时长的90%,标记为已播放状态
if(nv > this.duration * 0.8){
// 这里就调用标记为已播放状态接口

//以及这里需要清除定时器等
clearInterval(this.timer)
this.timer=null
this.seconds=0
}
}
},
mounted(){
document.addEventListener('visibilitychange', this.handleVisible)
},
destroyed(){
document.removeEventListener('visibilitychange', this.handleVisible)
clearInterval(this.timer)
this.timer=null;
this.seconds = 0
},
methods:{
// 监听页面切出或切换,锁屏状态等触发事件
handleVisible(e){
switch(e.target.visibilityState){
case 'prerender':
//网页渲染,内容不可见
break;
case 'hidden':
//内容不可见,处理后台,最小化,锁屏状态
clearInterval(this.timer)
this.timer= null
setTimeout(()=>{
this.$refs.video.pause()
}, 10)
break;
case 'visible':
//正常打开
setTimeout(()=>{
this.$refs.video.play()
},10)
if(this.timer){
clearInterval(this.timer)
this.timer = null;
}
this.timer = setInterval(()=>{
this.seconds++
},1000)
break;
}
},
// 点击视频,如果处理播放状态则暂停,处于暂停状态则播放,可获取视频总时长
handleClickVideo(){
const duration = this.$refs.video.duration
this.duration = duration
if(this.$refs.video.paused){
this.$refs.video.pause()
}else{
this.$refs.video.play()
}
},
// 视频播放触发事件
playing(){
const currentTime = this.$refs.video.currentTime
this.seconds = parseInt(currentTime)
if(currentTime<=0){
this.seconds = 0;
}
if(this.timer){
clearInterval(this.timer)
this.timer = null
}
this.timer = setInterval(()=>{
this.seconds++
},1000)
},
// 视频暂停触发事件
pause(){
const currentTime = this.$refs.video.currentTime
if(this.timer){
clearInterval(this.timer)
this.timer = null
}
this.seconds = parseInt(currentTime)
},
//这里可以根据实际请求其他接口,例如根据id获取视频地址,封面等
//或者请求视频已播放状态接口
/* 假设在弹窗中查看视频,如弹窗中的视频已播放了一段时间,再次查看该视频时,
* 需要在关闭弹窗前把视频的播放时间归为0,可使用
this.$refs.video.currentTime = 0
this.$refs.video.initialTime = 0
*/
  }
}
</script>

 

参考链接:

    https://blog.csdn.net/weixin_47082552/article/details/123698903  - vue监听切出页面方法

标签:视频,vue,refs,timer,video,播放,监听,页面
From: https://www.cnblogs.com/sunnyeve/p/17387613.html

相关文章

  • Vue MVVM理解
    1MVVM,是Model-View-ModelView的简写在Vue中:Model:模型层,用于存储当前状态(data)View:视图层,用于向用户展示data被渲染后的UIModelView:视图模型层,监听、渲染等功能v-bind:监听Model中的data,在data变化时按照逻辑(Vue原理)进行渲染,再根据映射表找到依赖该状态的View进行更新。......
  • Vue 前端开发团队风格指南(史上最全)
    Vue官网的风格指南按照优先级(依次为必要、强烈推荐、推荐、谨慎使用)分类,本文根据项目实际情况整理了一份适用于团队开发的vue风格指南,供大家参考。一、命名规范常用的命名规范:camelCase(小驼峰式命名法——首字母小写)PascalCase(大驼峰式命名法——首字母大写)kebab-case(......
  • vue3拾遗(不定期更新)
    props传参会自动跳过key/ref/...等本身就有特殊意义的属性名路由跳转当路由到同一个路由组件时,会依次触发onBeforeUpdate、onUpdated生命周期钩子......
  • nginx部署vue项目显示空白页
    报错提示:index-fbb90c85.js:1Failedtoloadmodulescript:ExpectedaJavaScriptmodulescriptbuttheserverrespondedwithaMIMEtypeof"text/plain".原因:nginx使用容器部署,nginx.conf文件指定引用mime类型文件.解决方法:1.添加include/etc/nginx/mim.ty......
  • Vue-Router
    @目录作用教程null使用流程引入组件定义路由实例挂载路由渲染位置启动<imgsrc=""style="zoom:50%"/>作用教程单个页面路由:https://cn.vuejs.org/guide/scaling-up/routing.html#client-side-vs-server-side-routing多个页面:复杂组合视频教程:B站Allen前端使用流程引入......
  • vue国际化(多语言)
      方法1:用js-cookie包并且挂载在main.js上1、安装vue-i18n+js-cookie插件npminstallvue-i18n-Snpminstalljs-cookie--save2、去检查一下你安装的i18n版本是不是8.26.53、在main.js中引入4、在src上建立文件夹5、给创建的中文和英文添加语言注......
  • 使用vue的keep-alive缓存组件,三级菜单组件无法缓存问题解决
    使用vue做后台管理系统,需求是所有的菜单打开之后,下次点击的时候的使用缓存,这里很简单的做法就是用来包裹住;但是一级菜单和二级菜单都没有问题,三级菜单就会出现无法缓存的问题,网上找资料说是vue中keep-alive本身存在的缺陷,需要在路由守卫中将matched属性做一下优化,具体如下//......
  • vue2+vant2+rem+axios+钉钉自动登录 h5模板
    下载代码请轻轻的点一下这里~Node版本要求VueCLI需要Node.js8.9或更高版本(推荐8.11.0+)。你可以使用nvm或nvm-windows在同一台电脑中管理多个Node版本。本示例Node.js14.17.0启动项目npminstallnpmrundev打包项目打测试包会带vconsole控制台对......
  • vue sort 排序方法
    1、数据排序vararry=[9,5,6,7,5,6,3,1,0]arry.sort()//[0,1,3,5,5,6,6,7,9] 2、对象排序varlist=[{name:'张三',age:12},{name:'李四','age:23}];list.sort((a,b)=>{returna.age-b.age});//[{name:'李四','ag......
  • 微信小程序 自定义组件 监听数据变化 出现异常 Maximum call stack size exceeded.
    代码调用处: 组件内部  本地调试无异常,发布之后出现此异常解决方法:监听属性steps的值变化时,调用处不能使用双向绑定,去掉steps的双向绑定即可,具体的原因未知(不知为啥本地调试不会抛异常) ......