1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > 数据量太大 DOM节点加载过多 怎么保证前端在渲染的时候页面不会卡(性能优化)

数据量太大 DOM节点加载过多 怎么保证前端在渲染的时候页面不会卡(性能优化)

时间:2019-09-15 04:24:24

相关推荐

数据量太大 DOM节点加载过多 怎么保证前端在渲染的时候页面不会卡(性能优化)

一、定时器分批渲染

既然一次渲染10万条数据会造成页面加载速度缓慢,那么我们可以不要一次性渲染这么多数据,而是分批次渲染, 比如一次10000条,分10次来完成, 这样或许会对页面的渲染速度有提升。 然而,如果这13次操作在同一个代码执行流程中运行,那似乎不但无法解决糟糕的页面卡顿问题,反而会将代码复杂化。 类似的问题在其它语言最佳的解决方案是使用多线程,JavaScript虽然没有多线程,但是setTimeout和setInterval两个函数却能起到和多线程差不多的效果。 因此,要解决这个问题, 其中的setTimeout便可以大显身手。 setTimeout函数的功能可以看作是在指定时间之后启动一个新的线程来完成任务。

function loadAll(response) {//将10万条数据分组, 每组500条,一共200组var groups = group(response);for (var i = 0; i < groups.length; i++) {//闭包, 保持i值的正确性window.setTimeout(function () {var group = groups[i];var index = i + 1;return function () {//分批渲染loadPart( group, index );}}(), 1);}}//数据分组函数(每组500条)function group(data) {var result = [];var groupItem;for (var i = 0; i < data.length; i++) {if (i % 500 == 0) {groupItem != null && result.push(groupItem);groupItem = [];}groupItem.push(data[i]);}result.push(groupItem);return result;}var currIndex = 0;//加载某一批数据的函数function loadPart( group, index ) {var html = “”;for (var i = 0; i < group.length; i++) {var item = group[i];html += “title:” + item.title + index + " content:" +item.content+ index + “”;}//保证顺序不错乱while (index - currIndex == 1) {$(“#content”).append(html);currIndex = index;}}

二、document.createDocumentFragment()

用来创建一个虚拟的节点对象,节点对象不属于文档树。

当需要添加多个DOM元素时,可以先把DOM添加到这个虚拟节点中。然后再统一将虚拟节点添加到页面,这会减少页面渲染DOM的次数。

window.requestAnimationFrame

接受参数为函数,比起setTimeout和setInterval有以下优点:

1.把每一帧中的所有DOM操作集中起来,在一次的重排/重绘中完成。每秒60帧。

2.在隐藏或者不可见的元素中,requestAnimationFrame将不会重绘/重排。

//总数据const total = 10000;//每次插入的数据const once = 20;//需要插入的次数const times = Math.ceil(total/once)//当前插入的次数const curTimes = 0;//需要插入的位置const ul = document.querySelector(‘ul’)function add(){let frag = document.createDocumetFragment()for(let i = 0;i<once;i++){let li = document.createElement(‘li’)li.innerHTML = Math.floor(i+curTimes*once)frag.appendChild(li)}curTimes++;ul.appendChild(frag)if(curTimes<times){window.requestAnimationFrag(add)}}window.requestAnimationFrag(add)

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。