DOM如何渲染大量千级万级数据页面也不会卡住-面试题

柯里星轨
• 阅读 2481

一个例子是创建 WebQQ 的 QQ 好友列表。列表中通常会有成百上千个好友,如果一个好友
用一个节点来表示,当我们在页面中渲染这个列表的时候,可能要一次性往页面中创建成百上千
个节点。
在短时间内往页面中大量添加 DOM 节点显然也会让浏览器吃不消,我们看到的结果往往就
是浏览器的卡顿甚至假死。代码如下:

var ary = [];
for ( var i = 1; i <= 1000; i++ ){
    ary.push( i ); // 假设 ary 装载了 1000 个好友的数据
};
var renderFriendList = function( data ){
    for ( var i = 0, l = data.length; i < l; i++ ){
        var div = document.createElement( 'div' );
        div.innerHTML = i;
        document.body.appendChild( div );
    }
};
renderFriendList( ary );

这个问题的解决方案之一是下面的 timeChunk 函数, timeChunk 函数让创建节点的工作分批进
行,比如把 1 秒钟创建 1000 个节点,改为每隔 200 毫秒创建 8 个节点。

// data 数据  func 插入操作  interval 时间周期  该周期插入的项目数
var timeChunk = function(data, func, interval, count){
    var obj, timer;
    
    var start = function(){
        for(var i = 0; i < Math.min(count || 1, data.length); i++){
            obj = data.shift();
            func(obj);
        }
    };
    
    return function(){
        timer = setInterval(function(){
            if(data.length === 0){
                return clearInterval(timer);
            }
            
            start();
        }, interval);
    };
}


var data= [];
for ( var i = 1; i <= 1000; i++ ){
    data.push( i );
};

renderFriendList = timeChunk(data, function(n){
    var div = document.createElement( 'div' );
    div.innerHTML = n;
    document.body.appendChild( div );
}, 200, 10);

renderFriendList();

欢迎关注进阶大前端IT圈公众号,即时获取更多前端技术,还可获取百人的前端群,里面很多知名互联网前端朋友,前端技术更新太快,不能被落伍淘汰,共同学习,共同进步!
DOM如何渲染大量千级万级数据页面也不会卡住-面试题

点赞
收藏
评论区
推荐文章
Script标签位置
不会吧,不会吧,前端人2021年了还有人把script标签放在标签中不合适了吧。是,你是可以把script放在中,但是你知道这意味着什么吗?兄嘚,意味着javascript代码都下载下来,解析和解释完成后在渲染你的页面,页面渲染延迟,浏览器窗口再次期间是空白的,大家都很忙的,兄嘚没人等你加载完啊。放在里面啊这样javascript处理之前,页面已经渲染完成了,显示空白页面的时间也就少了呀。
Chase620 Chase620
4年前
Vue面试考点准备02
10\.谈谈你对keepalive的理解是什么?keepalive是Vue提供的一个抽象组件,用来对组件进行缓存,当组件切换时不会进行销毁,从而节省性能。由于是一个抽象组件,所以在页面渲染完毕后不会被渲染成一个DOM元素。1)include定义缓存白名单,keepalive会缓存命中的组件;2)exclude定义缓存黑名单
Wesley13 Wesley13
4年前
03. react 初次见面
    与浏览器的DOM元素不同,React当中的元素事实上是普通的对象,ReactDOM可以确保浏览器DOM的数据内容与React元素保持一致。1、将元素渲染到DOM中    首先我们在一个HTML页面中添加一个id"root" 的<div:<divid"root"
Stella981 Stella981
4年前
React的虚拟DOM
上一篇文章中,DOM树的信息可以用JavaScript对象来表示,反过来,可以根据这个用JavaScript对象表示的树结构来真正构建一颗DOM树。用JavaScript对象表示DOM信息和结构,当状态变更的时候,重新渲染这个JavaScript的对象结构,当然这样做,其实并没有更新到真正的页面上。但是可以用新渲染的对象树和旧的树进行对比,记录这两棵树
Wesley13 Wesley13
4年前
UGUI 自定义滚动选择列表 ListView
列表在游戏的UI中是非常常见的,例如选服页面,商城页面,奖励页面等等都会有列表的存在。文中我们将这些列表称为ListView(类似于fgui的GList),而列表中的每项称作Item。首先我们来分析下,我们的ListView需要实现哪些功能,以及如何实现功能解决思路可以通过滑动来显示ListView中的Item可以使用UGUI的Scrol
Stella981 Stella981
4年前
Chrome之谷歌插件开发
  最近碰到一个需求,需要在某个平台上批量的添加好友,如果是人工点击,可以操作,但是效率并不高,人工成本较高.就打算使用浏览器插件的方式来完成这件重复性的工作.  介绍:    Chrome插件的本质就是一个由 manifest.json 文件和插件所需要的图片,css,html,js资源组成的一个web页面,只是和传统的web页面不同的,它是以ch
Easter79 Easter79
4年前
SwiftUI直通车系列(2)—— 列表视图
SwiftUI直通车系列(2)——列表视图  列表视图的开发中非常常用的页面元素。SwiftUI中也有专门用来渲染列表的元素提供。一、编写行视图   列表实际上是一组行视图的组合,在布局列表视图之前,你首先需要定义好行视图的布局。例如,我们使用一个Image元素和两个Tex
Stella981 Stella981
4年前
Angular最新教程
Angular之所以被称为单页面应用,就是因为我们在改变浏览器URL的时候, 不触发刷新当前页面的行为,我们看到的所有的界面,其实是在一个主URL中。 这个功能(功能?现象?表现?随便吧!)就是通过路由实现的。 下面我们先简单的看一个关于路由的例子。!(https://oscimg.oschina.net/oscnet/4e0e1
Stella981 Stella981
4年前
Javascript浏览器兼容性
JS<noscript标签早期浏览器都面临一个特殊的问题,即当浏览器不支持JavaScript时如何让页面平稳地退化。对这个问题的最终解决方案就是创造一个<noscript元素,用以在不支持JavaScript的浏览器中显示替代的内容。这个元素可以包含能够出现在文档<body中的任何HTML元素一一<scri
【万字长文】前端性能优化实践 | 京东云技术团队
从一个假死页面引发的思考:作为前端开发,除了要攻克页面难点,也要有更深的自我目标,性能优化是自我提升中很重要的一环;在前端开发中,会偶遇到页面假死的现象,是因为当js有大量计算时,会造成UI阻塞,出现界面卡顿、掉帧等情况,严重时会出现页面卡死的情况;
鸿蒙小林 鸿蒙小林
4个月前
《仿盒马》app开发技术分享-- 确认订单页(数据展示)(29)
技术栈Appgalleryconnect开发准备上一节我们实现了地址的添加,那么有了地址之后我们接下来的重点就可以放到订单生成上了,我们在购物车页面,点击结算会跳转到一个订单确认页面,在这个页面我们需要有地址选择、加购列表展示、价格计算、优惠计算、商品数量