浅谈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 相关文章推荐
firefox中JS读取XML文件
Dec 21 Javascript
jquery $.ajax各个事件执行顺序
Oct 15 Javascript
javascript针对DOM的应用分析(四)
Apr 15 Javascript
JS正则中的RegExp对象对象
Nov 07 Javascript
基于BootStrap Metronic开发框架经验小结【八】框架功能总体界面介绍
May 12 Javascript
Js类的静态方法与实例方法区分及jQuery拓展的两种方法
Jun 03 Javascript
jQuery动态移除和添加背景图片的方法详解
Mar 07 Javascript
angularjs利用directive实现移动端自定义软键盘的示例
Sep 20 Javascript
原生JS实现前端本地文件上传
Sep 08 Javascript
详解为生产环境编译Angular2应用的方法
Dec 10 Javascript
微信小程序实现左侧滑栏过程解析
Aug 26 Javascript
微信小程序地图实现展示线路
Jul 29 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
PHP实现PDO的mysql数据库操作类
2014/12/12 PHP
PHP mysqli_free_result()与mysqli_fetch_array()函数详解
2016/09/21 PHP
PHP设计模式之适配器模式原理与用法分析
2018/04/25 PHP
在Laravel5.6中使用Swoole的协程数据库查询
2018/06/15 PHP
JavaScript读取中文cookie时的乱码问题的解决方法
2009/10/14 Javascript
AJAX的跨域与JSONP(为文章自动添加短址的功能)
2010/01/17 Javascript
extjs中grid中嵌入动态combobox的应用
2011/01/01 Javascript
根据选择不同的下拉值出现相对应的文本输入框
2013/08/01 Javascript
浅谈javascript 函数属性和方法
2015/01/21 Javascript
bootstrap table操作技巧分享
2017/02/15 Javascript
JavaScript自执行函数和jQuery扩展方法详解
2017/10/27 jQuery
JS伪继承prototype实现方法示例
2018/06/20 Javascript
JavaScript HTML DOM元素 节点操作汇总
2019/07/29 Javascript
jQuery AJAX应用实例总结
2020/05/19 jQuery
[07:52]2014DOTA2 TI逗比武士游V社解说背后的故事
2014/07/10 DOTA
[46:57]EG vs Winstrike 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
[42:52]Optic vs Serenity 2018国际邀请赛淘汰赛BO3 第二场 8.22
2018/08/23 DOTA
Python中使用动态变量名的方法
2014/05/06 Python
django admin 后台实现三级联动的示例代码
2018/06/22 Python
Django 视图层(view)的使用
2018/11/09 Python
python IDLE 背景以及字体大小的修改方法
2019/07/12 Python
python 用户交互输入input的4种用法详解
2019/09/24 Python
如何基于Python实现数字类型转换
2020/02/07 Python
python加密解密库cryptography使用openSSL生成的密匙加密解密
2020/02/11 Python
python selenium操作cookie的实现
2020/03/18 Python
flask框架中的cookie和session使用
2021/01/31 Python
军校制空专业毕业生自我鉴定
2013/11/16 职场文书
中专生自我鉴定
2013/12/17 职场文书
《美丽的田园》教学反思
2014/03/01 职场文书
小学生操行评语大全
2014/04/22 职场文书
节能环保标语
2014/06/12 职场文书
人力资源职位说明书
2014/07/29 职场文书
管理失职检讨书
2015/05/05 职场文书
《鲁滨逊漂流记》之六读后感(4篇)
2019/09/29 职场文书
详解MySQL的主键查询为什么这么快
2022/04/03 MySQL
Oracle使用别名的好处
2022/04/19 Oracle