浅谈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中将具有数字属性名的对象转换为数组
Mar 06 Javascript
javascript检查浏览器是否已经启用XX功能
Jul 10 Javascript
微信小程序 slider 详解及实例代码
Jan 10 Javascript
easy ui datagrid 从编辑框中获取值的方法
Feb 22 Javascript
javascript 网页进度条简单实例
Feb 22 Javascript
浅谈Vue.js应用的四种AJAX请求数据模式
Aug 30 Javascript
vue移动端弹框组件的实例
Sep 25 Javascript
浅谈angularJs函数的使用方法(大小写转换,拷贝,扩充对象)
Oct 08 Javascript
详解Vue前端生产环境发布配置实战篇
May 07 Javascript
JQuery实现简单的复选框树形结构图示例【附源码下载】
Jul 16 jQuery
Javascript执行流程细节原理解析
May 14 Javascript
vue swipeCell滑动单元格(仿微信)的实现示例
Sep 14 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 星际争霸
DC《小丑》11项提名领跑奥斯卡 Netflix成第92届奥斯卡提名最大赢家
2020/04/09 欧美动漫
fleaphp rolesNameField bug解决方法
2011/04/23 PHP
php全局变量和类配合使用深刻理解
2013/06/05 PHP
php版微信公众号接口实现发红包的方法
2016/10/14 PHP
浅谈laravel框架sql中groupBy之后排序的问题
2019/10/17 PHP
PHP实现随机发扑克牌
2020/04/22 PHP
JS获取父节点方法
2009/08/20 Javascript
理解Javascript_06_理解对象的创建过程
2010/10/15 Javascript
js 操作select与option(示例讲解)
2013/12/20 Javascript
JavaScript判断文件上传类型的方法
2014/09/02 Javascript
深入了解Node.js中的一些特性
2014/09/25 Javascript
jQuery检测某个元素是否存在代码分享
2015/07/09 Javascript
laydate.js日期时间选择插件
2017/01/04 Javascript
Node.js与Sails redis组件的使用教程
2017/02/14 Javascript
react开发中如何使用require.ensure加载es6风格的组件
2017/05/09 Javascript
基于 Immutable.js 实现撤销重做功能的实例代码
2018/03/01 Javascript
原生JS实现记忆翻牌游戏
2020/07/31 Javascript
JavaScript中交换值的10种方法总结
2020/08/18 Javascript
[01:48]DOTA2 2015国际邀请赛中国区预选赛第二日战报
2015/05/27 DOTA
Python os模块中的isfile()和isdir()函数均返回false问题解决方法
2015/02/04 Python
python转换字符串为摩尔斯电码的方法
2015/07/06 Python
详解Python中的变量及其命名和打印
2016/03/11 Python
python中map()函数的使用方法示例
2017/09/29 Python
css图标制作教程制作云图标
2014/01/19 HTML / CSS
html5 Canvas画图教程(2)—画直线与设置线条的样式如颜色/端点/交汇点
2013/01/09 HTML / CSS
德尔福集团DELPHI的笔试题
2012/02/22 面试题
室内设计实习自我鉴定
2013/09/25 职场文书
历史学专业大学生找工作的自我评价
2013/10/16 职场文书
汽车检测与维修专业求职信
2013/10/30 职场文书
红领巾心向党广播稿
2014/01/19 职场文书
生物制药专业自我鉴定
2014/02/19 职场文书
任命书范本大全
2014/06/06 职场文书
复试通知单模板
2015/04/24 职场文书
php随机生成验证码,php随机生成数字,php随机生成数字加字母!
2021/04/01 PHP
python基础之文件处理知识总结
2021/05/23 Python