关于 HTML 4.01 规范中 onload 内在事件说明:
http://www.w3.org/TR/html401/interact/scripts.html#adef-onload
关于 DOM Level2 Events 规范中 load 事件说明:
http://www.w3.org/TR/DOM-Level-2-Events/events.html#Events-eventgroupings-htmlevents
插入空白页面 IFRAME 元素时 Chrome Safari Opera 浏览器中会触发 load 事件。
造成的影响
Chrome Safari Opera 浏览器中,在插入 "src" 属性未设置或设置为空字符串的 IFRAME 元素后立即修改其 "src" 属性值,会导致 IFRAME 标记绑定的 load 事件再被触发。
触发 IE 和 Firefox 浏览器中 IFRAME 标记 "src" 属性值的历史记录问题。
受影响的浏览器
根据规范说明,load 事件可以作用于 FRAMESET 标记中,因此同样也可以作用于 IFRAME 标记上。它表示着 IFRAME 内页面已经完全加载完毕 IFRAME 标记处于可用状态。
如果创建的 IFRAME 标记没有设定 "src" 属性和值,那么他的 load 事件是否会被触发呢?
分析以下代码:
function iframeLoad(){
alert("IFRAME 标记的 onload 事件触发");
function addEvent(eventName,element,fn){
if (element.attachEvent) element.attachEvent("on"+eventName,fn);
else element.addEventListener(eventName,fn,false);
window.onload = function (){
var iframe = document.createElement('iframe');
addEvent("load",iframe,iframeLoad);
document.body.appendChild(iframe);
iframe.src="iframe.html";
代码中动态创建了 IFRAME 标记,为其监听 load 事件,此时还没有显示性的设定他的 "src" 值就将他加入文档树中。此后立即为 IFRAME 设置 "src" 属性,指向具体的 URL 。
观察各浏览器中运行效果:
| IE Firefox | Chrome Safari Opera |
---|
IFRAME onload 事件触发次数 | 1次 | 2次 |
---|
看到 Chrome Safari Opera 中 onload 事件被触发两次。
为了搞清这个问题,我们需要知道没有设置 src 属性的 IFRAME 被添加到 DOM 树中后,其默认的 "src" 值是什么。继续分析以下代码:
function iframeLoad(iframe){
document.body.appendChild(document.createTextNode("IFRAME URL : "+iframe.location.href));
function addEvent(eventName,element,fn){
if (element.attachEvent) element.attachEvent("on"+eventName,fn);
else element.addEventListener(eventName,fn,false);
window.onload = function (){
var iframe = document.createElement('iframe');
addEvent("load",iframe,function (){iframeLoad(iframe.contentWindow)});
document.body.appendChild(iframe);
这 里将空 src 值 IFRAME 标记内调用页面的 URL 打印出来,可以发现所有浏览器中处理一致,均为 "about:blank" 。这个页面是个空 HTML 文档页,所有浏览器均内置提供。这个空页面被加载完成后同样会触发 IFRAME 标记的 onload 事件。
由 此可以推测,是否由于 Chrome Safari Opera 浏览器中当 IFRAME 标记被插入文档树后,载入"about:blank" 页面速度非常快立即就触发了 load 事件,以至于还没来得及执行为他指定新 URL 的语句;当新 URL 指定后,当前页面加载完成时又触发了一次 IFRAME 标记的 load 事件,这样总共就触发了两次。
而其他浏览器则是载入 "about:blank" 页花费时间加多,页面并未完全加载时其 URL 已经被改变,因此相对 Chrome Safari Opera 浏览器第一次 load 事件并没有触发,只有等新 URL 中的页面加载完毕后 load 事件才被触发,这样总共只触发了一次。
为了证明以上猜测,将一段延时执行的代码加入其中:
function iframeLoad(iframe){
var src = (iframe.src)?iframe.src:iframe.contentWindow.location.href;
document.body.appendChild(document.createElement("br"));
document.body.appendChild(document.createTextNode("IFAME 标记 src 值为 "+ src + " 的 onload 事件触发"));
function addEvent(eventName,element,fn){
if (element.attachEvent) element.attachEvent("on"+eventName,fn);
else element.addEventListener(eventName,fn,false);
window.onload = function (){
var iframe = document.createElement('iframe');
addEvent("load",iframe,function (){iframeLoad(iframe)});
iframe.src= "about:blank";
document.body.appendChild(iframe);
setTimeout(function (){iframe.src="iframe.html";},300)
代码中,在 IFRAME 节点被添加到文档树树后,延时 300 毫秒再改变它的 src 属性,以便给其他浏览器充足的事件将 "about:blank" 页面加载完成。
此时各浏览器执行结果一致:
| 所有浏览器 |
---|
IFRAME onload 事件触发次数 | 'about:blank' 页面1次 'iframe.html' 页面1次 共2次 |
---|
这 个结果证明了之前的猜想:Chrome Safari Opera 浏览器执行速度比想象中的要快的多,导致好像“多”触发了一次 load 事件,实际上所有浏览器均会为 IFRAME 标记内每个页面触发他的 load 事件,前提是让这些页面有足够的事件加载完成。
【注】:使用appendChild 方法将没有设置 src 属性的 IFRAME 插入文档树和使用 innnerHTML 方式将没有写 src 属性的 IFRAME 标记字符串插入文档树时,均会存在以上分析的问题。
最后来看,上面的代码中在插入节点之前为 IFRAME 标记显式性的设置了 src 属性值为 "about:blank" 的页面,这是为了避免 Firefox 中 URL 缓存的 Bug。
在 IE 和 Firefox 中,如果 IFRAME 没有显示性的设置 "src" ,如果该页面第一次被打开,则实际页面的 src 值为 "about:blank";否则将为 IFRME 标记中最后一个被设定的 "src" 值。
分析以下代码(没有明确定义 src 属性值):
window.onload = function (){
var iframe = document.createElement('iframe');
addEvent("load",iframe,function (){iframeLoad(iframe)});
document.body.appendChild(iframe);
setTimeout(function (){iframe.src="iframe.html";},300)
注意代码 "src" 值最初未定义,最终被修改为 "ifarme.html",观察在各浏览器中运行结果:
| Chrome Safari Opera | IE Firefox |
---|
首次显示 | 'about:blank' 页 onload 事件触发 'iframe.html' 页 onload 事件触发 |
---|
F5 普通刷新 | 'about:blank' 页 onload 事件触发 'iframe.html' 页 onload 事件触发 | 'iframe.html' 页 onload 事件触发 'iframe.html' 页 onload 事件触发 |
---|
Ctrl + F5 强制刷新 | 'about:blank' 页 onload 事件触发 'iframe.html' 页 onload 事件触发 |
---|
可见,IE 和 Firefox 浏览器中出现了 IFRAME 元素的 "src" 属性最后指向的记忆问题,普通刷新页面后,没有明确设置 "src" 属性的 IFRAME 标记将默认使用上一条历史记录中的 "src" 值。
为 IFRAME 标签的 src 属性指定具体 URL 后再将节点插入 DOM 树中 。
本文转自:http://www.w3help.org/zh-cn/causes/SD9019
转载于:https://www.cnblogs.com/gs456/p/11269362.html
原文链接:
http://www.cnblogs.com/gs456/p/11269362.html
IE
iframe的
onload方法分析小结判断
iframe是否加载完成的完美方法IE 支持
iframe 的
onload 事件,不过是隐形的,需要通过 attachEvent 来注册。第二种方法比第一种方法更完美(采用readystatechange判断),因为 readystatechange
事件相对于 load
事件有一些潜在的问题。这里感觉说的并不是完全准确,开始给我造成了很大的困扰。...
1、问题,低级第一个按钮后,立刻点击第二个下载按钮,第二个按钮出现,
两次下载,同时发生页面跳转。
2、问题原因:window.location.href会发生连接覆盖问题。
3,解决方案:使用frame作伪链接跳转,利用不同frame之间互不影响的特性。
4,具体代码操作以及解答:
//获得id为downLoadListFrame的framevar divFrame = wind...
setTimeout(function set
IframeSrc(){
document.getElementById('HtmlEditor').src = "/webmail/resources...
创建
iframe对象,添加load
事件, 再将
iframe添加到body中。Chrome/Opera中会造成load
事件的handler执行
两次。
<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<title>
iframe的
onload在Chrome/Ope...
文章目录1、
iframe2、
iframe 利弊3、如何获取
iframe 内的 window4、父子页面窗口的关系5、父子窗口通信6、
iframe受跨域限制如何解决父页面传给子页面值通过hash值来传子传给父 值存在window.name里,通过替换为同源文件实现访问值7、判断
iframe加载完成8、
iframe受跨域限制如何解决9、document.domain10、window.location.hash11、window.name
1、
iframe
iframe 就是一个标签 dom 元素,可以
iframe src不设置为about:blank,内存不会释放掉,还必须用
iframe.document.write(''); 这样才能将内容清空
但是这样处理之后任然会有500-1000K左右的内存残留,这就是ie6的
iframe bug,
动态创建的
iframe总会耗费掉一些内存。
function clear
Iframe(id){
var el = document.getElementById(id),
iframe = el.contentWind
需求:需要在
iframe中嵌入第三方url,该url需要访问视频和音频
以为只需要 <
iframe src="url" style="width:100%; height:99%" frameborder="0"></
iframe>,然后使用http://lan-ip:port就万事大吉了,没想到出现了如下两个问题:
问题1:F12查看错误提示:Only secure ...
该问题的出现通常是
iframe中的src属性缺失引起的,解决方法如下:1.创建一个只含有的空白htm页面,把
iframe的src属性赋值为该空白页面。elmIfr = document.createElement("
IFRAME"); elmIfr.scr="blank.html";document.body.appendChild(elmIfr); 2.src = "
javascript