你可以做到這一點存在多個iframe而不被動態地添加他們:
- 設定身體負荷前的所有幀
about:blank
的src
屬性,
- 讓身體負荷事件火,
- 添加
onload
處理程序以捕獲每個幀的加載時間,然後
- 其餘將每幀的
src
屬性設置爲其原始值。
我創建了一個frameTimer
模塊包括兩個方法:
- 的
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減少代碼(並且不那麼突兀),但是這是一個非常輕量且無依賴的嘗試。
謝謝傑德,很酷!我沒有動態添加iframe的問題。我不想延遲iframe內容的加載,並且只在主體的「加載」事件中設置src可能會導致這種情況。另一方面,預先設置它,然後在body標籤結束之前重置它,實際上可以使瀏覽器開始下載幀組件,停止父級的時間,然後繼續。可能是一個好主意,我將不得不測試它是否有效。 – orip 2009-05-03 12:13:25
沒問題orip。你可以在這裏看到結果:http://s3.amazonaws.com/frameTimer/index.html – 2009-05-03 15:40:20