iframe 异步加载技术及性能分析_javascript技巧
这是一篇原创翻译文章。原文地址。
我们会经常使用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会在主页面的onload之前加载
iframe会在所有iframe的内容都加载完毕之后触发iframe的onload
主页面的onload会在iframes的onload触发之后触发,所以iframe会阻塞主页面的加载
当iframe在加载的过程中,浏览器的会标识正在加载东西,处于忙碌状态。
这里是一个演示页面,时间线图显示出iframe会阻塞主页面的加载。

我的建议:注意onload阻塞。如果iframe的内容只需要很短的时间来加载和执行,那么也不是个大问题,而且使用这种方法还有个好处是可以和主页面并行加载。但是如果加载这个iframe需要很长时间,用户体验就很差了。你得自己测试一下然后在http://www.webpagetest.org/也做些测试,根据onload的时间看看是否需要其他加载方法。
在onload之后加载iframe
如果你想在iframe中加载一些内容,但是这些内容对于页面来说不是那么的重要。或者这些内容不需要马上展现给用户的,需要点击触发之类的。那么可以考虑在主页面载入之后加载iframe。
<script> <BR>//doesn't block the load event <BR>function createIframe() { <BR>var i = document.createElement("iframe"); <BR>i.src = "path/to/file"; <BR>i.scrolling = "auto"; <BR>i.frameborder = "0"; <BR>i.width = "200px"; <BR>i.height = "100px"; <BR>document.getElementById("div-that-holds-the-iframe").appendChild(i); <BR>}; <BR>// Check for browser support of event handling capability <BR>if (window.addEventListener) window.addEventListener("load", createIframe, false); <BR>else if (window.attachEvent) window.attachEvent("onload", createIframe); <BR>else window.onload = createIframe; <BR></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动态的设置,这种方法可以再所有的浏览器中避免阻塞”。
<script> <BR>function setIframeSrc() { <BR>var s = "path/to/file"; <BR>var iframe1 = document.getElementById('iframe1'); <BR>if ( - 1 == navigator.userAgent.indexOf("MSIE")) { <BR>iframe1.src = s; <BR>} else { <BR>iframe1.location = s; <BR>} <BR>} <BR>setTimeout(setIframeSrc, 5); <BR></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> <BR>(function(d) { <BR>var iframe = d.body.appendChild(d.createElement('iframe')), <BR>doc = iframe.contentWindow.document; <BR>// style the iframe with some CSS <BR>iframe.style.cssText = "position:absolute;width:200px;height:100px;left:0px;"; <BR>doc.open().write('<body onload="' + 'var d = document;d.getElementsByTagName(\'head\')[0].' + 'appendChild(d.createElement(\'script\')).src' + '=\'\/path\/to\/file\'">'); <BR>doc.close(); //iframe onload event happens <BR>})(document); <BR></script>
神奇的地方就在:这个iframe一开始没有内容,所以onload会立即触发。然后你创建一个script元素,用他来加载内容、广告、插件什么的,然后再把这个script添加到HEAD中去,这样iframe内容的加载就不会阻塞主页面的onload!你应该看看他在个浏览器中的表现:
iframe会在主页面onload之前开始加载
iframe的onload会立即触发,因为iframe的内容一开始为空
主页面的onload不会被阻塞
为什么这个iframe不会阻塞主页面的onload?因为
如果你不在iframe使用onload监听,那么iframe的加载就会阻塞主页面的onload
当iframe加载的时候,浏览器终于不显示忙碌状态了(非常好)
我的测试页给出下面的时间线:

友好型iframe加载
- 先创建一个iframe。设置他的src为一个相同域名下的静态html文件
- 在这个iframe里面,设置js变量inDapIF=true来告诉广告它已经加载在这个iframe里面了
- 在这个iframe里面,创建一个script元素加上广告的url作为src,然后像普通广告代码一样加载
- 当广告加载完成,重置iframe大小来适应广告
- 这种方法也没有浏览器的兼容性问题。
作者:BeiYuu

Outils d'IA chauds

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

AI Hentai Generator
Générez AI Hentai gratuitement.

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Sujets chauds



Titre : Méthodes et exemples de code pour résoudre le problème selon lequel jQuery.val() ne fonctionne pas. Dans le développement front-end, jQuery est souvent utilisé pour faire fonctionner des éléments de page. Parmi elles, obtenir ou définir la valeur d’un élément de formulaire est l’une des opérations courantes. Habituellement, nous utilisons la méthode .val() de jQuery pour opérer sur les valeurs des éléments de formulaire. Cependant, vous rencontrez parfois des situations dans lesquelles jQuery.val() ne fonctionne pas, ce qui peut entraîner des problèmes. Cet article explique comment gérer efficacement jQuery.val (

Comment surveiller le défilement d'une iframe nécessite des exemples de code spécifiques Lorsque nous utilisons la balise iframe pour intégrer d'autres pages Web dans une page Web, nous devons parfois effectuer certaines opérations spécifiques sur le contenu de l'iframe. L'un des besoins courants est d'écouter l'événement de défilement de l'iframe afin que le code correspondant puisse être exécuté lorsque le défilement se produit. Ce qui suit explique comment utiliser JavaScript pour surveiller le défilement d'une iframe et fournit des exemples de code spécifiques à titre de référence. Récupérer l'élément iframe Tout d'abord, nous avons besoin

Bien que le HTML lui-même ne puisse pas lire les fichiers, la lecture des fichiers peut être réalisée via les méthodes suivantes : en utilisant JavaScript (XMLHttpRequest, fetch()) ; en utilisant des langages côté serveur (PHP, Node.js) en utilisant des bibliothèques tierces (jQuery. get() , axios, fs-extra).

La délégation est un type de référence de type sécurisé utilisé pour transmettre des pointeurs de méthode entre des objets afin de résoudre des problèmes de programmation asynchrone et de gestion d'événements : Programmation asynchrone : la délégation permet d'exécuter des méthodes dans différents threads ou processus, améliorant ainsi la réactivité de l'application. Gestion des événements : les délégués simplifient la gestion des événements, permettant de créer et de gérer des événements tels que des clics ou des mouvements de souris.

Comment empêcher la redirection de page dans WordPress ? Dans le développement de sites Web, nous souhaitons parfois implémenter un paramètre de non-saut de page dans WordPress, c'est-à-dire que lors de certaines opérations, le contenu de la page peut être mis à jour sans actualiser la page entière. Cela améliore l’expérience utilisateur et rend le site Web plus fluide. Ensuite, nous partagerons comment implémenter le paramètre de non-saut de page dans WordPress et fournirons des exemples de code spécifiques. Tout d’abord, nous pouvons utiliser Ajax pour empêcher la page de sauter. Ajax

Un incontournable pour les développeurs front-end : maîtrisez ces modes d’optimisation et faites voler votre site web ! Avec le développement rapide d’Internet, les sites Web sont devenus l’un des canaux importants de promotion et de communication des entreprises. Un site Web performant et à chargement rapide améliore non seulement l’expérience utilisateur, mais attire également plus de visiteurs. En tant que développeur front-end, il est essentiel de maîtriser certains modèles d'optimisation. Cet article présentera certaines techniques d'optimisation frontale couramment utilisées pour aider les développeurs à mieux optimiser leurs sites Web. Fichiers compressés Dans le développement de sites Web, les types de fichiers couramment utilisés incluent HTML, CSS et J

Pour inclure un fichier JS externe en HTML, utilisez la balise <script> et précisez l'URL du fichier à charger. Vous pouvez également spécifier des attributs de type, defer ou async pour contrôler la manière dont le chargement et l'exécution se produisent. Généralement, la balise <script> doit être placée au bas de la section <body> pour éviter de bloquer le rendu de la page.

La fonction de recherche PHP a toujours été une partie très importante du développement de sites Web, car les utilisateurs utilisent souvent le champ de recherche pour trouver les informations dont ils ont besoin. Cependant, de nombreux sites Web rencontrent des problèmes tels qu’une faible efficacité et des résultats de recherche inexacts lors de la mise en œuvre des fonctions de recherche. Afin de vous aider à optimiser la fonction de recherche PHP, cet article partagera quelques conseils et fournira des exemples de code spécifiques. 1. Utilisez des moteurs de recherche en texte intégral Les bases de données SQL traditionnelles sont moins efficaces lors du traitement de grandes quantités de contenu textuel. Par conséquent, il est recommandé d'utiliser des moteurs de recherche en texte intégral, tels qu'Elasticsearch, Solr, etc.
