浅谈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)及ie下event获取的两种方法
Dec 27 Javascript
jquery选择器排除某个DOM元素的方法(实例演示)
Apr 25 Javascript
深入理解javascript原型链和继承
Sep 23 Javascript
JS实现兼容性较好的随屏滚动效果
Nov 09 Javascript
Bootstrap实现下拉菜单效果
Apr 29 Javascript
Avalonjs 实现简单购物车功能(实例代码)
Feb 07 Javascript
Spring shiro + bootstrap + jquery.validate 实现登录、注册功能
Jun 02 jQuery
微信小程序三级联动地址选择器的实例代码
Jul 12 Javascript
利用vue开发一个所谓的数独方法实例
Dec 21 Javascript
Vue.js + Nuxt.js 项目中使用 Vee-validate 表单校验
Apr 22 Javascript
vue 进阶之实现父子组件间的传值
Apr 26 Javascript
js 数组 fill() 填充方法
Nov 02 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
PHP4.04简明安装
2006/10/09 PHP
php cli 方式 在crotab中运行解决
2010/02/08 PHP
解析thinkphp中的M()与D()方法的区别
2013/06/22 PHP
如何在Ubuntu下启动Apache的Rewrite功能
2013/07/05 PHP
PHP 使用 Imagick 裁切/生成缩略图/添加水印自动检测和处理 GIF
2016/02/19 PHP
php实现批量修改文件名称的方法
2016/07/23 PHP
thinkphp表单上传文件并将文件路径保存到数据库中
2016/07/28 PHP
PHP获取当前执行php文件名的代码
2017/03/02 PHP
PHP实现的策略模式简单示例
2017/08/25 PHP
使用原生javascript创建通用表单验证——更锋利的使用dom对象
2011/09/13 Javascript
JS实现仿京东淘宝竖排二级导航
2014/12/08 Javascript
node中socket.io的事件使用详解
2014/12/15 Javascript
jQuery中:submit选择器用法实例
2015/01/03 Javascript
jQuery通过扩展实现抖动效果的方法
2015/03/11 Javascript
微信小程序 flex实现导航实例详解
2017/04/26 Javascript
简单实现jQuery轮播效果
2017/08/18 jQuery
浅谈webpack编译vue项目生成的代码探索
2017/12/11 Javascript
electron+vue实现div contenteditable截图功能
2020/01/07 Javascript
[01:48]2018DOTA2亚洲邀请赛主赛事第二日五佳镜头 VG完美团战逆转TNC
2018/04/05 DOTA
Python2.x中str与unicode相关问题的解决方法
2015/03/30 Python
python处理html转义字符的方法详解
2016/07/01 Python
简单谈谈Python中的反转字符串问题
2016/10/24 Python
使用numpy和PIL进行简单的图像处理方法
2018/07/02 Python
Sanic框架路由用法实例分析
2018/07/16 Python
python 判断参数为Nonetype类型或空的实例
2018/10/30 Python
Python批量生成特定尺寸图片及图画任意文字的实例
2019/01/30 Python
简单的Python调度器Schedule详解
2019/08/30 Python
python GUI库图形界面开发之PyQt5表单布局控件QFormLayout详细使用方法与实例
2020/03/06 Python
解决python ThreadPoolExecutor 线程池中的异常捕获问题
2020/04/08 Python
Anaconda3中的Jupyter notebook添加目录插件的实现
2020/05/18 Python
Tensorflow加载Vgg预训练模型操作
2020/05/26 Python
既然说Ruby中一切都是对象,那么Ruby中类也是对象吗
2013/01/26 面试题
初中三好学生事迹材料
2014/01/13 职场文书
幼儿园中班新学期寄语
2014/01/18 职场文书
群众路线个人对照检查材料2014
2014/09/26 职场文书
公务员年度考核登记表个人总结
2015/02/12 职场文书