有一位同事跟大家说他在网上看到一道面试题:“如果后台传给前端几万条数据,前端怎么渲染到页面上?”,如何回答? 于是办公室沸腾了, 同事们讨论开了, 你一言我一语说出自己的方案。 有的说直接循环遍历生成html页面上;有的说应该用分页来处理;通过DOM操作到页面,势必导致页面运行出现卡顿, 为此我还特意写了一个 demo测试了一下, 代码如下

$.get("data.json", function (response) {
//response里大概有13万条数据
loadAll( response );
});
function loadAll(response) {
var html = "";
for (var i = 0; i < response.length; i++) {
var item = response[i];
html += "<li>title:" + item.title + " content:" + item.content + "</li>";
}
$("#content").html(html);
}
data.json中大概有13万条数据左右, 通过ajax获取数据后以最简单粗暴的方法展示数据,在chrome浏览器下, 刷新页面到数据显示,我心中默数, 整个过程大概花掉5秒钟左右的时间, 卡顿非常明显。 我大致观察了一下代码的运行时间,发现循环生成字符串这过程其实并不算太耗时, 性能瓶颈是在将html字符串到文档中这个过程上, 也就是 $("#content").html(html); 这句代码的执行, 毕竟有13万个li元素要被挺入到文档里面, 页面渲染速度缓慢也在情理之中。
既然一次渲染13万条数据会造成页面加载速度缓慢,那么我们可以不要一次性渲染这么多数据,而是分批次渲染, 比如一次10000条,分13次来完成, 这样或许会对页面的渲染速度有提升。 然而,如果这13次操作在同一个代码执行流程中运行,那似乎不但无法解决糟糕的页面卡顿问题,反而会将代码复杂化。 类似的问题在其它语言最佳的解决方案是使用多线程,JavaScript虽然没有多线程,但是setTimeout和setInterval两个函数却能起到和多线程差不多的效果。 因此,要解决这个问题, 其中的setTimeout便可以大显身手。 setTimeout函数的功能可以看作是在指定时间之后启动一个新的线程来完成任务。
$.get("data.json", function (response) {
//response里大概有13万条数据
loadAll( response );
});
function loadAll(response) {
//将13万条数据分组, 每组500条,一共260组
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 += "<li>title:" + item.title + index + " content:" + item.content + index + "</li>";
}
//保证顺序不错乱
while (index - currIndex == 1) {
$("#content").append(html);
currIndex = index;
}
}
以上代码大致的执行流程是
1. 用ajax获取到需要处理的数据, 共13万条
2. 将数组分组,每组500条,一共260组
3. 循环这260组数据,分别处理每一组数据, 利用setTimeout函数开启一个新的执行线程(异步),防止主线程因渲染大量数据导致阻塞。
loadPart函数中有这段代码
while (index - currIndex == 1) {
$("#content").append(html);
currIndex = index;
}
通过这种方式执行, 页面瞬间就刷出来了,不用丝毫等待时间。 从同步改为异步,虽然代码的整体资源消耗增加了, 但是页面却能瞬间响应, 而且, 前端的运行环境是用户的电脑,因此些许的性能损失带来的用户体验提升相对来说还是值得的。
虽然示例中提到的情况在现实环境中几乎不可能出现, 但是在我们平时的工作中总会有一些似是而非的场景出现, 利用里面的处理思路, 或许对我们解决问题会有一定的帮助。
ps:setTimeout并不算真正的多线程, 但是为了方便表达,便借用了线程一词
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持!
# javascript 数据 展示
# 是在
# 多线程
# 的说
# 每组
# 来完成
# 却能
# 自己的
# 并不算
# 加载
# 瞬间
# 文档
# 运行环境
# 我还
# 也在
# 这么多
# 遍历
# 中有
# 大显身手
# 开了
# 有一定
相关文章:
建站之星云端配置指南:模板选择与SEO优化一键生成
公司网站的制作公司,企业网站制作基本流程有哪些?
南京网站制作费用,南京远驱官方网站?
如何选择长沙网站建站模板?H5响应式与品牌定制哪个更优?
javascript基本数据类型及类型检测常用方法小结
如何在Golang中使用replace替换模块_指定本地或远程路径
如何在香港服务器上快速搭建免备案网站?
建站之星在线版空间:自助建站+智能模板一键生成方案
洛阳网站制作公司有哪些,洛阳的招聘网站都有哪些?
如何快速搭建高效WAP手机网站?
制作销售网站教学视频,销售网站有哪些?
临沂网站制作企业,临沂第三中学官方网站?
C#怎么创建控制台应用 C# Console App项目创建方法
宝塔新建站点为何无法访问?如何排查?
如何快速上传建站程序避免常见错误?
网站制作员失业,怎样查看自己网站的注册者?
非常酷的网站设计制作软件,酷培ai教育官方网站?
如何通过西部建站助手安装IIS服务器?
网站制作公司,橙子建站是合法的吗?
想学网站制作怎么学,建立一个网站要花费多少?
大连网站制作费用,大连新青年网站,五年四班里的视频怎样下载啊?
头像制作网站在线制作软件,dw网页背景图像怎么设置?
如何快速生成高效建站系统源代码?
建站VPS推荐:2025年高性能服务器配置指南
如何在Windows环境下新建FTP站点并设置权限?
关于BootStrap modal 在IOS9中不能弹出的解决方法(IOS 9 bootstrap modal ios 9 noticework)
建站之星下载版如何获取与安装?
手机怎么制作网站教程步骤,手机怎么做自己的网页链接?
动图在线制作网站有哪些,滑动动图图集怎么做?
如何通过cPanel快速搭建网站?
如何通过智能用户系统一键生成高效建站方案?
制作网站哪家好,cc、.co、.cm哪个域名更适合做网站?
如何登录建站主机?访问步骤全解析
赚钱网站制作软件,建一个网站怎样才能赚钱?是如何盈利的?
如何选择建站程序?包含哪些必备功能与类型?
如何设计高效校园网站?
建站主机服务器选购指南:轻量应用与VPS配置解析
建站之星如何助力网站排名飙升?揭秘高效技巧
如何选择域名并搭建高效网站?
如何用PHP工具快速搭建高效网站?
网站建设制作需要多少钱费用,自己做一个网站要多少钱,模板一般多少钱?
如何选择适合PHP云建站的开源框架?
如何用花生壳三步快速搭建专属网站?
平台云上自主建站:模板化设计与智能工具打造高效网站
如何批量查询域名的建站时间记录?
建站主机选择指南:服务器配置与SEO优化实战技巧
如何用好域名打造高点击率的自主建站?
电视网站制作tvbox接口,云海电视怎样自定义添加电视源?
如何在建站宝盒中设置产品搜索功能?
网站代码制作软件有哪些,如何生成自己网站的代码?
*请认真填写需求信息,我们会在24小时内与您取得联系。