次の方法で、複数の iframe を動的に追加せずにこれを実現できます。
src
すべてのフレームの属性をabout:blank
ボディ ロード前に設定し、
- body load イベントを発生させ、
onload
各フレームのロード時間をキャプチャするハンドラを追加してから、
src
各フレームの属性を元の値に復元します。
frameTimer
2 つのメソッドで構成されるモジュールを作成しました。
- タグ
init
の直前に呼び出す必要があるメソッド、および</body>
measure
ページの読み込み時に呼び出されるメソッドで、結果とともにコールバックを受け取ります。
結果オブジェクトは次のようなハッシュです。
{
iframes: {
'http://google.co.jp/': 1241159345061,
'http://google.com/': 1241159345132,
'http://google.co.uk/': 1241159345183,
'http://google.co.kr/': 1241159345439
},
document: 1241159342970
}
読み込み時間ごとに整数を返しますが、ドキュメント本体の読み込みから差分を返すように簡単に変更できます。
この JavaScript ファイル ( frameTimer.js
)を使用した実際の動作例を次に示します。
var frameTimer = ( function() {
var iframes, iframeCount, iframeSrc, results = { iframes: {} };
return {
init: function() {
iframes = document.getElementsByTagName("iframe"),
iframeCount = iframes.length,
iframeSrc = [];
for ( var i = 0; i < iframeCount; i++ ) {
iframeSrc[i] = iframes[i].src;
iframes[i].src = "about:blank";
}
},
measure: function( callback ) {
results.document = +new Date;
for ( var i = 0; i < iframeCount; i++ ) {
iframes[i].onload = function() {
results.iframes[ this.src ] = +new Date;
if (!--iframeCount)
callback( results )
};
iframes[i].src = iframeSrc[ i ];
}
}
};
})();
およびこの html ファイル ( frameTimer.html
):
<html>
<head>
<script type="text/javascript" src="frameTimer.js"></script>
</head>
<body onload="frameTimer.measure( function( x ){ alert( x.toSource() ) } )">
<iframe src="http://google.com"></iframe>
<iframe src="http://google.co.jp"></iframe>
<iframe src="http://google.co.uk"></iframe>
<iframe src="http://google.co.kr"></iframe>
<script type="text/javascript">frameTimer.init()</script>
</body>
</html>
これは、jQuery を使用すると、はるかに少ないコード (および目立たない) で実行できますが、これは非常に軽量で依存関係のない試みです。