添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
相关文章推荐
细心的毛巾  ·  html转pdf ...·  1 年前    · 
威武的单杠  ·  pip/python: normal ...·  1 年前    · 

关于 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 FirefoxChrome 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);
 
 所有浏览器
URLabout:blank

这 里将空 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 OperaIE 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 iframeonload方法分析小结判断iframe是否加载完成的完美方法IE 支持 iframeonload 事件,不过是隐形的,需要通过 attachEvent 来注册。第二种方法比第一种方法更完美(采用readystatechange判断),因为 readystatechange 事件相对于 load 事件有一些潜在的问题。这里感觉说的并不是完全准确,开始给我造成了很大的困扰。... 1、问题,低级第一个按钮后,立刻点击第二个下载按钮,第二个按钮出现,两次下载,同时发生页面跳转。 2、问题原因:window.location.href会发生连接覆盖问题。 3,解决方案:使用frame作伪链接跳转,利用不同frame之间互不影响的特性。 4,具体代码操作以及解答: //获得id为downLoadListFrame的framevar divFrame = wind... setTimeout(function setIframeSrc(){ document.getElementById('HtmlEditor').src = "/webmail/resources... 创建iframe对象,添加load事件, 再将iframe添加到body中。Chrome/Opera中会造成load事件的handler执行两次。 <!DOCTYPE HTML> <html> <head> <meta charset="utf-8"> <title>iframeonload在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、iframeiframe 就是一个标签 dom 元素,可以 iframe src不设置为about:blank,内存不会释放掉,还必须用 iframe.document.write(''); 这样才能将内容清空 但是这样处理之后任然会有500-1000K左右的内存残留,这就是ie6的iframe bug, 动态创建的iframe总会耗费掉一些内存。 function clearIframe(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