我必须处理大量图像。首先,我需要检查图像的大小是否大于 50x60,并适当增加坏图像的计数器。
n.width
我遇到的问题是 Internet Explorer 8 上/的速度n.height
极低。我检查了n.offsetWidth
,n.clientWidth
但它们在速度方面都是一样的。但我不能使用n.style.width
,因为这个值并不总是设置在<img />
我感兴趣的标签上。
考虑以下代码:
Javascript
var Test = {
processImages: function () {
var fS = new Date().getTime();
var minimagew = 50,
minimageh = 60;
var imgs = document.getElementsByTagName('img');
var len = imgs.length,
isBad = 0,
i = len;
while (i--) {
var n = imgs[i];
var imgW = n.width;
var imgH = n.height;
if (imgW < minimagew || imgH < minimageh) {
isBad++;
}
}
var fE = new Date().getTime();
var fD = (fE - fS);
console.info('Processed ' + imgs.length + ' images in '
+ fD + 'ms. ' + isBad + ' were marked as bad.');
}
};
HTML
<img src="http://nsidc.org/images/logo_nasa_42x35.gif" />
[snip 9998 images]
<img src="http://nsidc.org/images/logo_nasa_42x35.gif" />
代码生成以下解析 10k 图像的输出(3 个不同的 Ctrl+F5s)
- FF:在 115 毫秒内处理了 10000 张图像。10000 被标记为坏。
- FF:在 99 毫秒内处理了 10000 张图像。10000 被标记为坏。
- FF:在 87 毫秒内处理了 10000 张图像。10000 被标记为坏。
- IE8:在 206 毫秒内处理了 10000 张图像。10000 被标记为坏。
- IE8:在 204 毫秒内处理了 10000 张图像。10000 被标记为坏。
- IE8:在 208 毫秒内处理了 10000 张图像。10000 被标记为坏。
如您所见,FF 3.6 中的代码比 IE8 中执行的代码快两倍。
为了证明问题确实与浏览器维度属性的速度有关,如果我更改:n.width
和n.height
常量,那么我们将拥有:
var imgW = 43;
var imgH = 29;
我得到以下结果:
- FF:在 38 毫秒内处理了 10000 张图像。10000 被标记为坏。
- FF:在 34 毫秒内处理了 10000 张图像。10000 被标记为坏。
- FF:在 33 毫秒内处理了 10000 张图像。10000 被标记为坏。
- IE8:在 18 毫秒内处理了 10000 张图像。10000 被标记为坏。
- IE8:在 22 毫秒内处理了 10000 张图像。10000 被标记为坏。
- IE8:在 17 毫秒内处理了 10000 张图像。10000 被标记为坏。
这是正确的!当我们跳过<img />
维度检查(调用node.width
/ node.clientWidth
etc)时,IE8 实际上比 Firefox 执行得更好。
你有什么想法为什么 IE 需要这么长时间来检查图像的大小以及最终如何提高这种检查的性能?