iframe异步加载技术及性能

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在加载的过程中,浏览器会标识正在加载东西,处于忙碌状态。

我的建议:注意onload阻塞。如果iframe的内容只需要很短的时间来加载和执行,那么也不是个大问题,而且使用这种方法还有个好处

是可以和主页面并行加载。但是如果加载这个iframe需要很长时间,用户体验就很差了。

在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加载的时候,还是会看到浏览器的忙碌状态,相对于普通加载方法,用户看到忙碌状态的时间更长。还有就是用户还没

等到页面完全加载完的时候就已经离开了。有些情况下这是个问题,比如广告。

etTimeout()来加载iframe

      这种方法的目的是不阻塞onload事件。

      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加载的时候,浏览器会显示忙碌状态。

使用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 ο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大小来适应广告。

**这种方法也没有浏览器的兼容性问题


判断iframe是否加载完成的两种方法:

方法1.

var iframe = document.createElement("iframe"); 
iframe.src = "http://www.jb51.net"; 
if (!/*@cc_on!@*/0) { //if not IE 
    iframe.onload = function(){ 
        alert("Local iframe is now loaded."); 
    }; 
} else { 
    iframe.onreadystatechange = function(){ 
        if (iframe.readyState == "complete"){ 
            alert("Local iframe is now loaded."); 
        } 
    }; 
} 
document.body.appendChild(iframe);

方法2.

var iframe = document.createElement("iframe"); 
iframe.src = "http://www.jb51.net"; 
if (iframe.attachEvent){ 
    iframe.attachEvent("onload", function(){ 
        alert("Local iframe is now loaded."); 
    }); 
} else { 
    iframe.onload = function(){ 
        alert("Local iframe is now loaded."); 
    }; 
} 
document.body.appendChild(iframe);

IE支持iframe的onload事件,不过是隐形的,需要通过 attachEvent 来注册。 
第二种方法比第一种方法更完美,因为 readystatechange 事件相对于 load 事件有一些潜在的问题。

问题:

jquery的方法:一个iframe.attr("src","地址");如果在其加载完成之后执行某操作,比如回调函数怎么做?

var oFrm = document.getElementById('ifrm');
oFrm.onload = oFrm.onreadystatechange = function() {
if (this.readyState && this.readyState != 'complete') {
    return;
} else {
    onComplete();
    }
}


转载于:https://my.oschina.net/u/2331760/blog/402526

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值