英文原文:Iframe loading techniques and performance
我们会经常使用iframes来加载第三方的内容、广告或者插件。使用iframe是因为它可以和主页面并行加载,不会阻塞主页面。当然使用
iframe也是有利有弊的:Steve Souders在他的blog里面有阐述:Using Iframes Sparingly:
1. iframe会阻塞主页面的onload事件
2. 主页面和iframe共享同一个连接池
阻塞主页面的onload是这两个问题中最影响性能的方面。一般都是想让onload时间越早触发越好,一方面是用户体验过更重要的是
google给网站的加载速度的打分:用户可以用IE和FF中Google工具栏来计时。
那么为了提高页面性能,怎样才能不阻塞主页面的onload事件的来加载iframe呢?
这篇讲了四种加载iframe的方法:普通iframe,onload之后加载iframe,setTimeout() iframe和异步加载iframe。每种方法的加载结果我都
用IE8的时间线来展示。我建议多注意下动态异步加载这个方法,因为这是性能表现最佳的。另外,还有一种友好iframe(friendly iframe)技
术。它可能算不上是iframe加载的技术,但是必须使用iframe,它是无阻塞加载的。
普通方法加载iframe
这是一种人尽皆知的普通加载方法,它没有浏览器的兼容性问题。
<iframe src="/path/to/file" frameborder="0" width="728" height="90" scrolling="auto"></iframe>
使用这种加载方法会在各浏览器中有如下表现:
**iframe会在主页面的onload之前加载
**iframe会在所有iframe的内容都加载完毕之后触发iframe的onload
**主页面的onload会在iframes的onload触发之后触发,所以iframe会阻塞主页面的加载。
**当iframe在加载的过程中,浏览器会标识正在加载东西,处于忙碌状态。
这里是一个演示页面,时间线图显示出iframe会阻塞主页面的加载:
我的建议:注意onload阻塞。如果iframe的内容只需要很短的时间来加载和执行,那么也不是个大问题,而且使用这种方法还有个好处
是可以和主页面并行加载。但是如果加载这个iframe需要很长时间,用户体验就很差了。你得自己测试一下,然后在
http://www.webpagetest.org/ 也做些测试,根据onload的时间看看是否需要其他加载方法。
在onload之后加载iframe
如果你想在iframe中加载一些内容,但是这些内容对于页面来说不是那么的重要。或者这些内容不需要马上展现给用户的,需要点击触
发之类的。那么可以考虑在主页面载入之后加载iframe。
<script>
//doesn't block the load event
function createIframe() {
var i = document.createElement("iframe");
i.src ="path/to/file";
i.scrolling ="auto";
i.frameborder ="0";
i.width ="200px";
i.height ="100px";
document.getElementById("div-that-holds-the-iframe").appendChild(i);
};
// Check for browser support of event handling capability
if (window.addEventListener) window.addEventListener("load", createIframe, false);
else if (window.attachEvent) window.attachEvent("onload", createIframe);
else window.onload = createIframe;
</script>
这种加载方法也是没有浏览器的兼容性问题的:
**iframe会在主页面onload之后开始加载
**主页面的onload事件触发与iframe无关,所以iframe不会阻塞加载。
**当iframe加载的时候,浏览器会标识正在加载。
这是是一个测试页面,时间线图如下:
这种方法比普通方法有什么好处呢?load事件会马上触发,有两个好处:
**其他等待主页面onload事件的代码可以尽早执行
**Google Toolbar计算你页面加载的时间会大大减少
但是,当iframe加载的时候,还是会看到浏览器的忙碌状态,相对于普通加载方法,用户看到忙碌状态的时间更长。还有就是用户还没
等到页面完全加载完的时候就已经离开了。有些情况下这是个问题,比如广告。
setTimeout()来加载iframe
这种方法的目的是不阻塞onload事件。
Steve Souders(又是他?)有一个这种方法的测试页面(http://stevesouders.com/efws/iframe-onload-nonblocking.php)。他写道:“src通
过setTimeout动态的设置,这种方法可以在所有的浏览器中避免阻塞”。
<iframe id="iframe1" src="" width="200" height="100" border="2">
</iframe>
<script>
function setIframeSrc() {
var s ="path/to/file";
var iframe1 = document.getElementById('iframe1');
if (-1 == navigator.userAgent.indexOf("MSIE")) {
iframe1.src = s;
} else {
iframe1.location = s;
}
}
setTimeout(setIframeSrc, 5);
</script>
在除了IE8以外的所有浏览器中会有如下表现:
**iframe会在主页面onload之前开始加载
**iframe的onload事件会在iframe的内容都加载完毕之后触发
**iframe不会阻塞主页面的onload事件(IE8除外)
**为什么不会阻塞主页面的onload呢(IE8除外)?因为setTimeout()
**当iframe加载的时候,浏览器会显示忙碌状态。
下面是时间线图:
因为IE8的问题,这种技术就不适合很多网站了。如果有超过10%的用户使用IE8, 十分之一的用户体验就会差。你会说那也只是比普通
加载差一点点,其实普通加载性能上也不差。onload事件对于10%的用户来说都更长。。。。额,你自己考虑吧。但是最好在看了下面这个
很赞的异步加载方法之后再决定吧。
我在参加Velocity 2010的时候,Meebo的两个工程师(@marcuswestin and Martin Hunt)做了一个关于他们的Meebo Bar的演讲。他们使用
iframe来加载一些插件,并且真正做到了无阻塞加载。对于有的开发者来说,他们的做法还比较新鲜。很赞,超级赞。但是一些原因导致这
种技术没有得到相应的关注,我希望这篇blog能把它发扬光大。
<script>
(function(d) {
var iframe = d.body.appendChild(d.createElement('iframe')),
doc = iframe.contentWindow.document;
// style the iframe with some CSS
iframe.style.cssText ="position:absolute;width:200px;height:100px;left:0px;";
doc.open().write('<body onload="'+
'var d = document;d.getElementsByTagName(\'head\')[0].'+
'appendChild(d.createElement(\'script\')).src'+'=\'\/path\/to\/file\'">');
doc.close(); //iframe onload event happens
})(document);
</script>
神奇的地方就在<body onload="">:这个iframe一开始没有内容,所以onload会立即触发。然后你创建一个script元素,用他来加载内
容、广告、插件什么的,然后再把这个script添加到HEAD中去,这样iframe内容的加载就不会阻塞主页面的onload!你应该看看他在个浏览器
中的表现:
**iframe会在主页面onload之前开始加载
**iframe的onload会立即触发,因为iframe的内容一开始为空。
**主页面的onload不会被阻塞
**为什么这个iframe不会阻塞主页面的onload?因为<body onload="">
**如果你不在iframe使用onload监听,那么iframe的加载就会阻塞主页面的onload。
**当iframe加载的时候,浏览器终于不显示忙碌状态了(非常好)
我的测试页给出下面的时间线:
转义字符让代码看着有些难受,这都不是问题。试试吧。
友好型iframe加载
这是用来加载广告的。虽然这不是一种iframe的加载技术,但是是用iframe来盛放广告的。他的亮点不在于iframe如何加载,而是主页
面、iframe、广告如何协同工作的。如下:
**先创建一个iframe,设置他的src为一个相同域名下的静态html文件。
**在这个iframe里面,设置js变量inDapIF=true来告诉广告它已经加载在这个iframe里面了。
**在这个iframe里面,创建一个script元素加上广告的url作为src,然后像普通广告代码一样加载。
**当广告加载完成,重置iframe大小来适应广告。
**这种方法也没有浏览器的兼容性问题。
Ad Ops Council推荐过这个方法,AOL也是用这种方法。想看看源码:这里有一个。一家瑞典的出版社Aftonbladet对于这种加载有很不
错的结论:在他们的主页上,加载时间减少30%,用户每周增加7%,新闻部分的点击量增加35%。我建议可以看看他们的资料:High
Performance Web Sites, With Ads: Don’t let third parties make you slow
我没有创建相关的测试页,所以也没有第一首的资料。从我调研的结果来说:
如果你只想在你的网页上调用一个确定的src地址的iframe的话这个方法不是很有用。
如果你想在网页上展示多个广告,比较灵活的方法的是:加载一个广告,然后更新iframe加载另一个主页面的DOMContentLoaded时间
不会被阻塞,页面渲染也不会被阻塞,当然,主页面的onload事件还是会被阻塞。
相关推荐
使用iframe是因为他可以和主页面并行加载,不会阻塞主页面。当然使用iframe也是有利有弊的:Steve Souders在他的blog里面有阐述:Using Iframes Sparingly: iframe会阻塞主页面的onload事件 主页面和iframe共享同一...
iframe实现异步无刷新提交,大家可以放心使用,完整的代码例子
iframe异步加载想必很多朋友对你都不会陌生,接下来将实现这样一个功能左边菜单不能刷新的情况下,异步加载右边的内容页面,感兴趣的你可以参考下本文或许对你有所帮助
asp.net 中使用iframe动态加载页面
php之表单文件iframe异步上传
iframe实现图片异步上传.dociframe实现图片异步上传.dociframe实现图片异步上传.dociframe实现图片异步上传.doc
问题已经解决了,和各位分享代码: [removed] = function() { frames[“BiframeName”].location.href = “B.htm”; } [Ctrl+A 全选 注:如需引入外部Js需刷新才能执行]
解决使用tab布局过程中页面多次加载的问题 如果在使用easyui过程中,你使用了easyui 的tab布局,在tab布局的内容上使用的不是content,而是iframe,那么你的页面有可能多次加载了,这篇文章帮你解决问题
网页往下拉,iframe进入浏览器可视范围内才加载iframe。提高页面加载速度。类似图片延时加载
在使用iframe时,iframe背景为白块,刷新时也会闪过白块。如果刷新时间长,就会一直出现白块,让人很烦恼,通过网上搜资料,测试很多依然没有效果,最终解决方法如下所示,注意主要针对IE浏览器测试。
js下判断 iframe 是否加载完成的完美方法.docx
更新日志2012-05-05: 修复了几个bug: 1,iframe在没有指定宽和高时默认全屏的bug 2,当iframe隐藏时的错误显示...1,不支持多个iframe同时异步加载, 2,不支持自定义加载效果图片 3,ajax不支持指定对象加载效果。
本文讲述了JS同步、异步、延迟加载的方法。分享给大家供大家参考,具体如下: 一:同步加载 我们平时使用的最多的一种方式。 [removed][removed] 同步模式,又称阻塞模式,会阻止浏览器的后续处理,停止后续的解析...
通过iframe 异步加载script 通过异步请求另一页面的script 是不执行的,只返回html 原文件,因为返回的文本没有经过浏览器的解析执行。 看代码 a1.html 代码如下: <html xmlns=”http://www.w3.org/1999/xhtml”...
ajax XML iframe 无刷新异步读取 学习源代码
运用Iframe和script可以实现简单的异步加载,没有使用XMLHttpRequest,需要的朋友可以参考下
C#判断webbrowser页面最终加载完成
主要介绍了基于JS判断iframe是否加载成功的方法【多种浏览器】的相关资料,需要的朋友可以参考下