浅谈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 相关文章推荐
IE6弹出“已终止操作”的解决办法
Nov 27 Javascript
动态的改变IFrame的高度实现IFrame自动伸展适应高度
Dec 28 Javascript
js处理自己不能定义二维数组的方法详解
Mar 03 Javascript
jquery渐隐渐显的图片幻灯闪烁切换实现方法
Feb 26 Javascript
JS实现新浪微博效果带遮罩层的弹出框代码
Oct 12 Javascript
浅析函数声明和函数表达式——函数声明的声明提前
May 03 Javascript
基于JS实现类似支付宝支付密码输入框
Sep 02 Javascript
微信公众号支付H5调用支付解析
Nov 04 Javascript
Javascript oop设计模式 面向对象编程简单实例介绍
Dec 13 Javascript
薪资那么高的Web前端必看书单
Oct 13 Javascript
JS实现炫酷轮播图
Nov 15 Javascript
适用于 Vue 的播放器组件Vue-Video-Player操作
Nov 16 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
初探PHP5
2006/10/09 PHP
php设计模式 Facade(外观模式)
2011/06/26 PHP
深入php socket的讲解与实例分析
2013/06/13 PHP
PHP符合PSR编程规范的实例分享
2016/12/21 PHP
JavaScript学习点滴 call、apply的区别
2010/10/22 Javascript
jquery关于图形报表的运用实现代码
2011/01/06 Javascript
JS继承 笔记
2011/07/13 Javascript
使用JavaScript动态设置样式实现代码(2)
2013/01/25 Javascript
Js实现手机发送验证码时按钮延迟操作
2014/06/20 Javascript
通过npm引用的vue组件使用详解
2017/03/02 Javascript
jQuery实现上下滚动公告栏详细代码
2018/11/21 jQuery
从vue源码看props的用法
2019/01/09 Javascript
JS实现基本的网页计算器功能示例
2020/01/16 Javascript
解决node终端下运行js文件不支持ES6语法
2020/04/04 Javascript
深入浅出学习python装饰器
2017/09/29 Python
机器学习python实战之决策树
2017/11/01 Python
Django基础知识与基本应用入门教程
2018/07/20 Python
Random 在 Python 中的使用方法
2018/08/09 Python
树莓派用python中的OpenCV输出USB摄像头画面
2019/06/22 Python
简单了解Python matplotlib线的属性
2019/06/29 Python
Django中多种重定向方法使用详解
2019/07/17 Python
flask框架jinja2模板与模板继承实例分析
2019/08/01 Python
Python上下文管理器用法及实例解析
2019/11/11 Python
keras 指定程序在某块卡上训练实例
2020/06/22 Python
Python如何执行精确的浮点数运算
2020/07/31 Python
pycharm中leetcode插件使用图文详解
2020/12/07 Python
关于django python manage.py startapp 应用名出错异常原因解析
2020/12/15 Python
澳大利亚第一的设计师礼服租赁网站:GlamCorner
2017/08/13 全球购物
德国机车企业:FC-Moto
2017/10/27 全球购物
FLOS美国官网:意大利高级照明工艺的传奇
2018/08/07 全球购物
Nike比利时官网:Nike.com (BE)
2019/02/07 全球购物
精灵市场:Pixie Market
2019/06/18 全球购物
EJB面试题
2015/07/28 面试题
社区服务活动小结
2014/07/08 职场文书
用Python爬取各大高校并可视化帮弟弟选大学,弟弟直呼牛X
2021/06/11 Python
Django Paginator分页器的使用示例
2021/06/23 Python