大容量数据的显示

 

起因:

 

在将 windowlite 应用于大数据 (1.5 M 的 table 数据)显示场景时,刚开始频频让浏览器弹出”中断脚本“窗口,后经过优化代码以及关键的调用流程的改变而终于使得数据得以显示成功,步鄹如下:

 

 

步鄹:

 

1.采用固定css宽高的窗口, windowlite 支持自适应宽度,但是仍然要计算 window容器的宽度,其中调用了 Ext.Element.getTextWidth , 而ext的实现为重新建造一个div,将元素复制过去再计算宽度(offsetWidth) ,十分消耗资源,故 改为固定宽高后,省去步鄹占用时间


2.禁止读取offset等 BOM 属性, 由于我们采用了固定宽高,而大小属性可以直接从css中style读取,而不再需要读取offset系列属性,发现offset属性要比css属性读取慢得多。故 Ext.Element.getWidth ,getHeight,getX 等尽量不要使用,因为这些操作的实现非常繁琐,很多多余操作,对于一个完全自己掌控的div,完全不需要这些操作


3.关键一步:延迟数据加载,固定显示位置。 原来数据加载在window显示之前的构造函数当中,由于当window show操作进行时要居中,或者一些宽度高度调整,避免不了对容器的 style 属性读取 ,而容器内数据越多则读取越慢。若固定显示位置,并先将空白窗口显示出来,再append大数据量到窗体body,则可显著提高显示速度。


4.多利用settimeout 分批计算 ,将show 操作放在 settimeout 中,防止脚本占用过长时间,留给其他操作时间。


5.ie 可用insertAdjacentHtml ,其他浏览器用 range 操作 可以取得比 innerHtml 更高的效率。

 

6.多次操作设置元素 style 时,可以设置 cssText 来减少 reflow :

 

from YUI3 StyleSheet

 

var el = document.getElementById('some_element');
 
el.style.borderBottom = '3px solid #eee'; // reflow
el.style.borderTop    = '3px solid #ccc'; // another reflow
el.style.fontWeight   = 'bold';           // another reflow
 
// Vs. three changes in one reflow
el.style.cssText += '; border-bottom: 3px solid #eee; border-top: 3px solid #ccc; font-weight: bold';
 

 

 

附录:

 

 

频繁DOM操作问题

 

使用 javascript Workers 进行计算

 

Nicholas Zakas :writing-efficient-javascript

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值