浅谈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 相关文章推荐
jquery操作复选框(checkbox)的12个小技巧总结
Feb 04 Javascript
jQuery取id有.的值的方法
May 21 Javascript
一个简单的jQuery插件ajaxfileupload.js实现ajax上传文件例子
Jun 26 Javascript
jQuery使用append在html元素后同时添加多项内容的方法
Mar 26 Javascript
Bootstrap教程JS插件弹出框学习笔记分享
May 17 Javascript
jquery 无限极下拉菜单的简单实例(精简浓缩版)
May 31 Javascript
关于List.ToArray()方法的效率测试
Sep 30 Javascript
js实现淡入淡出轮播切换功能
Jan 13 Javascript
JS实现线性表的顺序表示方法示例【经典数据结构】
Apr 11 Javascript
如何让微信小程序页面之间的通信不再变困难
Jun 03 Javascript
JQuery发送ajax请求时中文乱码问题解决
Nov 14 jQuery
原生JavaScript实现简单五子棋游戏
Jun 28 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
Ajax+PHP 边学边练之四 表单
2009/11/27 PHP
Uncaught exception com_exception with message Failed to create COM object
2012/01/11 PHP
色色整理的PHP面试题集锦
2012/03/08 PHP
php获取qq用户昵称和在线状态(实例分析)
2013/10/27 PHP
php获取、检查类名、函数名、方法名的函数方法
2015/06/25 PHP
yii2.0框架多模型操作示例【添加/修改/删除】
2020/04/13 PHP
清华大学出版的事半功倍系列 javascript全部源代码
2007/05/04 Javascript
jcarousellite.js 基于Jquery的图片无缝滚动插件
2010/12/30 Javascript
offsetHeight在OnLoad中获取为0的现象
2013/07/22 Javascript
用jquery统计子菜单的条数示例代码
2013/10/18 Javascript
jquery中交替点击事件的实现代码
2014/02/14 Javascript
jquery仿百度百科底部浮动导航特效
2015/08/08 Javascript
JS实现自定义简单网页软键盘效果代码
2015/11/05 Javascript
jQuery实现图片文字淡入淡出效果
2015/12/21 Javascript
详细探究ES6之Proxy代理
2016/07/22 Javascript
利用Js的console对象,在控制台打印调式信息测试Js的实现
2016/11/26 Javascript
Bootstrap 3 进度条的实现
2017/02/22 Javascript
js读取json文件片段中的数据实例
2017/03/09 Javascript
js使用formData实现批量上传
2020/03/27 Javascript
微信小程序云开发使用方法新手初体验
2019/05/16 Javascript
JS document form表单元素操作完整示例
2020/01/13 Javascript
JQuery绑定事件四种实现方法解析
2020/12/02 jQuery
[04:29]【TI9采访】OG.N0tail在胜者组决赛后接受采访
2019/08/25 DOTA
用Python将IP地址在整型和字符串之间轻松转换
2017/03/22 Python
python利用Guetzli批量压缩图片
2017/03/23 Python
python数据预处理之将类别数据转换为数值的方法
2017/07/05 Python
如何使用python的ctypes调用医保中心的dll动态库下载医保中心的账单
2020/05/24 Python
美国著名的家居用品购物网站:Bed Bath & Beyond
2018/01/05 全球购物
澳大利亚优质的家居用品和生活方式公司:Bed Bath N’ Table
2019/04/16 全球购物
华硕新加坡官方网上商店:ASUS Singapore
2020/07/09 全球购物
C#实现启动一个进程
2016/10/01 面试题
大学生个人简历自荐信
2015/03/06 职场文书
家庭贫困证明
2015/06/16 职场文书
tensorboard 可视化之localhost:6006不显示的解决方案
2021/05/22 Python
pytorch 权重weight 与 梯度grad 可视化操作
2021/06/05 Python
Java多条件判断场景中规则执行器的设计
2021/06/26 Java/Android