iframe学习(二)之窗口加载 iframe异步加载技术及性能

我们会经常使用iframes来加载第三方的内容、广告或者插件。使用iframe是因为他可以和主页面并行加载,不会阻塞主页面,弊端如下:

  • iframe会阻塞主页面的onload事件

  • 主页面和iframe共享同一个连接池

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

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

iframe的加载方式

普通iframe、onload之后加载iframe、setTimeout() iframe、异步加载iframe

一、同步加载/普通加载iframe(没有兼容性问题)

<iframe src="" frameborder="0" width="728" height="90" scrolling="auto"></iframe>

这种方式在各浏览器的表现形式:

(1)iframe会在主页面的onload之前加载

(2)iframe会在所有的iframe的内容都加载完后才出发的iframe的onload事件

(3)主页面的onload事件会在页面上的所有iframe的onload触发完之后才触发,所以会阻塞主页面的加载

(4)当iframe在加载的过程中,浏览器的标识会显示正在加载东西,处于忙碌状态

注意onload阻塞。如果iframe的内容只需要很短的时间来加载和执行,那么也不是个大问题,而且使用这种方法还有个好处是可以和主页面并行加载。但是如果加载这个iframe需要很长时间,用户体验就很差了。你得自己测试一下然后在http://www.webpagetest.org/也做些测试,根据onload的时间看看是否需要其他加载方法。

二、在onload之后加载iframe(没有兼容性问题)

如果你想在iframe中加载一些内容,但是这些内容对于页面来说不是那么的重要。或者这些内容不需要马上展现给用户的,需要点击触发之类的。那么可以考虑在主页面载入之后加载iframe。

<script>
 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);
     };

     if (window.addEventListener) window.addEventListener("load", createIframe, false);
     else if (window.attachEvent) window.attachEvent("onload", createIframe);
     else window.onload = createIframe;
 </script>

这种方式在各浏览器的表现形式:

(1)iframe会在主页面onload之后加载

(2)主页面的onload事件与ifame无关,所以iframe不会阻塞主页面的加载

(3)当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之外的在其他浏览器的表现:

(1)iframe会在主页面onload之前开始加载

(2)iframe的onload事件会在iframe的内容都加载完之后触发

(3)iframe不会阻塞主页面的onlaod事件(IE8除外),为什么不会阻塞,因为是使用setTimeout()

(4)当iframe加载的时候,浏览器会显示忙碌状态

因为IE8的问题,这种技术就不适合很多网站了。如果有超过10%的用户使用IE8,十分之一的用户体验就会差。你会说那也只是比普通加载差一点点,其实普通加载性能上也不差。onload事件对于10%的用户来说都更长。。。。额,你自己考虑吧。但是最好在看了下面这个很赞的异步加载方法之后再决定吧。

四、异步加载 iframe

<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!你应该看看他在个浏览器中的表现:

(1)iframe会在主页面onload之前开始加载

(2)iframe的onload会立即触发,因为iframe的内容一开始为空

(3)主页面的onload不会被阻塞,为什么这个iframe不会阻塞主页面的onload?因为<body onload=”">,如果你不在iframe使用onload监听,那么iframe的加载就会阻塞主页面的onload

(4)当iframe加载的时候,浏览器终于不显示忙碌状态了(非常好)

参考

iframe异步加载技术及性能

猜你喜欢

转载自www.cnblogs.com/kunmomo/p/12120932.html
今日推荐