`

iframe异步加载技术及性能

阅读更多

  我们会经常使用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

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

<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异步加载技术】 在Web开发中,`iframe`(Inline Frame)常用于加载第三方内容,如广告、插件等。它的主要优点是能够与主页面并行加载,不阻塞主页面的渲染。然而,`iframe`的使用并非没有代价。正如Steve ...

    通过JavaScript+IFRAME实现页面分屏加载

    这就是所谓的"分屏加载"或"异步加载"。JavaScript 和 IFRAME 结合使用是实现这一功能的一种常见方法。下面我们将深入探讨这个话题。 ### 1. IFRAME 基础 **IFRAME(Inline Frame)** 是HTML中的一个元素,允许我们...

    异步加载script的代码

    在网页开发中,异步加载(Asynchronous...总的来说,异步加载script是优化网页性能的关键技术之一,特别是在处理大量脚本时。开发者应根据项目需求和浏览器兼容性选择合适的方法来实现异步加载,以确保最佳的用户体验。

    lazyload.js实现图片异步延迟加载

    图片异步延迟加载,也称为懒加载(Lazy Loading),是一种优化网页性能的策略,它能够显著提高网页加载速度,减少用户等待时间,并节省网络带宽。在本文中,我们将深入探讨如何使用`lazyload.js`这个JavaScript库来...

    iframe框架后台模板

    zTree提供了丰富的API和灵活的配置项,支持异步加载、拖拽操作、节点选择等多种功能,非常适合用于后台管理系统中的菜单展示和导航。在iframe框架中,zTree通常用于构建左侧的导航栏,用户可以通过点击树状节点来...

    jquery插件:ajax和iframe加载提示效果

    在网页开发中,用户体验是至关重要的,尤其是在进行异步操作(如Ajax请求)或加载Iframe时,用户往往需要一个明确的反馈,告知他们系统正在进行后台处理。这个jQuery插件正是为了解决这个问题而设计的,它提供了一种...

    html 网页加载

    - 可以通过异步加载等方式优化加载性能。 4. **安全问题**: - 需要确保嵌入的内容来自可信任的源,避免潜在的安全风险。 - 使用`sandbox`属性可以增强安全性,限制`&lt;iframe&gt;`的内容执行脚本、提交表单等操作的...

    Default(iframe).rar(iframe的简单使用)

    同时,合理使用缓存和异步加载技术能提升用户体验。 综上所述,`Default(iframe).rar`压缩包提供的实例展示了如何在.NET环境中利用`iframe`进行页面构建和动态内容加载。通过学习和实践这些文件,开发者可以更好地...

    Extjs6-iframe-优化.rar

    5. **优化性能**:通过这种方式,可以减少不必要的IFrame加载时间,节省网络带宽,同时减少了可能导致的浏览器崩溃风险。 6. **增强可维护性**:优化后的代码结构可能会更加清晰,便于后期的调试和维护,因为错误...

    HTML5 postMessage+iframe实现文件跨域异步上传

    本篇将重点讲解如何利用HTML5的`postMessage`和`iframe`技术来实现文件的跨域异步上传。 `postMessage`是HTML5中一种强大的通信机制,它允许来自不同源的脚本采用异步方式进行有限的通信,可以解决同源策略带来的...

    iframe实时高度检测

    当`iframe`中的内容动态加载或变化时,如用户滚动、数据异步加载等,原始设定的固定高度可能无法满足需求。因此,我们需要一个机制来实时检测`iframe`内部页面的高度,并动态调整`iframe`及父页面的高度,以实现...

    用DIV仿iframe框架布局效果

    在网页设计中,有时我们可能需要实现类似iframe的框架布局效果,但又不希望引入额外的HTML标签,比如iframe,因为它们可能会带来加载性能问题或者与某些浏览器的兼容性问题。在这种情况下,我们可以利用CSS和...

    java iframe应用 jsp j2ee

    在实际项目中,开发者还需要考虑跨域安全、页面加载性能、用户体验等因素,以确保IFrame的合理、高效使用。在"mytest"这个压缩包中,可能包含了相关的示例代码或项目结构,通过学习和实践这些内容,可以加深对IFrame...

    asp.net异步刷新案例

    ASP.NET异步刷新技术是Web开发中的一个重要概念,它允许页面的部分内容在不重新加载整个页面的情况下进行更新,显著提高了用户体验。在这个“qq聊天工具异步刷新案例”中,我们将探讨如何利用ASP.NET实现类似即时...

    IFrame简单例子

    2. **页面加载性能**:IFrame可以让部分页面异步加载,提高用户体验。 3. **嵌入内容**:可以方便地嵌入其他网站的内容,如地图、视频等。 4. **分离样式和脚本**:在复杂应用中,IFrame可以隔离样式和脚本,避免...

    后台模板框架iframe

    4. 加载优化:通过异步加载iframe,可以延迟加载某些非首屏内容,减轻服务器压力,提高页面初始加载速度。 5. 多源内容整合:iframe可以加载来自不同域名的内容,这对于集成第三方服务或者API非常有用,例如地图...

    完美解决iframe跨域问题

    4. **JSONP(JSON with Padding)**:虽然主要应用于脚本异步请求,但也可以用于解决iframe跨域。通过动态创建`&lt;script&gt;`标签,利用回调函数来传递数据。 5. **CORS(Cross-Origin Resource Sharing)**:服务器端设置`...

    unigui_网页iframe交互

    考虑使用懒加载或按需加载技术,只在需要时加载IFrame内容。 5. 示例代码: 在Unigui应用中,可以通过JavaScript代码与IFrame交互,例如: ```javascript var iframe = document.getElementById('myIframe'); ...

    IFRAME自适应

    - 利用`async`或`defer`属性异步加载IFRAME,防止阻塞主页面的渲染。 4. **非名文件1(Noname1.html)的应用**: "Noname1.html"可能是演示IFRAME自适应的一个实例,可能包含了IFRAME元素和相应的CSS或JavaScript...

Global site tag (gtag.js) - Google Analytics