最近一个电子表格的应用中需要对单元格进行批量宽度检查,然后发现执行效率很低下。
一步步跟踪执行时间后发现
if (div.offsetWidth < td.offsetWidth)
这么一行简单的判断语句,耗时近30ms!!!
太夸张了!执行500次这种判定,就要15秒。
尝试改写成 div.currentStyle.width 性能一样低下。
请问,有高性能的方法取到对象的实际显示宽度吗?
也许是获取div对象和td对象比较耗时
你不需要每次循环都获取td.offsetWidth啊,表格每行各列的单元格宽度都应该是一样的,
只需要获取第一行各列的单元格的offsetWidth,用数组保存,之后就不需要再获取了。
使用offsetWidth之类的属性时,会造成回流,所以比较消耗性能,资源代下载
理论上是,但是表格中如果出现合并单元格,那么保存各行各列宽度高度就不适用了。
比如我需要合并横向两个单元格,简单的做法是,设置主TD的 colSpan = 2,然后将后一个 TD 的 display 设置为 none
这样在拆分这个单元格时,将该 TD 的 colSpan = 1,移除后一个 TD 的 display:none 样式就行
另:只循环一行一列的 offsetWidth 和 offsetHeight 在行列多的情况下开销也很大,我现在只能采取变通的做法,如果发现当 前 TD 的 colSpan > 1或者 rowSpan > 1 则去获取 offsetWidth 和 offsetHeight, 否则则不获取。毕竟合并的单元格多出现在表头,所以运算量一下子小了很多。
感谢您的建议!
所以并没有好的解决办法是吧?
正如楼上所说,只能通过定义变量去保存offset的值.