这是一篇原创翻译文章。[url=http://www.aaronpeters.nl/blog/iframe-loading-techniques-performance?utm_source=feedburner&utm_medium=feed&utm_campaign=Feed:+aaronpeters+(Aaron+Peters)]原文地址[/url]。
我们会经常使用iframes来加载第三方的内容、广告或者插件。使用iframe是因为他可以和主页面并行加载,不会阻塞主页面。当然使用iframe也是有利有弊的:Steve Souders在他的blog里面有阐述:[url=http://www.stevesouders.com/blog/2009/06/03/using-iframes-sparingly/]Using Iframes Sparingly[/url]:
[list]
[*]iframe会阻塞主页面的onload事件
[/*][*]主页面和iframe共享同一个连接池 [/*][/list]
阻塞主页面的onload是这两个问题中最影响性能的方面。一般都是想让onload时间越早触发越好,一方面是用户体验过更重要的是google给网站的加载速度的打分:用户可以用IE和FF中Google工具栏来计时。
[b]那么为了提高页面性能,怎样才能不阻塞主页面的onload事件的来加载iframe呢?[/b]
这篇讲了四种加载iframe的方法:普通iframe,onload之后加载iframe,setTimeout() iframe和异步加载iframe。每种方法的加载结果我都用IE8的时间线来展示。我建议多注意下动态异步加载这个方法,因为这是性能表现最佳的。另外,还有一种友好iframe(friendly iframe)技术。他可能算不上是iframe加载的技术,但是必须使用iframe,他是无阻塞加载的。
[b]普通方法加载iframe
[/b]这是一种人尽皆知的普通加载方法,它没有浏览器的兼容性问题。
<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会阻塞主页面的加载。
[img]http://files.jb51.net/upload/201107/20110719002509161.png[/img]
我的建议:注意onload阻塞。如果iframe的内容只需要很短的时间来加载和执行,那么也不是个大问题,而且使用这种方法还有个好处是可以和主页面并行加载。但是如果加载这个iframe需要很长时间,用户体验就很差了。你得自己测试一下然后在http://www.webpagetest.org/也做些测试,根据onload的时间看看是否需要其他加载方法。
在onload之后加载iframe
如果你想在iframe中加载一些内容,但是这些内容对于页面来说不是那么的重要。或者这些内容不需要马上展现给用户的,需要点击触发之类的。那么可以考虑在主页面载入之后加载iframe。
[url=http://www.iab.net/media/file/rich_media_ajax_best_practices.pdf]Ad Ops Council在推荐过这个方法[/url],AOL也是用这种方法。想看看源码:[url=http://www.artzstudio.com/files/fif-demo/]这里有一个[/url]。一家瑞典的出版社Aftonbladet对于这种加载有很不错的结论:在他们的主页上,加载时间减少30%,用户每周增加7%,新闻部分的点击量增加35%。我建议可以看看他们的资料:[url=http://www.slideshare.net/jarlund/hign-performance-web-sites-with-ads-dont-let-third-parties-make-you-slow]High Performance Web Sites, With Ads: Don't let third parties make you slow[/url]
我没有创建相关的测试页,所以也没有第一首的资料。从我调研的结果来说:
如果你只想在你的网页上调用一个确定的src地址的iframe的话这个方法不是很有用。
如果你想在网页上展示多个广告,比较灵活的方法的是:加载一个广告,然后更新iframe加载另一个主页面的DOMContentLoaded时间不会被阻塞,页面渲染也不会被阻塞,当然,主页面的onload事件还是会被阻塞。
[b]转载请注明:[/b]
作者:[url=http://cnblogs.com/beiyuu][b]BeiYuu[/b][/url]