浅谈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条件判断使用小技巧总结
Sep 08 Javascript
Javascript delete 引用类型对象
Nov 01 Javascript
利用javaScript实现点击输入框弹出窗体选择信息
Dec 11 Javascript
JS实现网页滚动条感应鼠标变色的方法
Feb 26 Javascript
深入理解JQuery中的事件与动画
May 18 Javascript
js实现浏览器倒计时跳转页面效果
Aug 12 Javascript
详解springmvc 接收json对象的两种方式
Dec 06 Javascript
Vue的百度地图插件尝试使用
Sep 06 Javascript
Vue实现动态创建和删除数据的方法
Mar 17 Javascript
javascript之分片上传,断点续传的实际项目实现详解
Sep 05 Javascript
vue穿梭框实现上下移动
Jan 29 Vue.js
vue ref如何获取子组件属性值
Mar 31 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 静态变量的初始化
2009/11/15 PHP
PHP中$GLOBALS与global的区别详解
2019/03/21 PHP
Javascript Cookie读写删除操作的函数
2010/03/02 Javascript
JQuery扩展插件Validate—4设置错误提示的样式
2011/09/05 Javascript
使用JS CSS去除IE链接虚线框的三种方法
2013/11/14 Javascript
js中Image对象以及对其预加载处理示例
2013/11/20 Javascript
开发中可能会用到的jQuery小技巧
2014/03/07 Javascript
js实现大转盘抽奖游戏实例
2015/06/24 Javascript
简单实现js选项卡切换效果
2016/02/03 Javascript
jQuery EasyUI菜单与按钮详解
2016/07/13 Javascript
AngularJS动态生成div的ID源码解析
2016/08/29 Javascript
jquery实现文本框的禁用和启用
2016/12/07 Javascript
js模糊查询实例分享
2016/12/26 Javascript
Canvas + JavaScript 制作图片粒子效果
2017/02/08 Javascript
jQuery插件zTree实现获取当前选中节点在同级节点中序号的方法
2017/03/08 Javascript
原生JavaScript实现的简单放大镜效果示例
2018/02/07 Javascript
jQuery实现的3D版图片轮播示例【滑动轮播】
2019/01/18 jQuery
在Linux上安装Python的Flask框架和创建第一个app实例的教程
2015/03/30 Python
python利用urllib实现爬取京东网站商品图片的爬虫实例
2017/08/24 Python
python实现m3u8格式转换为mp4视频格式
2018/02/28 Python
用Python和WordCloud绘制词云的实现方法(内附让字体清晰的秘笈)
2019/01/08 Python
django模板结构优化的方法
2019/02/28 Python
基于Python实现人脸自动戴口罩系统
2020/02/06 Python
在keras里实现自定义上采样层
2020/06/28 Python
python爬虫快速响应服务器的做法
2020/11/24 Python
用html5的canvas和JavaScript创建一个绘图程序的简单实例
2016/07/06 HTML / CSS
阿里健康官方海外旗舰店:阿里健康国际自营
2017/11/24 全球购物
UGG澳洲官网:UGG Australia
2018/04/26 全球购物
新西兰杂志订阅:isubscribe
2019/08/26 全球购物
房地产销售员的自我评价分享
2013/12/04 职场文书
化学实验员岗位职责
2013/12/28 职场文书
计算机相关的自我评价
2014/01/15 职场文书
贷款担保书
2015/01/20 职场文书
清明节网上祭英烈寄语2015
2015/03/04 职场文书
2015年小学教科研工作总结
2015/07/20 职场文书
Win11 Build 22000.51版本文件资源管理器“命令栏”和上下文菜单有什么新变化?
2021/11/21 数码科技