jquery - cách nhanh nhất để xóa tất cả các hàng khỏi một bảng rất lớn


93

Tôi nghĩ đây có thể là một cách nhanh chóng để xóa nội dung của một bảng rất lớn (3000 hàng):

$jq("tbody", myTable).remove();

Nhưng mất khoảng năm giây để hoàn thành trong firefox. Tôi đang làm gì đó ngu ngốc (ngoài việc cố gắng tải 3000 hàng vào trình duyệt)? Có cách nào nhanh hơn để làm điều đó không?

Câu trả lời:


211
$("#your-table-id").empty();

Đó là nhanh như bạn nhận được.


Hừ! Bực bội. Tôi nghĩ rằng việc xóa sẽ nhanh hơn nhiều so với việc chèn. Loại này khiến tôi muốn làm những thứ thực sự xấu xí như chỉ ẩn bảng và tạo một bảng mới khi tôi muốn cập nhật nó.
morgancodes

10
Vâng, tốt ... HTML không được tạo ra để hiển thị 3k hàng trong một trang :) Bạn không thể nghĩ ra bất kỳ giải pháp phân trang nào? Điều đó sẽ làm cho nó nhanh hơn nhiều. Chắc chắn nó sẽ đòi hỏi nhiều công việc hơn, nhưng nó sẽ là một trải nghiệm người dùng phong phú hơn nhiều.
Seb

7
Cái này tốt. Vấn đề là điều này cũng sẽ loại bỏ các tiêu đề bảng.
isuru

2
xóa tiêu đề :(
Sandeep Kushwah

4
Thao tác này sẽ xóa mọi thứ trong bảng, bao gồm cả tiêu đề. Tôi giả sử rằng @morgancodes muốn xóa nội dung, hay còn gọi là các hàng, không phải tiêu đề. Đối với những người tìm thấy điều này sau này, giải pháp sẽ là $('#mytable tbody').empty();. Điều này đảm bảo rằng chỉ có người được làm trống.
OmniOwl

81

Tốt hơn là tránh bất kỳ loại vòng lặp nào, chỉ cần loại bỏ tất cả các phần tử trực tiếp như sau:

$("#mytable > tbody").html("");

6
html("")gọi empty()nội bộ
Emile Bergeron

8
Giải pháp tốt cho tôi vì nó không loại bỏ tiêu đề của một bảng. Cảm ơn bạn!
Daria

@Daria sử dụng tối đa các bộ chọn, điều này sẽ giữ cho tiêu đề của bạn ở đúng vị trí: $ ('table tbody'). Blank ();
Dani

sự khác nhau giữa việc sử dụng ("#mytable> tbody") và ("#mytable tbody").
Eaglei 22

1
Nếu bạn có một bảng lồng nhau trong một hàng của bảng, nó cũng sẽ xóa các thẻ tbody đó. Nếu bạn chỉ có một bảng duy nhất, nó sẽ không khác nhiều.
Shiroy

6

Sử dụng detach nhanh hơn bất kỳ câu trả lời nào khác ở đây:

$('#mytable').find('tbody').detach();

Đừng quên đặt lại phần tử tbody vào bảng vì detach đã xóa nó:

$('#mytable').append($('<tbody>'));  

Cũng lưu ý rằng khi nói $(target).find(child)cú pháp hiệu quả nhanh hơn $(target > child). Tại sao? Xông khói!

Thời gian đã trôi qua để trống 3.161 dòng trong bảng

Sử dụng phương thức Detach () (như trong ví dụ của tôi ở trên):

  • Firefox: 0,027 giây
  • Chrome: 0,027 giây
  • Cạnh: 1,73 giây
  • IE11: 4.02 giây

Sử dụng phương thức rỗng ():

  • Firefox: 0,055 giây
  • Chrome: 0,052 giây
  • Cạnh: 137,99 giây (cũng có thể bị đóng băng)
  • IE11: Đóng băng và không bao giờ quay trở lại


3

Hai vấn đề tôi có thể thấy ở đây:

  1. Các phương thức void () và remove () của jQuery thực sự thực hiện khá nhiều công việc. Xem Hồ sơ cuộc gọi hàm JavaScript của John Resig để biết lý do.

  2. Điều khác là đối với một lượng lớn dữ liệu dạng bảng, bạn có thể xem xét một thư viện datagrid như DataTables tuyệt vời để tải dữ liệu của bạn ngay lập tức từ máy chủ, tăng số lượng cuộc gọi mạng nhưng giảm kích thước của các cuộc gọi đó. Tôi có một bảng rất phức tạp với 1500 hàng khá chậm, việc thay đổi sang bảng dựa trên AJAX mới khiến dữ liệu tương tự này có vẻ khá nhanh.


Cảm ơn artlung. Trên thực tế, làm một cái gì đó giống như vậy, lấy tất cả dữ liệu cùng một lúc từ máy chủ, nhưng chỉ vẽ các hàng của bảng khi cần thiết.
morgancodes

Nghe có vẻ là một cuộc gọi tốt. Tôi đang tự hỏi liệu lo lắng về số lượng hàng trong bảng trong trình duyệt sẽ luôn là một vấn đề hay nếu bộ nhớ cho hầu hết các máy tính tăng lên thì điều này sẽ ít là vấn đề hơn.
artlung

Bộ nhớ không thành vấn đề với lượng dữ liệu tôi đang tải. Điểm mấu chốt là thao túng DOM.
morgancodes

Tôi nghĩ chúng ta đang nói điều tương tự. Bạn càng tải nhiều dữ liệu, bạn càng tải nhiều nút DOM, đối với tôi, chúng liên quan đến bộ nhớ cần thiết. Tôi hy vọng tình hình của bạn đã được cải thiện, bất kể.
artlung

1

nếu bạn chỉ muốn loại bỏ nhanh chóng .. bạn có thể làm như dưới đây ..

$( "#tableId tbody tr" ).each( function(){
  this.parentNode.removeChild( this ); 
});

nhưng, có thể có một số phần tử liên kết sự kiện trong bảng,

trong trường hợp đó,

mã trên không ngăn chặn rò rỉ bộ nhớ trong IE ... TT và không nhanh trong FF ...

lấy làm tiếc....


0

cái này phù hợp với tôi:

1- thêm lớp cho mỗi hàng "removeRow"

2- trong jQuery

$(".removeRow").remove();

-2

Bạn có thể thử điều này ...

var myTable= document.getElementById("myTable");
if(myTable== null)
    return;
var oTBody = myTable.getElementsByTagName("TBODY")[0];
if(oTBody== null)
    return;
try
{
    oTBody.innerHTML = "";
}
catch(e)
{
    for(var i=0, j=myTable.rows.length; i<j; i++)
        myTable.deleteRow(0);
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.