分享JavaScript获取网页关闭与取消关闭的事件


Posted in Javascript onDecember 13, 2013

在做Web开发时,我们经常用到页面关闭事件onbeforeunload,可以给用户一个选择放弃关闭的机会,就比如这个博客编辑器。如果用户选择了离开,那么onunload事件自然会触发;但若用户选择了取消,又该如何检测呢?

我们假定一个页面离开取消事件,叫做onunloadcancel。显然,这个事件应触发在用户按下对话框的取消按钮之后。但关闭提示对话框的触发流程并不是那么简单。我们先来回顾下这个过程:

window.onbeforeunload = function()
{
    return "真的离开?";
}

当用户准备离开页面(比如按下关闭按钮,或者刷新页面等等),onbeforeunload事件触发。我们的脚本无法在这个事件里决定是否阻止页面的关闭,唯一能做到的只有返回一个字符串,这个字符串仅作为说明文字出现在关闭选择对话框里,用户可以选择关闭,或者不关闭。但究竟选择哪个,我们无从得知。

然而仔细分析下这个问题,其实不然。 如果用户真选择了关闭页面,那么之后所有的运行代码都byebye了;而继续留在页面的话,就当什么都没发生过,除了onbeforeunload事件。所以,我们在onbeforeunload事件里做点小花招,在此注册个几毫秒之后启动的定时器,如果页面真关闭了,那么这个定时器当然是作废了;那么页面还在,几毫秒的延时对于这个本来就是异步的界面交互事件也没有什么误差。

<script language="JavaScript">
window.onbeforeunload = function()
{
    setTimeout(onunloadcancel, 10);
    return "真的离开?";
}
window.onunloadcancel = function()
{
    alert("取消离开");
}
</script>

我们使用setTimeout,延时10ms执行onunloadcancel。如果页面真关闭了,定时器当然都销毁;反之继续。但在测试中,发现FireFox有个两个BUG:

有时按下关闭按钮,也会执行onunloadcancel,并且有个对话框一闪而过。如果换成while(1);浏览器会一直卡死,这说明onunloadcancel确实是执行了,只是销毁了界面,但并没有暂停脚本的运行。
如果是通过刷新页面的方式离开,仅执行一次onbeforeunload,但点击X按钮关闭页面,会执行两次onbeforeunload。因此我们还需在完善下,以便兼容FF。

<script language="JavaScript">
var _t;
window.onbeforeunload = function()
{
    setTimeout(function(){_t = setTimeout(onunloadcancel, 0)}, 0);
    return "真的离开?";
}
window.onunloadcancel = function()
{
    clearTimeout(_t);
    alert("取消离开");
}
</script>

这里使用了一种我也说不出原因的办法,应该算是hack,解决了FF下的bug。
Javascript 相关文章推荐
JQuery实现简单验证码提示解决方案
Dec 20 Javascript
鼠标放在图片上显示大图的JS代码
Mar 26 Javascript
jQuery实现可拖动的浮动层完整代码
May 27 Javascript
Javascript中对象继承的实现小例
May 12 Javascript
jquery显示隐藏input对象
Jul 21 Javascript
原生JS实现响应式瀑布流布局
Apr 02 Javascript
jQuery插件Tooltipster实现漂亮的工具提示
Apr 12 Javascript
Websocket协议详解及简单实例代码
Dec 12 Javascript
js实现点击切换checkbox背景图片的简单实例
May 08 Javascript
Angular 2父子组件之间共享服务通信的实现
Jul 04 Javascript
angular或者js怎么确定选中ul中的哪几个li
Aug 16 Javascript
Vue3.0的优化总结
Oct 16 Javascript
js获取触发事件元素在整个网页中的绝对坐标(示例代码)
Dec 13 #Javascript
浅析XMLHttpRequest的缓存问题
Dec 13 #Javascript
xmlhttp缓存清除的2种解决方法
Dec 13 #Javascript
js获取url参数代码实例分享(JS操作URL)
Dec 13 #Javascript
js获取html页面节点方法(递归方式)
Dec 13 #Javascript
jquery 合并内容相同的单元格(示例代码)
Dec 13 #Javascript
javascript读取xml实现javascript分页
Dec 13 #Javascript
You might like
PHP 危险函数解释 分析
2009/04/22 PHP
PHP CKEditor 上传图片实现代码
2009/11/06 PHP
PHP操作XML作为数据库的类
2010/12/19 PHP
php中3种方法统计字符串中每种字符的个数并排序
2012/08/27 PHP
PHP读取CURL模拟登录时生成Cookie文件的方法
2014/11/04 PHP
php pdo oracle中文乱码的快速解决方法
2016/05/16 PHP
PHP实现大数(浮点数)取余的方法
2017/02/18 PHP
PHP 中常量的知识整理
2017/04/14 PHP
TP5(thinkPHP5)框架使用ajax实现与后台数据交互的方法小结
2020/02/10 PHP
JS关键字球状旋转效果的实例代码
2013/11/29 Javascript
jQuery实现列表的全选功能
2015/03/18 Javascript
基于jQuery的select下拉框选择触发事件实例分析
2016/11/18 Javascript
Bootstrap modal使用及点击外部不消失的解决方法
2016/12/13 Javascript
jQuery弹出窗口打开链接的实现代码
2016/12/24 Javascript
vue的toast弹窗组件实例详解
2018/05/14 Javascript
Jquery和CSS实现选择框重置按钮功能
2018/11/08 jQuery
JavaScript, select标签元素左右移动功能实现
2020/05/14 Javascript
Python中的jquery PyQuery库使用小结
2014/05/13 Python
github配置使用指南
2014/11/18 Python
python 计算文件的md5值实例
2017/01/13 Python
Python实现一个简单的验证码程序
2017/11/03 Python
python网络爬虫 CrawlSpider使用详解
2019/09/27 Python
python 图像的离散傅立叶变换实例
2020/01/02 Python
Python Selenium截图功能实现代码
2020/04/26 Python
Python实现爬取网页中动态加载的数据
2020/08/17 Python
Python+unittest+requests 接口自动化测试框架搭建教程
2020/10/09 Python
CSS3中Animation动画属性用法详解
2016/07/04 HTML / CSS
沙特阿拉伯电子产品和家用电器购物网站:Black Box
2019/07/24 全球购物
六个一活动实施方案
2014/03/21 职场文书
2015年学校心理健康教育工作总结
2015/05/11 职场文书
企业年会祝酒词
2015/08/11 职场文书
2016大学生毕业实习心得体会
2016/01/23 职场文书
《只有一个地球》教学反思
2016/02/16 职场文书
原来实习报告是这样写的呀!
2019/07/03 职场文书
golang判断key是否在map中的代码
2021/04/24 Golang
Python 键盘事件详解
2021/11/11 Python