iframe异步加载技术及性能,及个⼈总结的预加载
博客为什么没人用了我们会经常使⽤iframes来加载第三⽅的内容、⼴告或者插件。使⽤iframe是因为它可以和主页⾯并⾏加载,不会阻塞主页⾯。
缺点:
iframe会阻塞主页⾯的onload事件
主页⾯和iframe共享同⼀个连接池
阻塞主页⾯的onload是这两个问题中最影响性能的⽅⾯。⼀般都是想让onload时间越早触发越好。
那么为了提⾼页⾯性能,怎样才能不阻塞主页⾯的onload事件的来加载iframe呢?
这篇讲了四种加载iframe的⽅法:
普通iframe,
onload之后加载iframe,
setTimeout() iframe
异步加载iframe。
每种⽅法的加载结果我都⽤IE8的时间线来展⽰。我建议多注意下动态异步加载这个⽅法,因为这是性能表现最佳的。
普通⽅法加载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 = ateElement("iframe");
i.src ="path/to/file";
i.scrolling ="auto";
i.frameborder ="0";
i.width ="200px";
i.height ="100px";
};
// Check for browser support of event handling capability 检查浏览器是否⽀持事件处理能⼒,个⼈理解应该是兼容性处理
if (window.addEventListener) window.addEventListener("load", createIframe, false);
else if (window.attachEvent) window.attachEvent("onload", createIframe);
load = createIframe;
</script>
这种加载⽅法也是没有浏览器的兼容性问题的:
iframe会在主页⾯onload之后开始加载
主页⾯的onload事件触发与iframe⽆关,所以iframe不会阻塞加载。
当iframe加载的时候,浏览器会标识正在加载。
这种⽅法⽐普通⽅法有什么好处呢?load事件会马上触发,有两个好处
其他等待主页⾯onload事件的代码可以尽早执⾏
Google Toolbar计算你页⾯加载的时间会⼤⼤减少
但是,当iframe加载的时候,还是会看到浏览器的忙碌状态,相对于普通加载⽅法,⽤户看到忙碌状态的时间更长。还有就是⽤户还没等到页⾯完全加载完的时候就已经离开了。有些情况下这是个问题,⽐如⼴告。
setTimeout()来加载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 = ElementById('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%的⽤户来说都更长。。。。额,你⾃⼰考虑吧。但是最好在看了下⾯这个很赞的异步加载⽅法之后再决定吧。
异步加载iframe
<script>
(function(d) {
var iframe = d.body.ateElement('iframe')),
doc = tWindow.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 = ElementsByTagName(\'head\')[0].'+
'ateElement(\'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预加载⼩记
这⾥表演的是 jquery-1.7.js 预加载,在下⾯的点击事件之前已经预加载好了。
(function(doc) {
var ifr = doc.body.ateElement('iframe')),
ifr_doc = tWindow.document;
ifr.frameborder = '1px';
ifr.height = '1px';
ifr.width = '1px';
ifr.style.display = 'none';
var loadjs = '<body onload="' +
'var d = ElementsByTagName(\'head\')[0].appendChild(' +
'd.createElement(\'script\')).src' +
'=\'javascript/jquery-1.7.js\'">';
ifr_doc.open();
ifr_doc.write(loadjs);
ifr_doc.close();
})(document);
$('loadBtn').addEvent('click', function() {
var script = ateElement('script');
script.async = true;
script.src = 'javascript/jquery-1.7.js';
});
先⾃调⽤
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论