您可以通过以下方式实现多个iframe的此操作,而无需动态添加它们:
- 在body加载之前将所有框架的src属性设置为about:blank,
- 让body加载事件触发,
- 添加一个onload处理程序来捕获每个框架的加载时间,然后
- 将每个框架的src属性恢复到其原始值。
我已创建了一个frameTimer模块,其中包含两种方法:
- 需要在 </body> 标签之前立即调用的init方法,以及
- 在页面加载时调用的测量方法,该方法带有包含结果的回调函数。
结果对象是这样的哈希:
{
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可以用更少的代码(更不突兀地)完成此操作,但这是一种相当轻量级且无依赖性的尝试。
frameTimer.init()
代码段中,有些 iframe URLs 可能已经被缓存,而且由于缓存的原因 onload 时间可能会减少。 - Bharat Khatri