JS区分浏览器页面是刷新还是关闭


Posted in Javascript onApril 17, 2016

Web开发者在系统开发中经常要面对产品经理各式各样的需求,当然,大部分对产品体验还是有帮助的,例如我们今天提到的刷新页面,前进后退,关闭浏览器标签时,为了避免用户误操作,需给出二次确认提示框,这个相信大家都非常熟悉了,采用浏览器提供的BOM事件机制就可以解决,使用window对象的onbeforeunload事件即可,如果产品经理只提出这样的需求,那确实无可厚非,然而其需要的不仅仅是这些...

例如,我们一次项目开发中,产品经理就针对我们的实现提出了“改进方案”:

你们这弹出框太丑了,跟系统整体风格不搭调啊,不能使用咱们自己组件库中的Dialog吗?很好的问题...我只想说,you can you up...

你们这刷新和关闭标签页中展示的文案一样啊,需要区分对待下,刷新提示XXX,关闭时提示SSS,这样用户才能更明确。恩,考虑到了用户的体验,很好,我还是想说,you can you up...其实,浏览器在关闭和刷新时,本身已经区别对待了,提示是不同的,只不过我们自定义的部分并不能显示不同的文案而已;当然,也有一些hack的方法,但是很难适应多个浏览器,各浏览器内部对于关闭标签页和刷新的实现机制会有所不同;

你们每次登录进来,为什么要延时10秒,才让坐席签入电话系统啊(我们做的是客服系统)?能不能把这个限制去掉啊,用户体验太不好了!我们也想去掉啊,但是电话系统频繁签入签出会有问题,用户刷新了浏览器,再次签入,如果相隔时间很短的话,电话系统会出现故障,为了避免这个问题,我们才加上了这个限制,但是回过头来思考,就可以进入我们今天讨论的主题了;

区分刷新与关闭标签页

我们无法根据浏览器事件区分刷新还是关闭标签页,进而在相应动作触发前,执行不同的动作,但是对于上文中产品提出的第三点意见,其实还是可以考虑优化一下的,就是只有在刷新的时候延时10秒,新登录或关闭标签页一段时间之后再进来时不延时;

要做到这点其实也很简单,使用浏览器的本地存储机制就可以实现,例如cookie,LocalStorage等,这里就不能使用SessionStorage了,因为本次回话结束后,该缓存就失效了;由于在cookie中存储会增加cookie的字节数,每次请求中相应的网络传输量会增加,因此,我们采用了LocalStorage;其操作很简单,我们使用的前端框架是AngularJS,具体如下:

const MAX_WAIT_TIME = 10;
const currentDate = new Date().getTime();
const lastestLeaveTime = parseInt(this.$window.localStorage.getItem('lastestLeaveTime'), 10) || currentDate;
this.secondCounter = Math.max(MAX_WAIT_TIME - Math.ceil((currentDate - lastestLeaveTime) / 1000), 0);
if (this.secondCounter > 0) {
this.logoutTimeInterval = this.$interval(()=> {
this.secondCounter--;
this.$scope.$digest();
}, 1000, this.secondCounter, false).then(() => {
this.updateByStatus(this.AvayaService.status.OFFLINE);
});
} else {
this.updateByStatus(this.AvayaService.status.OFFLINE);
}

上面代码主要作用是,进入系统后,会先去LocalStorage中获取上次退出时的时间,再获取当前时间,两个时间进行减法,如果值小于10秒,我们就认为这是刷新,如果值大于10秒,我们认为是关闭标签页或新登录,进而可以执行不同的方法,让客服有更好的体验,不用每次进入系统都要等待10秒才能签入电话系统了,产品经理还是很重要的,吼吼,要不是他的疑问,可能我们也不会来优化这个地方了...当然,其实RD也要逐渐培养这种用户体验至上的思维,哪怕有一点可提升客服效率的地方,都值得我们花时间来优化;

下面把相关退出的代码也贴一下吧,前面忘说了,不管是刷新,还是关闭标签页,只要是页面销毁,我们都会去执行登出电话系统的操作,所以每次进来后需要重新签入;

//刷新页面或者关闭页面
$window.onbeforeunload = () => {
return '操作将会导致页面数据清空,请谨慎操作...';
};
//每次页面unload时,设置LocalStorage时间;
$window.onunload = () => {
$window.localStorage.setItem('lastestLeaveTime', new Date().getTime());
};

我们可能还注意到一些问题,那就是刷新,关闭页面,前进后退,你需要跳出浏览器默认二次确认框,但是用户点击退出系统按钮,则必须弹出自己组件库中的Dialog了,还必须不能两个都弹出,具体代码如下:

onStatusClick(index, name) {
if (name === '退出') {
this.mgDialog.openConfirm({
showClose: false,
template: 'app/header/logoutDialog.html',
controller: 'HeaderDialogController as dialog',
data: {
'title': '您确定要退出系统吗?'
}
}).then(() => {
this.$window.location.href = '/logout';
this.$window.onbeforeunload = null;
});
} else {
// 内部操作,大家不用管
...
}
}

以上所述是小编给大家介绍的JS区分浏览器页面是刷新还是关闭的全部内容,希望对大家有所帮助!

Javascript 相关文章推荐
TinyMCE 新增本地图片上传功能
Nov 05 Javascript
javascript之querySelector和querySelectorAll使用介绍
Dec 20 Javascript
window.open不被拦截的实现代码
Aug 22 Javascript
Jquery树插件zTree用法入门教程
Feb 17 Javascript
Bootstrap进度条学习使用
Feb 09 Javascript
浅谈$_FILES数组为空的原因
Feb 16 Javascript
详解vue2.0脚手架的webpack 配置文件分析
May 27 Javascript
详解VueJS 数据驱动和依赖追踪分析
Jul 26 Javascript
重学JS 系列:聊聊继承(推荐)
Apr 11 Javascript
Vue 中可以定义组件模版的几种方式
Aug 06 Javascript
vue 自定义右键样式的实例代码
Nov 06 Javascript
代码解析React中setState同步和异步问题
Jun 03 Javascript
js组件SlotMachine实现图片切换效果制作抽奖系统
Apr 17 #Javascript
JS中取二维数组中最大值的方法汇总
Apr 17 #Javascript
JS组件Bootstrap ContextMenu右键菜单使用方法
Apr 17 #Javascript
js实现select二级联动下拉菜单
Apr 17 #Javascript
基于javascript实现精确到毫秒的倒计时限时抢购
Apr 17 #Javascript
第二次聊一聊JS require.js模块化工具的基础知识
Apr 17 #Javascript
第一次接触JS require.js模块化工具
Apr 17 #Javascript
You might like
数据库的日期格式转换
2006/10/09 PHP
php数组函数序列之array_values() 获取数组元素值的函数与方法
2011/10/30 PHP
PHP实现把MySQL数据库导出为.sql文件实例(仿PHPMyadmin导出功能)
2014/05/10 PHP
PHP使用SMTP邮件服务器发送邮件示例
2018/08/28 PHP
myFocus slide3D v1.1.0 使用方法与下载
2011/01/12 Javascript
JS 操作Array数组的方法及属性实例解析
2014/01/08 Javascript
javascript中2个感叹号的用法实例详解
2014/09/04 Javascript
javascript常用函数归纳整理
2014/10/31 Javascript
javascript 获取浏览器版本
2015/01/21 Javascript
jquery实现在光标位置插入内容的方法
2015/02/05 Javascript
jqueryUI里拖拽排序示例分析
2015/02/26 Javascript
jQuery插件Zclip实现完美兼容个浏览器点击复制内容到剪贴板
2015/04/30 Javascript
Bootstrap风格的WPF样式
2016/12/07 Javascript
基于JavaScript实现自动更新倒计时效果
2016/12/19 Javascript
详解weex默认webpack.config.js改造
2018/01/08 Javascript
Vue异步组件处理路由组件加载状态的解决方案
2018/09/07 Javascript
实例讲解vue源码架构
2019/01/24 Javascript
详解如何使用webpack打包多页jquery项目
2019/02/01 jQuery
JS使用队列对数组排列,基数排序算法示例
2019/03/02 Javascript
小程序getLocation需要在app.json中声明permission字段
2019/04/04 Javascript
node事件循环和process模块实例分析
2020/02/14 Javascript
JS实现躲避粒子小游戏
2020/06/18 Javascript
python定时器使用示例分享
2014/02/16 Python
python2.7和NLTK安装详细教程
2018/09/19 Python
解决Python下imread,imwrite不支持中文的问题
2018/12/05 Python
python 工具 字符串转numpy浮点数组的实现
2020/03/14 Python
python多线程semaphore实现线程数控制的示例
2020/08/10 Python
python3.5的包存放的具体路径
2020/08/16 Python
pytorch中index_select()的用法详解
2021/01/06 Python
好的自荐信的要求
2013/10/30 职场文书
水果超市创业计划书
2014/01/27 职场文书
2014年文学毕业生自我鉴定
2014/04/23 职场文书
小学三八妇女节活动总结
2015/02/06 职场文书
讲文明倡议书
2015/04/29 职场文书
详解如何使用Node.js实现热重载页面
2021/05/06 Javascript
详解Redis主从复制实践
2021/05/19 Redis