浅谈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 相关文章推荐
javaScript 关闭浏览器 (不弹出提示框)
Jan 31 Javascript
JavaScript 变量作用域分析
Jul 04 Javascript
js如何调用qq互联api实现第三方登录
Mar 28 Javascript
简单学习JavaScript中的for语句循环结构
Nov 10 Javascript
基于JavaScript实现根据手机定位获取当前具体位置(X省X市X县X街道X号)
Dec 29 Javascript
基于angular中的重要指令详解($eval,$parse和$compile)
Oct 21 Javascript
js操作二进制数据方法
Mar 03 Javascript
JS同步、异步、延迟加载的方法
May 05 Javascript
cdn模式下vue的基本用法详解
Oct 07 Javascript
vue h5移动端禁止缩放代码
Oct 28 Javascript
javascript实现简易的计算器
Jan 17 Javascript
vue-quill-editor插入图片路径太长问题解决方法
Jan 08 Vue.js
详解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中上传大体积文件时需要的设置
2006/10/09 PHP
PHP 循环列出目录内容的函数代码
2010/05/26 PHP
linux平台编译安装PHP7并安装Redis扩展与Swoole扩展实例教程
2016/09/30 PHP
JTrackBar水平拖动效果
2007/07/15 Javascript
JavaScript类和继承 constructor属性
2010/03/04 Javascript
基于jquery的自定义鼠标提示效果 jquery.toolTip
2010/11/14 Javascript
使用隐藏的new来创建对象
2011/03/29 Javascript
JS 进度条效果实现代码整理
2011/05/21 Javascript
jquery高效反选具体实现
2013/05/05 Javascript
JS阻止冒泡事件以及默认事件发生的简单方法
2014/01/17 Javascript
jquery1.10给新增元素绑定事件的方法
2014/03/06 Javascript
javascript搜索框点击文字消失失焦时文本出现
2014/09/18 Javascript
js表头排序实现方法
2015/01/16 Javascript
使用ngView配合AngularJS应用实现动画效果的方法
2015/06/19 Javascript
每日十条JavaScript经验技巧(二)
2016/06/23 Javascript
关于Javascript回调函数的一个妙用
2016/08/29 Javascript
js入门之Function函数的使用方法【新手必看】
2016/11/22 Javascript
d3.js实现立体柱图的方法详解
2017/04/28 Javascript
javascript实现遮罩层动态效果实例
2019/05/14 Javascript
微信小程序 wx:for遍历循环使用实例解析
2019/09/09 Javascript
jQuery模仿ToDoList实现简单的待办事项列表
2019/12/30 jQuery
node.js使用 http-proxy 创建代理服务器操作示例
2020/02/10 Javascript
详解node和ES6的模块导出与导入
2020/02/19 Javascript
uniapp电商小程序实现订单30分钟倒计时
2020/11/01 Javascript
python抓取京东商城手机列表url实例代码
2013/12/18 Python
Python 3实战爬虫之爬取京东图书的图片详解
2017/10/09 Python
微信公众号token验证失败解决方案
2019/07/22 Python
Python telnet登陆功能实现代码
2020/04/16 Python
Python3中对json格式数据的分析处理
2021/01/28 Python
html5中valid、invalid、required的定义
2014/02/21 HTML / CSS
党风廉政建设责任书
2014/04/14 职场文书
基层党支部整改方案
2014/10/25 职场文书
国际贸易实训报告
2014/11/05 职场文书
文明上网主题班会
2015/08/14 职场文书
python 使用Tensorflow训练BP神经网络实现鸢尾花分类
2021/05/12 Python
利用JavaScript写一个简单计算器
2021/11/27 Javascript