我需要使用JavaScript在网格中呈现大量数据行(即数百万行)。
用户不应该看到分页或只能一次查看有限数量的数据。
相反,它应该显示所有数据都是可用的。
与其一次性下载所有数据,而是随着用户滚动网格而下载小块数据(即逐步加载)。
这些行将不会通过前端进行编辑,因此只读网格是可以接受的。
有哪些使用JavaScript编写的数据网格适用于这种无缝翻页?
我需要使用JavaScript在网格中呈现大量数据行(即数百万行)。
用户不应该看到分页或只能一次查看有限数量的数据。
相反,它应该显示所有数据都是可用的。
与其一次性下载所有数据,而是随着用户滚动网格而下载小块数据(即逐步加载)。
这些行将不会通过前端进行编辑,因此只读网格是可以接受的。
有哪些使用JavaScript编写的数据网格适用于这种无缝翻页?
(免责声明:我是SlickGrid的作者)
更新 此功能已在SlickGrid中实现。
请参见http://github.com/mleibman/SlickGrid/issues#issue/22,了解有关使SlickGrid适用于更大行数的持续讨论。
问题在于SlickGrid没有为滚动条本身提供虚拟化支持-可滚动区域的高度设置为所有行的总高度。当用户滚动时,仍会添加和删除行,但滚动本身是由浏览器完成的。这使得它非常快速且平滑(onscroll事件非常慢)。缺点是浏览器的CSS引擎存在一些限制,限制了元素的潜在高度。对于IE而言,这个限制是0x123456或1193046像素。对于其他浏览器,限制要高一些。
"largenum-fix"分支中有一种实验性的解决方法,通过将滚动区域填充为“页面”,高度设置为1M像素,并在这些页面内使用相对定位来显著提高该限制。由于CSS引擎中的高度限制似乎与实际布局引擎中的限制不同且显着较低,因此这使我们的上限要高得多。
我仍在寻找一种方法,以获得无限数量的行数,而又不放弃SlickGrid目前对其他实现所具有的性能优势。
Rudiger,您能详细说明您是如何解决这个问题的吗?
https://github.com/mleibman/SlickGrid/wiki
"SlickGrid利用虚拟渲染使您可以轻松处理数十万个项目,而不会出现任何性能下降。实际上,使用具有10行和100,000行的网格之间没有性能差异。"
一些亮点:
免费(MIT许可证)。 它使用jQuery。
data.length = Math.min(131000,parseInt(resp.total));
... 当然,那是硬编码的原因 :( - Rudiger在我看来,最好的网格如下:
在我看来,最好的三个选项是 jqGrid、jqxGrid 和 DataTables。它们可以使用数千行数据并支持虚拟化。
我并不想引发口水战,但是假设你的研究人员是人类,你并不像你想象中那样了解他们。仅仅因为他们拥有petabytes的数据并不能使他们有能力以任何有意义的方式查看甚至数百万条记录。他们可能会说他们想要看到数百万条记录,但那只是愚蠢的想法。让你最聪明的研究员做一些基本的计算:假设他们花费1秒钟查看每个记录。以这种速率,需要1000000秒,相当于超过六周(每周40小时工作时间,没有吃饭或上洗手间的休息时间)。
他们(或者你)真的认为一个人(查看网格的人)能够集中精力做到那样的事情吗?他们在那1秒钟内确实能完成很多工作吗,还是(更有可能)把他们不想要的东西筛选掉了?我怀疑在查看“合理大小”的子集之后,他们可以向你描述一个自动过滤掉那些记录的过滤器。
正如paxdiablo、Sleeper Smith和Lasse V Karlsen所暗示的那样,你(和他们)还没有深入思考这些要求。好的一面是,现在你已经找到了SlickGrid,我相信对于那些过滤器的需求立即变得明显。
我可以非常肯定地说,你不需要向用户展示成百万行的数据。
全世界没有一个用户能够理解或者管理那么多的数据集,即使你在技术上成功实现了这一点,也不能解决用户已知的任何问题。
相反,我建议关注用户为什么想要看到这些数据。用户不会只是为了看数据而看数据,通常都是在寻求特定问题的答案。如果你专注于回答这些问题,就能更接近解决实际问题的目标。
(免责声明:我是w2ui的作者)
最近,我撰写了一篇关于如何使用JavaScript网格处理100万条记录的文章 (http://w2ui.com/web/blog/7/JavaScript-Grid-with-One-Million-Records)。我发现最终有3个限制阻止了它的进一步提高:
我已经测试过拥有100万条记录的网格(IE除外),表现良好。请查看文章以获取演示和示例。
dojox.grid.DataGrid提供了JS数据抽象,因此您可以使用提供的dojo.data存储库将其连接到各种后端或编写自己的存储库。显然,您需要一个支持随机访问这么多记录的存储库。DataGrid还提供了完整的可访问性。
编辑:这里有一个链接到Matthew Russell的文章,它应该提供您所需的示例,使用dojox.grid查看数百万条记录。请注意,它使用旧版本的网格,但概念是相同的,只是存在一些不兼容的API改进。
哦,而且它是完全免费开源的。
以下是可以应用的一些优化方法,可以加快速度。只是随便想想。
由于行数可能达到数百万,因此您需要一个缓存系统,专门针对来自服务器的JSON数据。我无法想象有人想要下载所有X百万项,但如果他们这样做,那将是一个问题。这个小测试在Chrome上对于一个包含20M+整数的数组会不断地崩溃。
var data = [];
for(var i = 0; i < 20000000; i++) {
data.push(i);
}
console.log(data.length);
起始行≈(scroll.top/5000)*10M
,其中scroll.top
表示从容器顶部滚动的距离。这里有一个小演示。我使用了jQuery网格插件,它很好用。