+ -
当前位置:首页 → 问答吧 → iframe的兼容性问题研究

iframe的兼容性问题研究

时间:2010-08-28

来源:互联网

创建iframe

由于ie中iframe的name不能修改的问题,要这样创建iframe:  
var iframe = document.createElement( isie ? "<iframe name=\"" + iframename + "\">" : "iframe");
iframe.name = iframename;
ps:关于iframe的name的问题参考这里的iframe部分
ie8已经可以修改name了,但在非标准(怪辟)模式下还是不能修改。

iframe加载判断

在iframe的onload中执行_finish函数:
Assembly code
if ( isie ) {
    iframe.attachEvent( "onload", finish );
} else {
    iframe.onload = finish;
}

在ie需要用attachEvent来绑定onload,因为在ie中直接设置onload是无效的。
除了用attachEvent还可以用onreadystatechange代替。
至于原因我也不清楚,详细参考“判断 iframe 是否加载完成的完美方法”。

iframe加载

iframe的加载还有一个问题,测试以下代码:
Assembly code
<body><div id="msg">状态:</div></body>
<script>
var msg = document.getElementById("msg");
var iframe = document.createElement("iframe");
iframe.onload = function(){ msg.innerHTML += "onload,"; }
document.body.appendChild(iframe);
iframe.src = "http://cloudgamer.cnblogs.com/"
</script>

结果safari, chrome都会触发onload两次,而opera, ff和ie(请自行兼容)都是1次。

估计safari和chrome在appendChild之后就进行第一次加载,并且在设置src之前加载完毕,所以触发了两次。
如果在插入body之前给iframe随便设置一个src(除了空值),间接加长第一次加载,那么也只触发一次了。
ps:不设置或空值的src相当于链接到“about:blank”(空白页)。

那么opera, ff和ie可能是第一次加载太慢,第二次覆盖了第一次的,所以只触发了一次onload。
也可能是其他原因,例如浏览器优化之类的,我也不确定。

ff的问题

ff的onload还有一个问题,在出现ERROR_INTERNET_CONNECTION_RESET(文件大小超过服务器限制)之类的服务器错误时,即使加载完成也不会触发onload,暂时找不到解决办法。


iframe有一个缺陷是只能用onload判断加载完成,但没有办法判断是否加载成功。
没有类似XMLHTTP的status的东西,遇上404之类的错误也没办法判别出来。

作者: cloudgamer   发布时间: 2010-08-28

打开好半天,才能回复.真耽误事.

作者: theforever   发布时间: 2010-08-28

居然还能抢到沙发,真是出乎意料,话说虽是周末,却也不该这么冷清啊.脑海里一阵凉风吹过,真是应了时节"天凉好个秋啊".

作者: theforever   发布时间: 2010-08-28