onunload、onbeforeunload事件详解

前端开发 50298 Views 10 Comments

最近项目中做到一个功能:在上传页面用户开始上传文件之后用户点击任意跳转都需要弹出提示层进行二次确定才允许他进行跳转,这样做的目的是为了防止用户的错误操作导致这珍贵的UGC 流失(通常用户在一次上传不成功之后,很容易就会打消了上传的念头的了,或去到其他平台进行上传)。

在这里用到的是 onbeforeunload 事件。下面就梳理下 onunload、onbeforeunload 这两个事件,也顺带说说我遇到的问题与解决方案。

onunload,onbeforeunload都是在刷新或关闭时调用,可以在<script>脚本中通过 window.onunload来调用。区别在于onbeforeunload在onunload之前执行,它还可 以阻止onunload的执行。

onbeforeunload 是正要去服务器读 取新的页面时调用,此时还没开始读取;而onunload则已经从服务器上读到了需要加载的新的页面,在即将替换掉当前页面时调用。

onunload事件

浏览器卸载页面后执行的事件, 虽然网上的资料没说什么兼容性的问题,但是实践发现兼容性并不理想。

使用方法

//JS document
window.onunload = function(){
alert("unload is work");
}

浏览器兼容情况

IE6,IE7,IE8 中 刷新页面、关闭浏览器之后、页面跳转之后都会执行;

IE9 刷新页面 会执行,页面跳转、关闭浏览器不能执行;

firefox(包括firefox3.6) 关闭标签之后、页面跳转之后、刷新页面之后能执行,但关闭浏览器不能执行;

Safari 刷新页面、页面跳转之后会执行,但关闭浏览器不能执行;

Opera、Chrome 任何情况都不执行。

onbeforeunload事件

页面跳转时触发的事件。

使用方法

//JS document
window.onbeforeunload = function(){
return "onbeforeunload is work";
}

return 的值 为你需要告诉用户的提示信息如上面demo的话浏览器的提示是这样(firefox 并不支持文字提醒):

值得注意的是,网上流传说 可以通过检查 e.clientX e.clientY 判断 用户是否点击 右上角关闭浏览器的,但是实践发现 只有 IE6,IE7,IE8 能获取得到具体数值,其他浏览器均为 undefined。

浏览器兼容情况

IE、Chrome、Safari 完美支持

Firefox 不支持文字提醒信息

Opera 不支持

IE6,IE7 使用 onbeforeunload 遇到的bug

凡是 <a> 标签 都会触发 onbeforeunload事件 包括 href=”javascript:void(0)” 这种。

在IE6,IE7 下面 点击 里面的 a 标签,蛋疼的事情就发生了。

解决方法:给这 a标签的 父级 添加 onclick=function(){return false} 即可,不过添加了这个之后 要确保 父级里面没有 input type=”checkbox” 的标签,否则会导致其无效不可点击。

转载请注明:一只羊博客 » onunload、onbeforeunload事件详解

分享到:
(79)

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

网友最新评论 (10)

  1. 请问移动端浏览器,这两个方法都不触发,有替代的吗

    chc2016-11-14 14:40 回复
  2. onbeforeunload方法中的提示信息,在IE 11中完美兼容,无论是return 语句,还是直接alert方法。但在Chrome 53.0.2785.116 (64-bit) 还是有些问题,比如无法正常显示return 语句的自定义内容,对于alert方法也不支持。
    还是学习到了,谢谢大神!

    Jener2016-10-20 15:37 回复
  3. 用jQuery对Windows 绑定unload事件,执行写入一个Cookie,你就会发现,所有浏览器都支持。
    你文中所说的不支持,仅是不支持这种弹窗事件,并不是不支持其他。

    宋希凯2015-05-07 11:50 回复
    • 帅哥,有具体的代码能发我邮箱吗?邮箱是:292688033@qq.com,太感谢了!

      天空2017-03-01 17:36 回复
    • 经测试果然可以。

      张东东2017-07-21 10:05 回复
  4. a标签 都会触发 onbeforeunload事件 包括 href=”javascript:void(0)” 这种。
    //===================
    若href=”##” 不会触发onbeforeunload,但部分浏览器会当成置顶处理,而Chrome下效果相当于javascript:void(0)

    王尼玛2015-01-06 09:48 回复
  5. 谢谢了, 书上面写的, 没效果, 看到了你的博文. 再次谢谢.

    指尖上的艺术2014-06-24 01:25 回复
    • 客气,互相学习!

      一只羊2014-06-24 09:48 回复
  6. nice

    温昌睡不够2013-09-25 22:08 回复
  7. nice

    温昌睡不够2013-09-25 22:08 回复