巧用setTimeout提高UI响应速度

关于javascript的性能问题,争议最多的就是它的单线程:UI渲染与更新数据跑在一个线程里,如果碰上比较耗时的数据运算或者DOM操作,UI就会很卡,特别是对IE6、7这些古董级的东西,这个问题会特别明显。
这里不想分辨单线程到底是优点还是缺点,只想所说如何通过setTimeout规避这种问题。
比如本博客(www.jiangkunlun.com)上面红色的导航条,当滚动条向下滚动时,通过修改css的position值,菜单条会变成悬浮在页面顶端的,在页面滚动过程中,js会不断检查当前滚动条的位置,直到导航条回到初始位置时,再将其定位回该位置。
由于要不停的访问DOM,取得滚动条的高度,这段代码在IE6、IE7里是很卡的,以至于刚开始的时候,我在这段逻辑的开头加了浏览器类型的判断,如果是IE,干脆不再执行这段代码~~~直到加入了下面这段优化以后
var scroolTime = null;
$(window).bind('scroll.top', function(){
  scroolTime && clearTimeout(scroolTime);
  scroolTime = setTimeout(scroolFun, 0);
});
var scroolFun = function(){
  //.....检查页面高度、设置菜单条css的逻辑
}
上面这段代码的核心就是“setTimeout(xxxx, 0);”,咋一看,定时为0不是等于没定时嘛,其实不然,即使定位为0,setTimeout也不会立即执行定时的function,而是在当前线程空闲时才会执行,也就是说,     随着滚动条的滚动,js逻辑会等喜面的代码跑完,且ui渲染完了以后再去调用     scroolFun。而“clearTimeout(scroolTime)”会保证定时队列里只有一个待执行的scroolFun
再比如,以前做的的一个需求,在js内上有一个几十到上千条的数组,数组内保存的通讯录的实体,页面上要求可以对通讯录做搜索。如果照正常的逻辑,需要将整个数组跑一遍循环,再将符合条件的结果集显示到页面上。特别是在做搜索的时候,需要支持随着用户输入的时时搜索,这种情况下,如果数组长度过千,即便是chrome这样的高端浏览器,页面操作仍然不回很流畅。
这是又到了setTimeout派上用场的时候了:每次对数组搜索时,只搜索10到100条不等的一段,搜索完这一段即将满足条件的结果显示到页面上,然后setTimeout('分段搜索function(start, length)', 0),等待线程空闲以后,再继续搜索下一段。
然后在用户修改搜索关键字时,记得要将上面的定时clearTimeout掉。

具体每次的搜索长度,可以根据浏览器不同来定义,不如IE6,每次只能搜索10条,而chrome每次搜索几百上千条。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值