我使用tablesorter Jquery插件对我的表进行排序。当表的大小小于500行时,正常工作。当表中的行数超过2K或3K时,表页加载变得非常缓慢,而且对于基于表数据的后续筛选器来说,当我键入筛选框时,页面会停止2-7秒。几秒钟后,经过筛选的值,页面将恢复正常。这是TableSorter插件的正常行为还是与我的代码有关的行为?有什么改善这一滞后的建议吗?
发布于 2013-10-10 01:47:13
由于大量(2K到3K行) DOM操作,性能下降。
为了提高性能,我可以看到以下的可能性。
最小化DOM操作/访问
DOM操作/访问总是很昂贵的。所以,尽量减少。
在TableSorter代码中,没有限制的-第337号行:
for (var i = 0; i < totalRows; i++) {
var pos = n[i][checkCell];
rows.push(r[pos]);
if (!table.config.appender) {
var l = r[pos].length;
for (var j = 0; j < l; j++) {
tableBody[0].appendChild(r[pos][j]);
}
}
}
在上面的代码中,有两个嵌套的for循环。假设我们有2K行,并且设置了table.config.appender
。在最坏的情况下,appendChild
运行的次数可能超过2K X 500
的次数?
这只是一个例子。在这里,不要在每次迭代中追加子字符串,而是获取行字符串并连接到结果字符串中。在所有迭代之后,替换表中的文本。在这种情况下,我们只访问DOM一次。只有当单元格中只有文本而没有绑定在单个单元格文本/元素上的事件时,这才能起作用。(即使我们想绑定单元格文本/元素上的事件,也有更好的方法)。
但这需要修改TableSorter插件。
现代浏览器中的网络工作者
运行JavaScript时,UI会冻结。因此,在我们的情况下,由于我们有大量的数据,肯定需要一些值得注意的时间来处理。如果我们将此数据处理移到其他线程(或同时运行而不阻塞UI),则会更好。
为此,我们可以使用Web Workers
,并且在旧浏览器中不支持它。
那么,TableSorter是如何工作的?一旦加载了表,它将缓存所有数据。当然,它不会仅仅为了获取数据而对每一行进行迭代。一旦触发任何筛选器,它将开始处理数据以对行进行排序。此处理可以移动到Web工作人员,它将取消对UI的冻结。当这起作用时我们可以展示一些美丽的过滤。消息,同时,用户可以玩其他的元素。
我们可以检测当前浏览器是否支持Web Workers
。如果是,那么我们可以在一个新线程中处理数据。
但这需要修改TableSorter插件。
使用数据库服务器
如果我们从数据库中提取数据并将其显示在前端的表中,如果我们有大量的数据,我们最好让服务器从数据库中获取已排序的数据,并使用AJAX调用显示。
相信我,数据库服务器非常适合做这些事情。此外,在执行AJAX调用时,我们可以显示一些处理,并且UI不会被冻结。
这需要服务器端编程。
这就是我所想的。也许我更喜欢使用以上三种方法。我尽可能地减少DOM操作/访问。我在现代浏览器中使用Workers。在较旧的浏览器中,我依赖于数据库服务器。当然,这将需要一些时间来实现。
https://stackoverflow.com/questions/19285157
复制相似问题