项目中有个这样的需求:

进入视频播放页后,添加一个标识,为了防止用户一次播放多个视频,当离开该页面后,如果是从当前正在播放的视频页面离开的,则离开播放页时清除标识,如果是不是则不清除,并且禁止用户按F5进行页面刷新,当用户在正在播放的视频页按浏览器刷新按钮清除标识,当用户复制的视频播放页面url打开的页面,按浏览器刷新按钮,不清除标识。

用户进入视频播放页有两种途径:

1.从列表页点击视频进入视频播放页

2.复制视频播放链接新打开一个窗口粘贴上去

为了解决用户粘贴播放视频url也能正常播放,于是将播放视频的参数放到  params  中,当用户复制链接时,就获取不到播放视频需要的参数了,就直接给用户提示例如:

当用户直接复制链接跳到播放页,再从播放页跳至列表页时不清除,但当用户是从列表页跳至播放页,再在该播放页点击浏览器刷新按钮,则需要清除标识,否则用户再回到列表页点击课件播放时一直提示

解决方案:

列表页跳至播放页:

                    this.$router.push({
name: 'coursewarePlayback',
// path: '/coursewarePlayback',
params: {
Ids: data.id,
fileId: data.resourceFileId
}
})

播放页面:

        mounted() {
this.haveSeek = false
// 先判断是否是复制的 url 进入到播放页面
if (!this.$route.params.Ids && !this.$route.params.fileId) {
this.$message({
message: '暂未获取到视频信息,请从列表页重新打开',
type: 'warning'
});
return
}
//阻止F5刷新
this.stopF5Refresh()
//监听刷新事件
window.addEventListener('beforeunload', e => this.beforeunloadHandler(e))
this.getDetailsAct(this.$route.params.Ids)
this.ideovSource = this.ideovUrl + this.$route.params.fileId + "/output.m3u8"
// 初始化播放器
const that = this
this.player = new Aliplayer({
id: "J_prismPlayer", // 容器id
source: this.ideovSource,//视频地址
// cover: "http://cdn.img.mtedu.com/images/assignment/day_3.jpg", //播放器封面图
autoplay: true, // 是否自动播放
width: "100%", // 播放器宽度
height: "610px", // 播放器高度
playsinline: true,
"skinLayout": [
{
"name": "bigPlayButton",
"align": "blabs",
"x": 500,
"y": 300
},
{
"name": "H5Loading",
"align": "cc"
},
{
"name": "errorDisplay",
"align": "tlabs",
"x": 0,
"y": 0
},
{
"name": "infoDisplay"
},
{
"name": "tooltip",
"align": "blabs",
"x": 0,
"y": 56
},
{
"name": "thumbnail"
},
{
"name": "controlBar",
"align": "blabs",
"x": 0,
"y": 0,
"children": [
{
"name": "progress",
"align": "blabs",
"x": 0,
"y": 44
},
{
"name": "playButton",
"align": "tl",
"x": 15,
"y": 12
},
{
"name": "timeDisplay",
"align": "tl",
"x": 10,
"y": 7
},
{
"name": "fullScreenButton",
"align": "tr",
"x": 10,
"y": 12
},
{
"name": "volume",
"align": "tr",
"x": 5,
"y": 10
}
]
}
]
})
that.currentTime = new Date().getTime()
if (localStorage.getItem('havePlay') && JSON.parse(localStorage.getItem('havePlay')).playerId !== that.$route.params.fileId) {
that.player.pause()
that.$message({
message: '您已经有正在播放的视屏,不能同时播放多个!',
type: 'warning'
});
} else if (!localStorage.getItem('havePlay')) {
const obj = {
playerId: that.$route.params.fileId,
havePlay: true,
currentTime: that.currentTime
}
localStorage.setItem('havePlay', JSON.stringify(obj))
}
var _beforeUnload_time = 0, _gap_time = 0;
window.onbeforeunload = function () {
_beforeUnload_time = new Date().getTime();
}
window.onunload = function () {
_gap_time = new Date().getTime() - _beforeUnload_time;
//浏览器关闭
if (_gap_time <= 5) {
window.localStorage.removeItem("havePlay");
}
}
//skinLayout设置只显示全屏和音量按钮
// 点击播放后调打点方法
//视频由暂停恢复为播放时触发。
that.player.on('completeSeek', function ({paramData}) {
that.haveSeek = true
that.playTime = paramData;
})
//视频由暂停恢复为播放时触发。
that.player.on('playing', function (e) {
that.playTime = that.player.getCurrentTime();
})
//视频销毁。
that.player.on('dispose', function (e) {
if (JSON.parse(localStorage.getItem('havePlay'))) {
window.localStorage.removeItem("havePlay");
}
that.clearIntervalFun();
})
},
destroyed() {
window.removeEventListener('beforeunload', e => this.beforeunloadHandler(e))
if (JSON.parse(localStorage.getItem('havePlay'))&& JSON.parse(localStorage.getItem('havePlay')).currentTime == this.currentTime) {
window.localStorage.removeItem("havePlay");
}
this.clearIntervalFun();
},

解释:

其中 JSON.parse(localStorage.getItem('havePlay')).currentTime 是用来判断是否是在当前播放页的,页面一进入先获取当前时间赋值给   播放页的   that.currentTime = new Date().getTime()    ,如果是第一次进入播放页,则播放页的时间复制给标识中的时间,只要页面不刷新不关闭,俩一直一样,但如果是刷新了页面,则 播放页的  that.currentTime 会被重新赋值,但标识里的  currentTime 不会被重新赋值,所以用此来做判断当前点击刷新按钮时是否是在正在播放的视频页点击刷新的如果俩时间一样则清除标识,而如果是复制的 url 则俩时间不一样,点击刷新时不清除标识。

            //清除定时器
clearIntervalFun() {
const that = this
if (that.intervalTime) {
clearInterval(that.intervalTime);
that.intervalTime = null;
}
},
//阻止F5刷新
stopF5Refresh() {
document.onkeydown = function (e) {
var evt = window.event || e;
var code = evt.keyCode || evt.which;
if (code == 116) {
if (evt.preventDefault) {
evt.preventDefault();
} else {
evt.keyCode = 0;
evt.returnValue = false
}
}
}
},
//浏览器刷新事件
beforeunloadHandler (e) {
if (JSON.parse(localStorage.getItem('havePlay'))&& JSON.parse(localStorage.getItem('havePlay')).currentTime == this.currentTime) {
window.localStorage.removeItem("havePlay");
}
},

vue禁止浏览器F5进行刷新和监听浏览器刷新事件的更多相关文章

  1. iOS微信浏览器回退不刷新(监听浏览器回退事件)

    兼容性:兼容全部ios系统 $(function(){ pushHistory(); }); function pushHistory(){ window.addEventListener(" ...

  2. vue监听浏览器窗口大小变化

    首先,页面初始化mounted的时候,通过 document.body.clientWidth 和 document.body.clientHeight 来获取到浏览器的宽和高,然后通过 window ...

  3. vue JS实现监听浏览器返回按键事件

    // 这个是监听浏览器回退键的returnButton () { let vm = this; $(document).ready(function () { if (window.history & ...

  4. JS实时监听浏览器宽度的变化

    boot:function(){ //加载页面时执行一次 changeMargin(); //监听浏览器宽度的改变 window.onresize = function(){ changeMargin ...

  5. js监听浏览器tab窗口切换

    js监听浏览器tab窗口切换 ——IT唐伯虎 摘要:js监听浏览器tab窗口切换. if (document.hidden !== undefined) {  document.addEventLis ...

  6. JS监听浏览器标签页的显示与隐藏

    /** * 监听浏览器标签页的显示与隐藏 */ class ListenerPageVisibility { constructor () { // 设置隐藏属性和改变可见属性的事件的名称 this. ...

  7. 【hugo】- hugo 监听浏览器切换title

    hugo 博客 监听浏览器title 动态改变浏览器title标题 找到head.html themes/maupassant/layouts/partials/head.html 添加监听js 可以 ...

  8. 监听浏览器tab切换

    监听浏览器切屏 为了完成验证用户在切换浏览器tab时进行登录再次认证需求需要监听浏览器切换窗口 if (document.hidden !== undefined) { document.addEve ...

  9. React监听窗口变化事件

    功能说明:本例子采用MUI table组件 + React实现. 需求描述:固定表头,列表高度随浏览器窗口的改变而改变.(本例中当窗口高度小于472像素后,便不作限制) 实现简介:1.监听浏览器窗口, ...

  10. js进阶 12-6 监听鼠标滚动事件和窗口改变事件怎么写

    js进阶 12-6 监听鼠标滚动事件和窗口改变事件怎么写 一.总结 一句话总结:滚动事件scroll(),浏览器窗口调整监听resize(),思考好监听对象. 1.滚动事件scroll()的监听对象是 ...

随机推荐

  1. 超详细的mysql总结(基本概念、DDL、DML)

    开发中存在着各种数据,比如用户的个人信息.商品详情.购买记录,这些数据都要以一定的方式储存,如果以文本的形式储存,每一次获取都要读取文件,如果信息有修改则需要直接修改文本,大量的数据会需要保存大量的文 ...

  2. Linux下发现一个高安全性的系统管理工具

    软件 AnySetup 主要功能 主要功能是对Linux操作系统下的基本配置进行管理.多种服务配置进行管理.安全配置进行管理等.如:操作系统的升级管理,软件包的安装.更新和卸载管理,软件仓库源的管理, ...

  3. 几种常用到的 Hybrid App 技术框架

    移动操作系统在经历了诸神混战之后,BlackBerry OS.Symbian OS.Windows Phone 等早期的移动操作系统逐渐因失去竞争力而退出.目前,市场上主要只剩下安卓和 iOS 两大阵 ...

  4. 我也来扒一扒python的内存回收机制!

    python的内存回收是面试中经常会问到一个问题,今天我来给大家深度剖析下python的内存回收和缓存机制 1.引用计数器 我们知道,python是通过引用计数器来做内存回收的,下面我们来重点讲下引用 ...

  5. Controller 层代码技巧

    Controller 层代码技巧 前言 本篇主要要介绍的就是controller层的处理,一个完整的后端请求由4部分组成: 接口地址(也就是URL地址) 请求方式(一般就是get.post,当然还有p ...

  6. 04.使用 github actions+docker 自动部署前后端分离项目 zhontai (.net core+vue)

    前言 Github Actions是什么?是 GitHub 提供的一种持续集成/持续部署(CI/CD)工作流程自动化服务,助力项目的自动化构建.测试和部署. 依托于平台,本文将分享使用 GitHub ...

  7. 如何实现IP话机接入交换机?

    组网图形 简介 如果语音设备支持LLDP协议,并且支持通过network-policy TLV字段获取语音VLAN,可以在交换机上配置命令lldp tlv-enable med-tlv network ...

  8. 【Visual Studio 使用技巧分享】任务列表的使用

    前言 Visual Studio 开发工具的熟练使用,能够潜在的提升我们工作效率,而且一些开发技巧的使用,会让我们的工作显得那么方便快捷.那么你知道VS中有哪些你不知道的使用小技巧呢?接下来,我们就来 ...

  9. 如何调用API接口获取淘宝商品数据

    淘宝商品数据的获取是一项非常重要的技术,它可以为淘宝卖家和买家提供有利的数据分析和扩展市场的机会.调用API接口是一种快速.方便.高效的方式获取淘宝商品数据. 以下是一些步骤来调用API接口来获取淘宝 ...

  10. ELK环境部署-基础环境安装(一)

    ELK简介 ElasticSearch工作原理以及专用名词 ELK是Elasticsearch(ES) , Logstash, Kibana的结合,是一个开源日志收集软件. Elasticsearch ...