浅谈javascript中onbeforeunload与onunload事件


Posted in Javascript onDecember 10, 2015

在最近的项目中,需要做到一个时间,就是用户离开页面的时候,我需要缓存页面其中一部分的内容,但是我不需要用户刷新的时候也缓存,我只希望在我用户离开的时候

执行这个函数。百度之,有onbeforeunload与onunload这两个事件,但是onbeforeunload在用户刷新的时候也会执行。搞得我弄的挺久的,所以想在这里做一个小小的总结

onbeforeunload与onunload事件

onbeforeunload定义和用法

onbeforeunload 事件在即将离开当前页面(刷新或关闭)时触发。

该事件可用于弹出对话框,提示用户是继续浏览页面还是离开当前页面。

对话框默认的提示信息根据不同的浏览器有所不同,标准的信息类似 "确定要离开此页吗?"。该信息不能删除。

但你可以自定义一些消息提示与标准信息一起显示在对话框。

注意: 如果你没有在 <body> 元素上指定 onbeforeunload 事件,则需要在 window 对象上添加事件,并使用 returnValue 属性创建自定义信息(查看以下语法实例)。

注意: 在 Firefox 浏览器中,只显示默认提醒信息(不显示自定义信息)。

使用方法:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>test</title>
</head>
<body onbeforeunload="return test()">
   
</body>
<script type="text/javascript">
  function test(){
    return "你确定要离开吗";
  }
</script>
</html>

或者:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>test</title>
</head>
<body>
   
</body>
<script type="text/javascript">
window.onbeforeunload=function(){
  return "你确定要离开吗";
}
 
</script>
</html>

事件触发的时候弹出一个有确定和取消的对话框,确定则离开页面,取消则继续待在本页。当然你可以自定义提示文本。

那么,当我只需要在我离开时执行这个函数,而刷新的时候不执行,那怎么做呢?

window.onbeforeunload = function() {
 
    var n = window.event.screenX - window.screenLeft;
 
    var b = n > document.documentElement.scrollWidth - 20;
 
    if (!(b && window.event.clientY < 0 || window.event.altKey)) {
      //window.event.returnValue = "真的要刷新页面么?";
      
      //这里放置我想执行缓存的代码
      cacheFunction();
      
    }
 }

 这样,我离开页面时,可以执行我的缓存代码,而不弹出提示框,我刷新时也不弹出提示框,也不执行。值得一提的时,这个时候,要将ajax设置为同步,即:ajax里面的 async改为: false;

浏览器兼容情况

IE、Chrome、Safari 完美支持

Firefox 不支持文字提醒信息

Opera 不支持

IE6,IE7 使用 onbeforeunload 遇到的bug

2、onunload定义和用法

onunload 事件在用户退出页面时发生。

使用方法和onbeforeunload类似

window.onunload = function(){
  return "你确定要离开吗"
}

浏览器兼容情况

IE6,IE7,IE8 中 刷新页面、关闭浏览器之后、页面跳转之后都会执行;

IE9 刷新页面 会执行,页面跳转、关闭浏览器不能执行;

firefox(包括firefox3.6) 关闭标签之后、页面跳转之后、刷新页面之后能执行,但关闭浏览器不能执行;

Safari 刷新页面、页面跳转之后会执行,但关闭浏览器不能执行;

Opera、Chrome 任何情况都不执行。

总结

       Onunload,onbeforeunload都是在刷新或关闭时调用,可以在<script>脚本中通过window.onunload来指定或者在<body>里指定。区别在于onbeforeunload在onunload之前执行,它还可以阻止onunload的执行。

Onbeforeunload也是在页面刷新或关闭时调用,Onbeforeunload是正要去服务器读取新的页面时调用,此时还没开始读取;而onunload则已经从服务器上读到了需要加载的新的页面,在即将替换掉当前页面时调用。Onunload是无法阻止页面的更新和关闭的。而 Onbeforeunload 可以做到。

页面加载时只执行onload
页面关闭时先执行onbeforeunload,最后onunload
页面刷新时先执行onbeforeunload,然后onunload,最后onload。

Javascript 相关文章推荐
JS滚轮事件onmousewheel使用介绍
Nov 01 Javascript
javascript修改IMG标签的src问题
Mar 28 Javascript
究竟什么是Node.js?Node.js有什么好处?
May 29 Javascript
javascript实现网站加入收藏功能
Dec 16 Javascript
JS遍历页面所有对象属性及实现方法
Aug 01 Javascript
jQuery实现的多张图无缝滚动效果【测试可用】
Sep 12 Javascript
微信小程序 仿猫眼实现实例代码
Mar 14 Javascript
jQuery实现的背景颜色渐变动画效果示例
Mar 24 jQuery
node.js学习之断言assert的使用示例
Sep 28 Javascript
jQuery Validate插件ajax方式验证输入值的实例
Dec 21 jQuery
详解无限滚动插件vue-infinite-scroll源码解析
May 12 Javascript
QML实现圆环颜色选择器
Sep 25 Javascript
详解JavaScript基于面向对象之创建对象(2)
Dec 10 #Javascript
JS提交form表单实例分析
Dec 10 #Javascript
详解JavaScript基于面向对象之创建对象(1)
Dec 10 #Javascript
AngularJs实现ng1.3+表单验证
Dec 10 #Javascript
理解AngularJs指令
Dec 10 #Javascript
详解AngularJS实现表单验证
Dec 10 #Javascript
jquery实现鼠标悬浮停止轮播特效
Aug 20 #Javascript
You might like
动漫女神老婆无限好,但日本女生可能就不是这么一回事了!
2020/03/04 日漫
php中sql注入漏洞示例 sql注入漏洞修复
2014/01/24 PHP
PHP输出英文时间日期的安全方法(RFC 1123格式)
2014/06/13 PHP
phpmyadmin中禁止外网使用的方法
2014/11/04 PHP
PHP开发实现快递查询功能详解
2019/04/08 PHP
PHP中上传文件打印错误错误类型分析
2019/04/14 PHP
jquery中获取元素的几种方式小结
2011/07/05 Javascript
js数值和和字符串进行转换时可以对不同进制进行操作
2014/03/05 Javascript
原生javascript实现拖动元素示例代码
2014/09/01 Javascript
jquery禁止回车触发表单提交
2014/12/12 Javascript
使用FlexiGrid实现Extjs表格效果方法分享
2014/12/16 Javascript
解析Node.js异常处理中domain模块的使用方法
2016/02/16 Javascript
微信小程序 获取当前地理位置和经纬度实例代码
2016/12/05 Javascript
jquery.zclip轻量级复制失效问题
2017/01/08 Javascript
对存在JavaScript隐式类型转换的四种情况的总结(必看篇)
2017/08/31 Javascript
微信小程序之页面拦截器的示例代码
2017/09/07 Javascript
js仿微信抢红包功能
2020/09/25 Javascript
详解基于vue-cli优化的webpack配置
2017/11/06 Javascript
微信小程序停止其他视频播放当前视频的实例代码
2019/12/25 Javascript
Python计时相关操作详解【time,datetime】
2017/05/26 Python
Python递归函数定义与用法示例
2017/06/02 Python
Python 实现引用其他.py文件中的类和类的方法
2018/04/29 Python
matplotlib给子图添加图例的方法
2018/08/03 Python
python pandas时序处理相关功能详解
2019/07/03 Python
python 绘制拟合曲线并加指定点标识的实现
2019/07/10 Python
Python 实现Image和Ndarray互相转换
2020/02/19 Python
一文轻松掌握python语言命名规范规则
2020/06/18 Python
python之随机数函数的实现示例
2020/12/30 Python
css3实现波纹特效、H5实现动态波浪效果
2018/01/31 HTML / CSS
新锐科技Java程序员面试题
2016/07/25 面试题
应届生污水处理求职信
2013/11/06 职场文书
运动会入场解说词
2014/02/07 职场文书
个性与发展自我评价
2014/02/11 职场文书
优秀少先队大队辅导员事迹材料
2014/05/04 职场文书
春季运动会开幕词
2015/01/28 职场文书
巴黎圣母院读书笔记
2015/06/26 职场文书