标准参考

在 HTML 4.01 规范中关于 onunload 事件的描述是:当 document 从 window 中移除时,触发 onunload 事件。

关于 HTML 4.01 规范中 onunload 内在事件说明:http://www.w3.org/TR/html401/interact/scripts.html#adef-onunload 。

MSDN 中关于 onunload 事件的描述:http://msdn.microsoft.com/en-us/library/ms536973(VS.85).aspx

Mozilla developer center 中关于 onunload 事件的描述:https://developer.mozilla.org/en/DOM/window.onunload

问题描述

当 document 从 window 中移除,将触发 onunload 事件,各浏览器对 onunload 事件的支持与触发条件实现有差异。

造成的影响

各浏览器对 onunload 事件的支持与触发条件实现有差异,所以在 onunload 事件中书写的方法可能在一些浏览器中没有被执行。

受影响的浏览器

所有浏览器  

问题分析

根据 MSDN 中描述,IE 的 onunload 事件可由以下这些条件触发:

  • 关闭当前浏览器窗口。
  • 导航到另一个进入一个新的地址或选择一个喜欢的位置。
  • 单击后退,前进,刷新,或主页按钮。
  • 点击一个链接到新页面。
  • 调用 anchor.click方法。
  • 调用 document.write方法。
  • 调用 document.open方法。
  • 调用 document.close方法。
  • 调用 window.close方法。
  • 调用 window.open方法,窗口名称设置值为 _self。
  • 调用 window.navigate 或 NavigateAndFind方法。
  • 调用 location.replace 方法。
  • 调用 location.reload 方法。
  • 指定一个 location.href 属性的新值。
  • 使用 submit 按键提交表单,或调用 form.submit 方法。

在这些触发条件中绝大多数都始页面产生了跳转,但还缺少一些一种常见情况说明,即页面 URL 可能发生了变化但没有产生跳转。比如 "javascipt:" "mailto:" 等常见的浏览器内置伪协议,以及由第三方或用户自定义的为协议时,页面并不跳转,而是根据伪协议执行指定的行为。这个情况应加入到触发条件中。

根据以上所有这些触发条件,我们构建如下代码来检测各浏览器对 onunload 事件的支持程度与触发条件:

<!DOCTYPE html>
<html>
<head>
<meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
</head>
<body onunload="alert('执行 onunload');">
请手工关闭当前浏览器窗口。<br/>
请手工在地址栏输入其他页面地址或从收藏夹、历史记录中将页面导航其他站点。<br/>
请手工单击后退,前进,刷新,或主页按钮。<br/>
<a href="http://www.google.com" id="A">点击一个链接到新页面</a><br />
<button onclick="document.getElementById('A').click()">调用 anchor.click 方法</button><br />
<button onclick="document.write('A')">调用 document.write 方法</button><br />
<button onclick="document.open()">调用 document.open 方法</button><br />
<button onclick="document.close()">调用 document.close 方法</button><br />
<button onclick="window.open('http://www.google.com','_self')">调用 window.open方法,窗口名称设置值为 _self</button><br />
<button onclick="try{window.navigate('http://www.google.com')}catch(e){alert('不支持此方法')}">调用 window.navigate 方法</button><br />
<button onclick="try{window.external.NavigateAndFind('http://www.google.com','','')}catch(e){alert('不支持此方法')}">调用 NavigateAndFind 方法</button><br />
<button onclick="location.replace('http://www.google.com')">调用 location.replace 方法</button><br />
<button onclick="location.reload()">调用 location.reload 方法</button><br />
<button onclick="location.href='http://www.google.com'">指定一个 location.href 属性的新值</button><br />
<form action="http://www.google.com" id="B">
<input type="submit" value="提交具有 action 属性的一个表单">
</form>
<button onclick="document.getElementById('B').submit()">调用 form.submit 方法</button><br />
<a href="javascript:">调用 javascipt: 伪协议</a><br />
<a href="mailto:">调用 mailto: 伪协议</a><br />
<a href="custom:">调用自定义伪协议</a>
</body>
</html>

执行结果汇总入表:

  IE6 IE7 IE8 Firefox Chrome Safari Opera
关闭当前浏览器窗口 事件被触发 事件未触发 事件未触发 事件被触发 事件被触发 事件未触发 事件未触发
导航到另一个进入一个新的地址或选择一个喜欢的位置 事件被触发 事件被触发 事件被触发 事件被触发 事件被触发 事件被触发 事件未触发
单击后退,前进,刷新,或主页按钮 事件被触发 事件被触发 事件被触发 事件被触发 事件被触发 事件被触发 事件未触发
点击一个链接到新页面 事件被触发 事件被触发 事件被触发 事件被触发 事件被触发 事件被触发 事件被触发
调用 anchor.click方法 事件被触发 事件被触发 事件被触发 不支持此方法1 不支持此方法1 不支持此方法1 事件被触发
调用 document.write方法 事件被触发 事件被触发 事件被触发 事件未触发 事件未触发 事件未触发 事件未触发
调用 document.open方法 事件被触发 事件被触发 事件被触发 事件未触发 事件未触发 事件未触发 事件未触发
调用 document.close方法 事件未触发 事件未触发 事件未触发 事件未触发 事件未触发 事件未触发 事件未触发
调用 window.open方法,窗口名称设置值为 _self 事件被触发 事件被触发 事件被触发 事件被触发 事件被触发 事件被触发 事件被触发
调用 window.navigate 事件被触发 事件被触发 事件被触发 不支持此方法2 不支持此方法2 不支持此方法2 事件未触发
调用 NavigateAndFind方法 事件被触发 事件被触发 事件被触发 不支持此方法3 不支持此方法3 不支持此方法3 不支持此方法3
调用 location.replace 方法 事件被触发 事件被触发 事件被触发 事件被触发 事件被触发 事件被触发 事件未触发
调用 location.reload 方法 事件被触发 事件被触发 事件被触发 事件被触发 事件被触发 事件被触发 事件未触发
指定一个 location.href 属性的新值 事件被触发 事件被触发 事件被触发 事件被触发 事件被触发 事件被触发 事件被触发
使用 submit 按键提交表单 事件被触发 事件被触发 事件被触发 事件被触发 事件被触发 事件被触发 事件被触发
调用 form.submit 方法 事件被触发 事件被触发 事件被触发 事件被触发 事件被触发 事件被触发 事件被触发
调用 javascipt: 伪协议 事件未触发 事件未触发 事件未触发 事件未触发 事件未触发 事件未触发 事件未触发
调用 mailto: 伪协议 事件未触发 事件未触发 事件未触发 事件未触发 事件未触发 事件未触发 事件未触发
调用自定义伪协议 事件被触发 事件未触发 事件未触发 事件未触发 事件未触发 事件被触发 事件未触发

【注1】:直接调用链接元素的 click 方法模拟鼠标点击事件,只有 IE 和 Opera 支持。

【注2】:使用 window.navigate 方法导航网页仅被 IE Opera 支持,可参考 MSDN 原文:navigate Method

【注3】: NavigateAndFind 方法处于 window.external 对象中,external 对象也仅 IE 支持,可参考 MSDN 原文:NavigateAndFind Method 和本站文章 BT9012: IE 的 external 对象提供的方法是 IE 特有的 。

结合汇总表可以看出:

  • 点击一个链接到新页面、调用 window.open方法窗口名称设置值为 _self、指定一个 location.href 属性的新值、使用 submit 按键提交表单、调用 form.submit 方法在各浏览器下 onunload 事件都会被触发。
  • 其他情况各个浏览器都有所不同。

解决方案

各浏览器的支持以及事件触发条件差异较多,需谨慎使用。

10、网页制作Dreamweaver(扩展:各浏览器对 onunload 事件的支持与触发条件实现有差异)的更多相关文章

  1. 各浏览器对 onbeforeunload 事件的支持与触发条件实现有差异

    转载:http://www.w3help.org/zh-cn/causes/BX2047 标准参考 无. 问题描述 一般情况下,onbeforeunload 事件处理函数内会写入一些提示性语句,当用户 ...

  2. 8、网页制作Dreamweaver(jQuery基础:安装、语法)

    在<网页制作Dreamweaver(悬浮动态分层导航)>中,运用到了jQuery的技术,轻松实现了菜单的下拉.显示.隐藏的效果,不必再用样式表一点点地修改,省去了很多麻烦,那么jQuery ...

  3. 7、网页制作Dreamweaver(悬浮动态分层导航)

    悬浮动态分层导航的制作: 1.首先在<head>里面引用一个JQUERY的文件以用来制作鼠标点击动画效果(从网站上下载即可) <script language="javas ...

  4. JS事件 卸载事件 当用户退出页面时(页面关闭、页面刷新等),触发onUnload事件,同时执行被调用的程序。注意:不同浏览器对onunload事件支持不同。

    卸载事件(onunload) 当用户退出页面时(页面关闭.页面刷新等),触发onUnload事件,同时执行被调用的程序. 注意:不同浏览器对onunload事件支持不同. 如下代码,当退出页面时,弹出 ...

  5. 11、网页制作Dreamweaver(补充:JS零碎知识点&&正则表达式)

    JS知识点 回车符/r和换行符/n的区别:/r 相当于enter,是段落与段落之间的区别, /n 相当于shift+enter,是行与行之间距离,比较小 几种window操作方法: 1.获取当前窗口大 ...

  6. 4、网页制作Dreamweaver(样式表CSS)

    样式表style 制作一个风格统一的网页,需要样式表对颜色.字体等属性的规范,同时也省去在body中多次定义的麻烦,所以一个样式表是必不可少的. 样式表有两种引用的方法:一种是直接写在html的< ...

  7. 3、网页制作Dreamweaver(表单form)

    表单form (虚线不显示) 1.写法: <form id="form1" name="form1" method="post" ac ...

  8. 1、网页制作Dreamweaver(界面、基本操作、锚点、表格)

    界面 网页的界面html由两部分组成:<head>和<body>,<title>放在<head>中 1.以下是<head>部分的解释: &l ...

  9. 6、网页制作Dreamweaver(HTML结构--dom操作)

    一.基本语法:数据类型(字符串,小数,整数,布尔,时间) var, var s = "3.14"; var n = parseFloat(s); ; s += 5; var d = ...

随机推荐

  1. 10大html5前端框架

    Bootstrap 首先说 Bootstrap,估计你也猜到会先说或者一定会有这个( 呵呵了 ),这是说明它的强大之处,拥有框架一壁江山的势气.自己刚入道的时候本着代码任何一个字母都得自己敲出来挡我者 ...

  2. 关于SQL语句优化的一个问题

    今天写了一个很简单的存储过程,结果一执行,40多秒,后来调整了一句话写法,瞬间出来,其实差别不大,如下: select item_no=vpc.ITEM_ID ,BL_QTY=sum(vpc.QTY_ ...

  3. Java集合——Set接口

    1.定义 set中不允许放入重复的元素(元素相同时只取一个),使用equals()方法进行比较.如果返回true,两个对象的HashCode值也应该相等 2.方法 add():添加元素 remove( ...

  4. [转]C#中的Monitor类

    object obj=new object(); Monitor在锁对象obj上会维持两个线程队列R和W以及一个引用T : (1) T是对当前获得了obj锁的线程的引用(设此线程为CurrThread ...

  5. 修改weblogic PermGen

    vim /weblogic/Oracle/Middleware/wlserver_10.3/common/bin/commEnv.sh 在第144行,增加环境变量:JAVA_VENDOR=Sun #根 ...

  6. web开发常用的js验证,利用正则表达式验证邮箱、手机、身份证等输入

    正则表达式验证 //邮箱 \-])+\.)+([a-zA-Z0-]{,})+$/; email = document.getElementById("email").value; ...

  7. 关于linux服务器的批量维护、批量升级、

    由于版权费用原因,众多中小服务器采用linux服务器进行功能处理.在进行批量升级.更新业务程序时.可以采用如下批量方案: 1.打包成rpm包,并配置yum源服务器,以支持个人的yum服务器进行处理.一 ...

  8. Nginx介绍

    原文:http://www.aosabook.org/en/nginx.html 作者: Andrew Alexeev nginx(发音"engine x")是俄罗斯软件工程师Ig ...

  9. excel的变量

    因需要定制游戏的公式,公式是以一个系数乘以等级,我想达到修改系数,每个等级对应的值就立即显示出来, 但把系数写在一个单元格,一拉,系数单元格也会跟着增长行数--不是我想要的: 但只要把系数单元格改成变 ...

  10. 走进AngularJs(七) 过滤器(filter) - 吕大豹

    时间 2013-12-15 16:22:00  博客园-原创精华区 原文  http://www.cnblogs.com/lvdabao/p/3475426.html 主题 AngularJS 过滤器 ...