我正在使用 ajax 调用来获取 json 数据。数据包含大小为 10000 的数组。
data.LocationQuality.forEach(function(datum){
}
我正在使用这个循环遍历所有元素并创建 tr 并使用基准填充所有 td。
我面临的问题是由于大量数据。循环需要大量时间,最终浏览器显示没有响应,我必须终止页面。
如何解决这个问题呢?
我正在使用 ajax 调用来获取 json 数据。数据包含大小为 10000 的数组。
data.LocationQuality.forEach(function(datum){
}
我正在使用这个循环遍历所有元素并创建 tr 并使用基准填充所有 td。
我面临的问题是由于大量数据。循环需要大量时间,最终浏览器显示没有响应,我必须终止页面。
如何解决这个问题呢?
这里有几件事要说。
首先,如前所述,分页肯定是最好的解决方案。在内存中保留 10000 行对于现在的浏览器来说不是问题,但是在表中显示 10000 行通常确实需要很长时间。例如,一次只显示 20 行,速度要慢得多。
像 jqGrid 这样的解决方案不需要 ajax(但确实支持它)。您可以加载一次数据,网格会将数据保存在内存中,并且一次只显示多个项目,并带有导航按钮来翻阅页面。
你可以在这里得到它:http ://www.trirand.com/blog/?page_id=6
其次,关于 dom 应该说点什么。我希望您目前正在向 dom 添加一行 10000 次。这比在内存中构建表,然后一步添加一张 10000 行的表要慢得多。它仍然会很慢,但不会像多次访问 dom 那样慢。
所以而不是
$.each(data, function (index, row) {
$('#yourTable').append('your row definition'); // hitting the dom for each row
}
改为这样做
var table = $('<table></table>');
$.each(data, function (index, row) {
table.append('your row definition'); // adding it to the table in memory
}
$('#yourTable').replace(table); // hit the dom once
您在显示大量数据时遇到问题,并且无法在多个查询中获取数据?
因此,在一次调用中获取所有数据,解析它们并放入数组中,并使用该“本地”数组进行分页。
无需从服务器请求数据进行分页,只需从“本地”数组获取数据。
没有代码,这是在黑暗中刺伤:
1:优化你的页面创建循环。DOM 操作非常慢——你可以通过不同的方式来改进它们
2:一点一点下载你的数据。当用户滚动您的页面时,再进行一次 AJAX 调用以获取下一部分数据。
3:下载所有数据,但一次只渲染一个页面。
它允许您创建 DOM 的大部分而不添加它们。这样您就可以一次构建表格并将其附加到 DOM 中,应该比一直附加行快得多