我们会经常使用iframes来加载第三方的内容、广告或者插件。使用iframe是因为它可以和主页面并行加载,不会阻塞主页面。当然使用iframe也是有利有弊的:Steve Souders在他的blog里面有阐述:Using Iframes Sparingly:

  • iframe会阻塞主页面的onload事件
  • 主页面和iframe共享同一个连接池

  阻塞主页面的onload是这两个问题中最影响性能的方面。一般都是想让onload时间越早触发越好,一方面是用户体验过更重要的是google给网站的加载速度的打分:用户可以用IE和FF中Google工具栏来计时。

  那么为了提高页面性能,怎样才能不阻塞主页面的onload事件的来加载iframe呢?

  这篇讲了四种加载iframe的方法:普通iframe,onload之后加载iframe,setTimeout() iframe和异步加载iframe。每种方法的加载结果我都用IE8的时间线来展示。我建议多注意下动态异步加载这个方法,因为这是性能表现最佳的。另外,还有一种友好iframe(friendly iframe)技术。它可能算不上是iframe加载的技术,但是必须使用iframe,它是无阻塞加载的。

  普通方法加载iframe

  这是一种人尽皆知的普通加载方法,它没有浏览器的兼容性问题。

<iframesrc="/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
functioncreateIframe() {
vari=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);
elseif(window.attachEvent) window.attachEvent("onload", createIframe);
elsewindow.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动态的设置,这种方法可以在所有的浏览器中避免阻塞”。

<iframeid="iframe1"src=""width="200"height="100"border="2">
</iframe>
<script>
functionsetIframeSrc() {
vars="path/to/file";
variframe1=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) {
variframe=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 οnlοad="'+
  '
var d = document;d.getElementsByTagName(\'head\')[0].'+
  '
appendChild(d.createElement(\'script\')).src'+'=\'\/path\/to\/file\'">');
doc.close();
//iframe onload event happens
})(document);
</script>

  神奇的地方就在<body οnlοad="">:这个iframe一开始没有内容,所以onload会立即触发。然后你创建一个script元素,用他来加载内容、广告、插件什么的,然后再把这个script添加到HEAD中去,这样iframe内容的加载就不会阻塞主页面的onload!你应该看看他在个浏览器中的表现:

  • iframe会在主页面onload之前开始加载
  • iframe的onload会立即触发,因为iframe的内容一开始为空。
  • 主页面的onload不会被阻塞
  • 为什么这个iframe不会阻塞主页面的onload?因为<body οnlοad="">
  • 如果你不在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事件还是会被阻塞。

from:http://www.cnblogs.com/beiyuu/archive/2011/07/18/iframe-tech-performance.html

转载于:https://www.cnblogs.com/flysnow-z/archive/2011/11/03/2234194.html

iframe异步加载技术及性能相关推荐

  1. iframe异步加载_5种延迟加载图像的方法以帮助你提升网站性能与用户体验

    英文 | https://www.sitepoint.com/five-techniques-lazy-load-images-website-performance/翻译 | web前端开发(ID: ...

  2. iframe异步加载性能优化及无阻塞加载

    我们会经常使用iframes来加载第三方的内容.广告或者插件.使用iframe是因为它可以和主页面并行加载,不会阻塞主页面. iframe会阻塞主页面的onload事件 主页面和iframe共享同一个 ...

  3. AJAX 异步加载技术

    AJAX = 异步 JavaScript 和 XML. AJAX 是一种用于创建快速动态网页的技术. 通过在后台与服务器进行少量数据交换,AJAX 可以使网页实现异步更新.这意味着可以在不重新加载整个 ...

  4. SpiderMan:异步加载,图片爬取,数据库存储,多进程爬虫,IP代理

    1,使用API 1.1,API使用方法 API是通过Requests请求和服务端的Response回应来完成API的一次调用,所以用Python语言进行API的调用时,便可以使用Requests库来进 ...

  5. Python爬虫 解决异步加载问题--以爬取PEXELS图片为例

    第一次尝试爬取->[Python爬虫]爬虫实例:三种方式爬取PEXELS图片 在爬取PEXELS时,遇到了这样问题: 页面使用Ajax的异步加载技术来实现分页,所以通过request.text无 ...

  6. python提取ajax异步加载数据_python爬取豆瓣电影分类排行榜引出的异步加载(AJAX)问题...

    1.背景 之前的文章中已经介绍过猫眼TOP100的电影信息爬取案例,网页每页有10条电影信息,通过翻页发现URL变化规律构造循环爬取10页100条全部电影信息.但是豆瓣电影分类排行榜的网页情况就所不同 ...

  7. 移动网站性能优化:网页加载技术概览

    移动网站性能优化:网页加载技术概览 2013/08/27 | 分类: IT技术 | 0 条评论 | 标签: WEB开发, 性能优化, 移动 分享到: 47 本文由 伯乐在线 - 伯乐在线读者 翻译自  ...

  8. 网页性能优化之异步加载js文件

    一个网页的有很多地方可以进行性能优化,比较常见的一种方式就是异步加载js脚本文件.在谈异步加载之前,先来看看浏览器加载js文件的原理. 浏览器加载 JavaScript 脚本,主要通过<scri ...

  9. 前端性能优化--预加载技术

    当我们谈到前端的性能时,总是会提到比如合并.压缩.缓存或者在服务器上开启gzip之类的,目的都是为了让页面加载的更快. 资源预拉取(prefetch)则是另一种性能优化的技术.通过预拉取可以告诉浏览器 ...

最新文章

  1. 设计模式快速学习(六)模板模式
  2. 算法-----买卖股票的最佳时机(Java 版本)
  3. 卧虎藏龙2不显示服务器列表,《卧虎藏龙贰》iOS平台 合服公告(第2期)
  4. 多线程之多生产多消费者
  5. Linux 中安装 Mysql
  6. 搜狗浏览器收藏夹在哪_chrome谷歌浏览器收藏夹在哪_chrome收藏夹在电脑什么位置...
  7. BZOJ 1051 || POJ 2186 受欢迎的牛 Tarjan
  8. 前端必知:微信小程序如何引入阿里图标
  9. dreamweaver8 html5,dreamweaver8
  10. Python+bs4实现爬取小说并下载到本地
  11. 【zookeeper】Apache curator优点介绍
  12. C语言中如何定义字符串?
  13. 记录一次MySQL数据库失败教训
  14. 计算机毕业设计系列基于SSM的个人博客管理系统
  15. 小i机器人最珍贵的双旦礼物:客户的认可和满意度
  16. 电子文档翻译工具实现文章的批量翻译
  17. ubuntu_内网dns服务器搭建
  18. 如何进行CAN总线高效测试?
  19. 成都信息工程大学计算机导师,硕士生导师 华 维-成都信息工程大学大气科学学院 School of Atmospheric Sciences,CUIT...
  20. 软件测评-功能性及其子特性解析-中科软测认证中心

热门文章

  1. (stack 解析表达式)矩阵链乘
  2. java将属性练成字符串,Java中通过属性字符串名取属性内容
  3. android 保存联系人,保存android联系后获取联系人ID
  4. oracle form中实现隐藏,Oracle Form数据块实现同时只有一个人锁定修改数据
  5. Java 遍历HashTable
  6. Redis字符串深入
  7. Java多对多关系示例
  8. 厦门大学计算机科学与技术学院考研分数线,2020年厦门大学计算机科学与技术考研经验分享...
  9. 5单个编译总会编译全部_JDBC【5】 JDBC预编译和拼接Sql对比
  10. 华为python673集_python库-collections模块Counter类