浅谈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下IE与FF兼容函数收集
Sep 17 Javascript
jQuery 技巧大全(新手入门篇)
May 12 Javascript
jquery实现的一个文章自定义分段显示功能
May 23 Javascript
基于socket.io和node.js搭建即时通信系统
Jul 30 Javascript
jquery实现表单验证并阻止非法提交
Jul 09 Javascript
jQuery实现输入框下拉列表树插件特效代码分享
Aug 27 Javascript
浅谈JavaScript变量的自动转换和语句
Jun 12 Javascript
BootStrap table表格插件自适应固定表头(超好用)
Aug 24 Javascript
jQuery实现获取元素索引值index的方法
Sep 18 Javascript
javascript基础练习之翻转字符串与回文
Feb 20 Javascript
初探js和简单隐藏效果的实例
Nov 23 Javascript
javaScript实现游戏倒计时功能
Nov 17 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
php上传apk后自动提取apk包信息的使用(示例下载)
2013/04/26 PHP
php 深入理解strtotime函数的使用详解
2013/05/23 PHP
jQuery+PHP实现的掷色子抽奖游戏实例
2015/01/04 PHP
PHP+Mysql+jQuery文件下载次数统计实例讲解
2015/10/10 PHP
Yii2.0预定义的别名功能小结
2016/07/04 PHP
PHP数组实际占用内存大小原理解析
2020/12/11 PHP
用js实现小球的自由移动代码
2013/04/22 Javascript
jQuery自定义事件的简单实现代码
2014/01/27 Javascript
JavaScript定时显示广告代码分享
2015/03/02 Javascript
JavaScript中setMonth()方法的使用详解
2015/06/11 Javascript
JQuery实现级联下拉框效果实例讲解
2015/09/17 Javascript
js+canvas实现动态吃豆人效果
2017/03/22 Javascript
angular directive的简单使用总结
2017/05/24 Javascript
js事件委托和事件代理案例分享
2017/07/25 Javascript
使用D3.js制作图表详解
2017/08/13 Javascript
JQueryDOM之样式操作
2019/03/27 jQuery
浅谈一种让小程序支持JSX语法的新思路
2019/06/16 Javascript
微信小程序间使用navigator跳转传值问题实例分析
2020/03/27 Javascript
php使用递归与迭代实现快速排序示例
2014/01/23 Python
Python获取DLL和EXE文件版本号的方法
2015/03/10 Python
在Linux中通过Python脚本访问mdb数据库的方法
2015/05/06 Python
如何使用VSCode愉快的写Python于调试配置步骤
2018/04/06 Python
Python tensorflow实现mnist手写数字识别示例【非卷积与卷积实现】
2019/12/19 Python
Pycharm中Python环境配置常见问题解析
2020/01/16 Python
使用python的turtle函数绘制一个滑稽表情
2020/02/28 Python
Python matplotlib修改默认字体的操作
2020/03/05 Python
Python-jenkins模块获取jobs的执行状态操作
2020/05/12 Python
python批量处理多DNS多域名的nslookup解析实现
2020/06/28 Python
浅析python实现动态规划背包问题
2020/12/31 Python
新加坡航空官方网站:Singapore Airlines
2016/10/13 全球购物
如何将无状态会话Bean发布为WEB服务,只有无状态会话Bean可以发布为WEB服务?
2015/12/03 面试题
道德模范先进事迹
2014/02/14 职场文书
爱心募捐感谢信
2015/01/22 职场文书
企业安全生产检查制度
2015/08/06 职场文书
Django项目如何获得SSL证书与配置HTTPS
2021/04/30 Python
一次项目中Thinkphp绕过禁用函数的实战记录
2021/11/17 PHP