有时我们需要修改一连串style属性值,为了使代码简单点,先提前取出元素的style值,例如:

var sty = elem.style;

sty.left = "XXX";
sty.top = "XXX";
sty.width = "XXX";
sty.height = "XXX"; 

      也许你考虑的仅仅是为了简单点,并不认为运行速度能快多少。如果碰到只修改2个属性的话,或许你还不一定会这样做。

      过去我也是这样认为,访问elem.style无非就是读取obj[key]的时间,快的可以忽略不计。事实上,直觉往往是错误的,绝知此事还是要躬行一下。

      这里写了一个最简单的测试,就是比较访问elem.style的时间和obj.style的时间 :

/* 定义 */
var objJS = {style: {}};
var objDOM = document.body;


var t0;
var t1, t2;

t0 = +new Date();
for(var i=0; i<1e6; i++)
	;
t0 = +new Date() - t0;

t1 = +new Date();
for(var i=0; i<1e6; i++)
{
	/* 测试1 */
	objDOM.style;
	/* 测试1 */
}
t1 = +new Date() - t1 - t0;


t2 = +new Date();
for(var i=0; i<1e6; i++)
{
	/* 测试2 */
	objJS.style;
	/* 测试2 */
}
t2 = +new Date() - t2 - t0;

alert("t1 : t2 = " + t1 / t2 + " : 1");


      在IE上脚本运行时间长了会报超时,所以可以设当修改1e6这个值。因为结果是个比率,所以不影响。

      究竟DOM.style比obj.style慢了几倍呢?下面是一些浏览器的平均测试结果:

      IE:10

      FF: 180

      Opera: 16

      Safari: 27

      Chrome:  20 


      有此可见,即便是最快也有10倍之多,而在FireFox下更是慢的离谱。因此在大量操作元素样式时,提前读取还是可以提升不少的性能。

作者: EtherDream 发表于 2011-03-14 13:27 原文链接

推荐.NET配套的通用数据层ORM框架:CYQ.Data 通用数据层框架