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 相关文章推荐
很全的显示阴历(农历)日期的js代码
Jan 01 Javascript
跨域表单提交状态的变相判断代码
Nov 12 Javascript
JS类的封装及实现代码
Dec 02 Javascript
jQuery教程 $()包装函数来实现数组元素分页效果
Aug 13 Javascript
checkbox使用示例
Aug 23 Javascript
javascript搜索框点击文字消失失焦时文本出现
Sep 18 Javascript
JS延时提示框实现方法详解
Nov 26 Javascript
基于Turn.js 实现翻书效果实例解析
Jun 20 Javascript
AngularJS ui-router (嵌套路由)实例
Mar 10 Javascript
WebPack配置vue多页面的技巧
May 15 Javascript
微信小程序用canvas画图并分享
Mar 09 Javascript
uni-app 自定义底部导航栏的实现
Dec 11 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
php 修改zen-cart下单和付款流程以防止漏单
2010/03/08 PHP
PHP取整数函数常用的四种方法小结
2012/07/05 PHP
如何用php获取程序执行的时间
2013/06/09 PHP
php字符串截取的简单方法
2013/07/04 PHP
js 图片轮播(5张图片)
2008/12/30 Javascript
学习面向对象之面向对象的基本概念:对象和其他基本要素
2010/11/30 Javascript
利用javascript实现web页面中指定区域打印
2013/10/30 Javascript
jquery自动将form表单封装成json的具体实现
2014/03/17 Javascript
jQuery实现字符串按指定长度加入特定内容的方法
2015/03/11 Javascript
在线所见即所得HTML编辑器的实现原理浅析
2015/04/25 Javascript
自己动手写的javascript前端等待控件
2015/10/30 Javascript
JavaScript面向对象之私有静态变量实例分析
2016/01/14 Javascript
jQuery实现无限往下滚动效果代码
2016/04/16 Javascript
AngularJS 执行流程详细介绍
2016/08/18 Javascript
用nodeJS搭建本地文件服务器的几种方法小结
2017/03/16 NodeJs
Vuex 进阶之模块化组织详解
2018/01/12 Javascript
Vue中android4.4不兼容问题的解决方法
2018/09/04 Javascript
JQuery模拟实现网页中自定义鼠标右键菜单功能
2018/11/14 jQuery
vue移动端使用appClound拉起支付宝支付的实现方法
2019/11/21 Javascript
微信小程序实现搜索框功能及踩过的坑
2020/06/19 Javascript
[02:42]2014DOTA2国际邀请赛 三冰专访:我会打到Ti20
2014/07/13 DOTA
python使用pygame框架实现推箱子游戏
2018/11/20 Python
关于Pycharm无法debug问题的总结
2019/01/19 Python
计算机二级python学习教程(3) python语言基本数据类型
2019/05/16 Python
python里dict变成list实例方法
2019/06/26 Python
Python 爬虫实现增加播客访问量的方法实现
2019/10/31 Python
Python语法之精妙的十个知识点(装B语法)
2020/01/18 Python
Python+Appium实现自动化测试的使用步骤
2020/03/24 Python
使用SVG实现提示框功能的示例代码
2020/06/05 HTML / CSS
车辆工程专业求职信
2014/04/28 职场文书
超搞笑婚前保证书
2015/05/08 职场文书
2015年社区居委会工作总结
2015/05/18 职场文书
教你一步步实现一个简易promise
2021/11/02 Javascript
php修改word的实例方法
2021/11/17 PHP
关于EntityWrapper的in用法
2022/03/22 Java/Android
Vite + React从零开始搭建一个开源组件库
2022/06/25 Javascript