是否可以在不冻结浏览器的情况下对 HTML 表格进行排序?

发布于 2025-01-03 21:29:28 字数 240 浏览 0 评论 0原文

我编写了一个网页,其中包含一个包含数百行的 HTML 表。我使用 JavaScript 对页面进行了编程,以便用户可以单击任何列顶部的标题来按该列对表格进行排序。

效果很好,但需要一点时间,因为行太多。我使用 JavaScript array.sort 方法对基础数据进行排序,然后使用该方法将数据行写入页面。

问题是,当用户单击标题时,浏览器会冻结,直到操作完成。有没有办法对我的页面进行编程,以便在对表格进行排序时浏览器不会冻结?

I've written a web page with an HTML table that contains hundreds of rows. I've programmed my page with JavaScript so that the user may click on the header at the top of any column to sort the table by that column.

It works well, but it takes a little while because there are so many rows. I am using the JavaScript array.sort method to sort the underlying data which is then used to write the rows of data to the page.

The problem is that when the user clicks on a header, the browser freezes until the operation is complete. Is there someway to program my page so that the browser does not freeze while the table is being sorted?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

空城旧梦 2025-01-10 21:29:28

您最好的选择可能是使用现有的 HTML 表格/网格小部件库,它可能已经解决了这个问题。毫无疑问,通过搜索网络可以找到很多。

您可以通过 Ajax 请求在服务器上完成繁重的项目(例如排序),并简单地将现有 DOM 表元素替换为服务器排序处理程序返回的元素。

您也可以编写自己的排序函数,根据需要将控制权交还给浏览器 UI 线程(例如,通过将排序算法从其自然循环分解为使用 setTimeoutsetInterval 控制的循环)。

Your best bet is probably to use an existing HTML table/grid widget library which has presumably already solved this problem. No doubt many can be found by searching the web.

You could do the heavy-lifting (e.g. sorting) of items on the server via an Ajax request and simply replace the existing DOM table element with the one returned by the server sorting handler.

You could also probably write your own sort function which yields control back to the browser UI thread as appropriate (e.g. by decomposing the sort algorithm from its natural loop into a loop controlled by using setTimeout or setInterval).

绾颜 2025-01-10 21:29:28

如果在您的情况下对表进行排序是一项非常繁重的操作,那么我建议使用 AJAX 进行服务器端排序,或者看看这个新玩具 HTML 5 Web Worker。浏览器是单线程的,因此 UI 线程应该无响应,因为每次代码在客户端执行一些昂贵的操作(未包装在非阻塞回调方法中)时,它都会被阻塞。

Web Worker 的问题在于它并未在所有浏览器中得到广泛支持。但它的作用是将昂贵的客户端 js 计算外包给另一个后台工作人员,同时 UI 线程保持响应。

If sorting the table in your case is a really heavy operation, then I suggest do a server side sorting using AJAX, OR take a look at this new toy HTML 5 web worker. Browser is single-threaded, so the UI thread should be unresponsive because it is blocked everytime your code does some expensive operation on client-side that is not wrapped inside a nonblocking callback method.

The problem with web worker is that it isn't widely supported in all browser. but what it does is it outsource the expensive client side js computation to another background worker while UI thread remains responsive.

捎一片雪花 2025-01-10 21:29:28

实现此目的的一种方法是使用 ajax 在服务器端对项目进行排序。

<div id="tableContainer">
   <table>...</table>
</div>

$.ajax({
   url: "/sort"
   data: {items:items, sortField:"id"},
   dataType:"html",
   success: function(sortedTable){
      $("#tableContainer").html(sortedTable);
   }
}

One way to accomplish this is to do serverside sorting of the items using ajax.

<div id="tableContainer">
   <table>...</table>
</div>

$.ajax({
   url: "/sort"
   data: {items:items, sortField:"id"},
   dataType:"html",
   success: function(sortedTable){
      $("#tableContainer").html(sortedTable);
   }
}
栩栩如生 2025-01-10 21:29:28

浏览器“冻结”是因为不断地重新绘制页面 - 只需重新绘制一次即可。

您可以显示:无表,对其进行排序,然后再次显示。

或者,您可以在屏幕外构建一个新的排序表,并用排序版本替换现有表。

The browser 'freeze' is because of constantly redrawing the page- just re-draw it once.

You can display:none the table, sort it, and then display it again.

Or you can build a new sorted table offscreen and replace the existing table with the sorted version.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文