html iframe用法详解(Iframe 的4种加载技术和性能优化)

大家好,很高兴又见面了,我是”高级前端‬进阶‬”,由我带着大家一起关注前端前沿、深入前端底层技术,大家一起进步,也欢迎大家关注、点赞、收藏、转发!

html iframe用法详解(Iframe 的4种加载技术和性能优化)

高级前端‬进阶

前言

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

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

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

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

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

1.普通方法加载iframe

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

1 <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会阻塞主页面的加载。

html iframe用法详解(Iframe 的4种加载技术和性能优化)

建议:注意onload阻塞。如果iframe的内容只需要很短的时间来加载和执行,那么也不是个大问题,而且使用这种方法还有个好处是可以和主页面并行加载。但是如果加载这个iframe需要很长时间,用户体验就很差了。

2.在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加载的时候,浏览器会标识正在加载

html iframe用法详解(Iframe 的4种加载技术和性能优化)

这种方法比普通方法有什么好处呢?load事件会马上触发,有两个好处:

其他等待主页面onload事件的代码可以尽早执行Google Toolbar计算你页面加载的时间会大大减少

但是,当iframe加载的时候,还是会看到浏览器的忙碌状态,相对于普通加载方法,用户看到忙碌状态的时间更长。还有就是用户还没等到页面完全加载完的时候就已经离开了。有些情况下这是个问题,比如广告。

3.setTimeout()来加载iframe

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

Steve Souder说到:“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加载的时候,浏览器会显示忙碌状态

下面是时间线图

html iframe用法详解(Iframe 的4种加载技术和性能优化)

IE8初次加载

html iframe用法详解(Iframe 的4种加载技术和性能优化)

IE8非初次加载

因为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加载的时候,浏览器终于不显示忙碌状态了(非常好)

测试页给出下面的时间线:

html iframe用法详解(Iframe 的4种加载技术和性能优化)

转义字符让代码看着有些难受,这都不是问题。试试吧。

4.友好型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%。

没有创建相关的测试页,所以也没有第一手的资料。从我调研的结果来说:

如果只想在网页上调用一个确定的src地址的iframe的话这个方法不是很有用。

如果你想在网页上展示多个广告,比较灵活的方法的是:加载一个广告,然后更新iframe加载另一个主页面的DOMContentLoaded时间不会被阻塞,页面渲染也不会被阻塞,当然,主页面的onload事件还是会被阻塞。

注意:友好型iframe的实现可以参考文末的Vue实现版本,即vue-friendly-iframe

5.本文总结

本文主要和大家介绍下Iframe的四种加载方案 ,上次使用cheerjp加载webassembly的时候遇到iframe阻塞主页面onload、浏览器一直显示数据加载中等诸多问题,遇到了这篇文章,所以翻译出来分享给大家。当然,很多探索也没有很深入,但是文末的参考资料提供了大量优秀文档以供学习,如果有兴趣可以自行阅读。

参考资料

https://www.aaronpeters.nl/blog/iframe-loading-techniques-and-performance/
https://github.com/officert/vue-friendly-iframe
https://www.toutiao.com/article/7198047359320801832

英文原文:

https://www.aaronpeters.nl/blog/iframe-loading-techniques-and-performance/

英文作者:Aaron Peters

免责声明: 本站内容与配图部分转载于网络,我们不做任何商业用途,由于部分内容无法与原作者取得联系,如发现本站有涉嫌抄袭侵权/违法违规的内容, 请联系站长QQ举报,一经查实,本站将立刻删除。

(0)
YoKo的头像YoKo

相关推荐

  • 东芝液晶电视怎么样(质量好吗值得买吗)

    东芝电视质量比较有保障,售后也放心,我很满意!质量杠杠滴,买来这个是送给家人的,看中了它的画质,东芝电视Z750搭载ZR视觉感知芯片,在看一些老电影和画质不好视频素材时,ZR会智能修复画质,看起来更加高清舒适.

    2024年 4月 30日
    016
  • 海尔空调故障f9解决方法(代码对照表大全)

    室外机系列故障描述: 一.单元机系列(风管机系列/柜机系列/嵌入机系列)一拖一分体式 二.8-12HP侧出风系列RFC*M(C)X(7.4.S)(-A)系列(0151800146B) 三.3-7HP侧出风RFC*M(C)X(7.4.S)(-A)系列(0150800058,0151800123A) 四.8-16HP奥蕴多联RFC*MX6,整体式RFC*MX4系…

    2024年 4月 30日
    016
  • 中韩三星电视怎么样(质量好不好值得入手吗)

    “目前口碑排前十名的电视机,你可以看看有喜欢的不。” 1,TCL电视 TCL电视是国内知名的一个液晶电视品牌,在商超普及率高。在2023年,国内超过50%的市场份额。TCL画质顶级,性能佳,价格还很亲民。 2,海信(Hisense)电视 海信(Hisense)电视自主研发的画质芯片和ULED画质增强技术,使其在画质方面表现出众,独具特色。海信(Hisense…

    2024年 4月 30日 投稿
    021
  • 苹果注册id怎么注册(小白一学就会的苹果使用教程)

    苹果id注册是苹果用户必不可少的,因为如果没有苹果id注册就不能在苹果app商店上下载软件、安装软件。那么本文小编将告诉你苹果手机id注册步骤图解。 工具/原料: 品牌型号:苹果13 方法/步骤: 方法一:在Apple ID官网注册 1、在浏览器地址栏上面输入:“ http://appleid.apple.com/cn”,进入申请Apple ID官网界面,点…

    2024年 4月 30日 投稿
    020
  • 淘宝买到假货如何申请假一赔三退款(手把手教你起诉不良商家)

    我相信很多人网购买到了假冒伪劣商品,很多人选择退货退款或仅退款,但是有些平台又不支持仅退款,也不支持你要求退一赔三,这个时候我们不要退货退款,我们一定要用法律武器维护自己合法权益,惩治不良商家!退一赔三是消费者合法要求,也是惩治不良商家最好的方法!我们可以互联网法庭直接起诉商家,点商家店铺名称,查看营业执照上法人代表名字电话等信息,如果没有营业执照信息找平台…

    2024年 4月 30日 投稿
    015