私たちはサードパーティのコンテンツ、広告、プラグインを読み込むために iframe をよく使用します。 iframe が使用されるのは、メイン ページと並行してロードでき、メイン ページをブロックしないためです。もちろん、iframe の使用には長所と短所があります。Steve Souders は自身のブログで次のように説明しています: Iframe を控えめに使用する:
メイン ページのオンロードのブロックは、これら 2 つの問題の中で最もパフォーマンスに影響を与える側面です。一般的に、オンロード時間はできるだけ早くトリガーされるようにしたいと考えていますが、一方ではユーザーがそれを経験しており、さらに重要なことに、Google は Web サイトの読み込み速度をスコア化しています。ユーザーは IE と FF の Google ツールバーを使用して、次のことを行うことができます。時間を計ります。
この記事では、iframe をロードする 4 つの方法について説明します。通常の iframe、onload 後の iframe のロード、setTimeout() iframe、および iframe の非同期ロードです。 IE8 のタイムラインを使用して、各メソッドの読み込み結果を表示します。動的非同期読み込み方法のパフォーマンスが最も優れているため、動的非同期読み込み方法にもっと注意を払うことをお勧めします。さらに、Friendly iframe (フレンドリー iframe) テクノロジーもあります。これは iframe 読み込みテクノロジとはみなされないかもしれませんが、ブロックせずに読み込まれるため、iframe を使用する必要があります。
通常の方法を使用して iframe をロードします。
これはよく知られた通常のロード方法であり、ブラウザの互換性の問題はありません。
私の提案: onload ブロックに注意してください。 iframe のコンテンツのロードと実行に短時間しかかからない場合は、大きな問題はありません。この方法を使用すると、メイン ページと並行してロードできるという利点があります。ただし、この iframe の読み込みに時間がかかると、ユーザー エクスペリエンスが非常に低下します。自分でテストしてから、http://www.webpagetest.org/ でテストを行って、オンロード時間に基づいて他の読み込み方法が必要かどうかを確認する必要があります。
onload 後に iframe をロードする
iframe にコンテンツをロードしたいが、そのコンテンツはページにとってそれほど重要ではない場合。または、コンテンツをユーザーにすぐに表示する必要はありませんが、クリックしてトリガーする必要があります。次に、メイン ページが読み込まれた後に iframe を読み込むことを検討できます。
<script>//ロードイベント <br>function createIframe() { <br>var i = document.createElement("iframe"); <br>i.src = "path/to/file"; をブロックしません。スクロール = " auto"; <br>i.width = "200px"; <br>i.height = "100px"; -holds- the-iframe").appendChild(i); <br>}; <br>// ブラウザーのイベント処理機能のサポートを確認します <br>if (window.addEventListener) window.addEventListener("load", createIframe) 、 false) ; <br>else if (window.attachEvent) window.attachEvent("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 読み込みテクノロジではありませんが、iframe を使用して広告を保持します。重要なのは、iframe がどのように読み込まれるかではなく、メイン ページ、iframe、広告がどのように連携するかです。以下のように:
- 最初に iframe を作成します。 src を同じドメイン名の静的 HTML ファイルに設定します
- この iframe で、js 変数 inDapIF=true を設定して、広告がこの iframe に読み込まれたことを伝えます。
- この iframe でスクリプト要素を作成し、広告の URL を src として追加し、通常の広告コードと同様に読み込みます。
- 広告が読み込まれたら、広告に合わせて iframe サイズをリセットします
- この方法にはブラウザの互換性の問題もありません。
該当のテストページを作成していないため、最初の曲の情報がありません。私の研究結果から:
Web ページ上の特定の src アドレスを持つ iframe を呼び出したいだけの場合、このメソッドはあまり役に立ちません。
Web ページに複数の広告を表示する場合、より柔軟な方法は次のとおりです。広告を 1 つ読み込み、iframe を更新して別のメイン ページを読み込みます。DOMContentLoaded 時間はブロックされず、ページのレンダリングは行われません。もちろん、メイン ページの onload イベントは引き続きブロックされます。