10、网页制作Dreamweaver(扩展:各浏览器对 onunload 事件的支持与触发条件实现有差异)
标准参考
在 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 事件的支持与触发条件实现有差异)的更多相关文章
- 各浏览器对 onbeforeunload 事件的支持与触发条件实现有差异
转载:http://www.w3help.org/zh-cn/causes/BX2047 标准参考 无. 问题描述 一般情况下,onbeforeunload 事件处理函数内会写入一些提示性语句,当用户 ...
- 8、网页制作Dreamweaver(jQuery基础:安装、语法)
在<网页制作Dreamweaver(悬浮动态分层导航)>中,运用到了jQuery的技术,轻松实现了菜单的下拉.显示.隐藏的效果,不必再用样式表一点点地修改,省去了很多麻烦,那么jQuery ...
- 7、网页制作Dreamweaver(悬浮动态分层导航)
悬浮动态分层导航的制作: 1.首先在<head>里面引用一个JQUERY的文件以用来制作鼠标点击动画效果(从网站上下载即可) <script language="javas ...
- JS事件 卸载事件 当用户退出页面时(页面关闭、页面刷新等),触发onUnload事件,同时执行被调用的程序。注意:不同浏览器对onunload事件支持不同。
卸载事件(onunload) 当用户退出页面时(页面关闭.页面刷新等),触发onUnload事件,同时执行被调用的程序. 注意:不同浏览器对onunload事件支持不同. 如下代码,当退出页面时,弹出 ...
- 11、网页制作Dreamweaver(补充:JS零碎知识点&&正则表达式)
JS知识点 回车符/r和换行符/n的区别:/r 相当于enter,是段落与段落之间的区别, /n 相当于shift+enter,是行与行之间距离,比较小 几种window操作方法: 1.获取当前窗口大 ...
- 4、网页制作Dreamweaver(样式表CSS)
样式表style 制作一个风格统一的网页,需要样式表对颜色.字体等属性的规范,同时也省去在body中多次定义的麻烦,所以一个样式表是必不可少的. 样式表有两种引用的方法:一种是直接写在html的< ...
- 3、网页制作Dreamweaver(表单form)
表单form (虚线不显示) 1.写法: <form id="form1" name="form1" method="post" ac ...
- 1、网页制作Dreamweaver(界面、基本操作、锚点、表格)
界面 网页的界面html由两部分组成:<head>和<body>,<title>放在<head>中 1.以下是<head>部分的解释: &l ...
- 6、网页制作Dreamweaver(HTML结构--dom操作)
一.基本语法:数据类型(字符串,小数,整数,布尔,时间) var, var s = "3.14"; var n = parseFloat(s); ; s += 5; var d = ...
随机推荐
- DataProcessing
clear load X4058 [m,n]=size(X528); Mean=zeros(1,n); Dev=zeros(1,n); for i=1:n Xi=X528(1:end-1,i); Xi ...
- linux 一些命令
1.查看cpu个数 cat /proc/cpuinfo |grep "physical id" |sort | uniq |wc -l 2 2.查看cpu逻辑个数 cat /pro ...
- POJ 3687 逆序拓扑
额.题目大意:有N个球.编号和重量都是唯一不重复的.然后.给你m个pair a和b,表示编号为a的点一定比编号为b的点轻.然后捏.输出每个点对应的重量.关键是要求.如果有多种可能性的话,输出让序号小的 ...
- 使用BroadcastReceiver实现系统对手机电量进行提示
import android.content.BroadcastReceiver;import android.content.Context;import android.content.Inten ...
- 转: Div与table的区别
1:速度和加载方式方面的区别 div 和 table 的差异不是速度,而是加载方式,速度只能是指网络速度,如果速度足够快,是没有差异的: div 的加载方式是即读即加载,遇到 <div> ...
- libpcap文件格式分析
第一部分:PCAP包文件格式 一 基本格式: 文件头 数据包头数据报数据包头数据报...... 二.文件头: 文件头结构体 sturct pcap_file_header { DWOR ...
- ubuntu连接Android调试
从这周开始尝试Android开发,记下点滴. 安装JDK.下载ADT不说,连接手机调试的时候出错,一堆问号??????????.网上一查,属于典型错误.试下来,有几步比较关键,容易忽视: 1.我机器上 ...
- TADOTable 用过滤事件 后 记录数据和 记录的内容
用 过滤事件,过滤后 ADOTbTrade.RecordCount 是总数, 但是,记录内容是 过滤后的 ADOTbTrade.First; while not ADOTbTrade.Eof do b ...
- sql 行专列 列转行 普通行列转换
转载:http://www.cnblogs.com/newwind521/archive/2010/11/25/1887203.html sql 行专列 列转行 普通行列转换 /* 标题:普通行列转换 ...
- sql左连接,右连接,内连接
1.sql查询时什么叫左连接和右连接 左连接和右连接都是外部连接,也就是区别于内部连接,它对不满足连接条件的行并不是象内部连接一样将数据完全过滤掉,而是保留一部分数据,行数不会减少. 左或 ...
