jquery-매우 큰 테이블에서 모든 행을 제거하는 가장 빠른 방법


93

매우 큰 테이블 (3000 행)의 내용을 제거하는 빠른 방법이라고 생각했습니다.

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

하지만 파이어 폭스에서 완료하는 데 약 5 초가 걸립니다. 내가 멍청한 일을하고 있습니까 (브라우저에 3000 행을로드하는 것 외에)? 더 빠른 방법이 있습니까?

답변:


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

그것은 당신이 얻는 것만 큼 빠릅니다.


흠. 실망 스럽네요. 삭제가 삽입보다 훨씬 빠르다고 생각합니다. 일종의 나는 테이블을 숨기고 업데이트하고 싶을 때 새 테이블을 만드는 것과 같은 정말 추악한 일을하고 싶습니다.
morgancodes 2009

10
예, 글쎄요 ... HTML은 페이지에 3k 행을 표시하도록 만들어지지 않았습니다. :) 페이지가 매겨진 솔루션을 생각할 수 없습니까? 그것은 훨씬 더 빨리 만들 것입니다. 물론 더 많은 작업이 필요하지만 훨씬 더 풍부한 사용자 경험이 될 것입니다.
Seb

7
이것은 좋습니다. 문제는 테이블 헤더도 제거된다는 것입니다.
ISURU

2
헤더 :( 제거
하기 Sandeep Kushwah

4
헤더를 포함하여 테이블의 모든 항목이 제거됩니다. @morgancodes가 헤더가 아닌 행 (일명 행)을 제거하기를 원한다고 가정합니다. 나중에 이것을 발견하는 사람들에게는 해결책이 될 것입니다 $('#mytable tbody').empty();. 이렇게하면 tbody 만 비워집니다.
OmniOwl

82

모든 종류의 루프를 피하는 것이 좋습니다. 다음과 같이 모든 요소를 ​​직접 제거하십시오.

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

6
html("")empty()내부 전화
Emile Bergeron

8
테이블 헤더를 제거하지 않기 때문에 나에게 좋은 솔루션입니다. 감사합니다!
Daria

@Daria는 선택기를 최대한 사용하면 헤더가 제자리에 유지됩니다. $ ( 'table tbody'). empty ();
대니

( "#mytable> tbody")와 ( "#mytable tbody") 사용의 차이점은 무엇입니까?
eaglei22

1
테이블 행에 중첩 된 테이블이있는 경우 해당 tbody 태그도 제거됩니다. 테이블이 하나만 있다면 그다지 다르지 않습니다.
Shiroy

6

분리를 사용하면 여기에있는 다른 답변보다 훨씬 빠릅니다.

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

detach가 제거되었으므로 tbody 요소를 테이블에 다시 넣는 것을 잊지 마십시오.

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

또한 효율성 $(target).find(child)구문을 말할 때 $(target > child). 왜? 타는 듯이 덥다!

3,161 개의 테이블 행을 비우는 데 경과 된 시간

Detach () 메서드 사용 (위의 예에서 볼 수 있음) :

  • Firefox : 0.027 초
  • 크롬 : 0.027 초
  • 가장자리 : 1.73s
  • IE11 : 4.02 초

empty () 메서드 사용 :

  • Firefox : 0.055 초
  • 크롬 : 0.052s
  • Edge : 137.99s (동결 될 수도 있음)
  • IE11 : 정지하고 반환되지 않음


3

여기서 볼 수있는 두 가지 문제 :

  1. jQuery의 empty () 및 remove () 메소드는 실제로 상당한 작업을 수행합니다. 이유는 John Resig의 JavaScript 함수 호출 프로파일 링 을 참조하십시오 .

  2. 다른 한 가지는 많은 양의 테이블 형식 데이터의 경우 우수한 DataTables 와 같은 데이터 그리드 라이브러리 를 사용하여 서버에서 데이터를 즉시로드하여 네트워크 호출 수를 늘리지 만 해당 호출의 크기를 줄일 수 있다는 것입니다. 나는 1500 개의 행이있는 매우 복잡한 테이블을 가지고있어서 상당히 느려서 새로운 AJAX 기반 테이블로 변경하면 동일한 데이터가 다소 빨라 보입니다.


감사합니다 artlung. 실제로 그런 식으로 서버에서 모든 데이터를 한 번에 가져 오지만 필요할 때만 테이블 행을 그립니다.
morgancodes 2009

좋은 전화 같네요. 브라우저에서 테이블의 행 수에 대해 걱정하는 것이 항상 문제가 될지, 아니면 대부분의 컴퓨터의 메모리가 증가함에 따라 문제가되지 않는지 궁금합니다.
artlung 2009

메모리는 내가로드하는 데이터의 양에 문제가되지 않습니다. 보틀 넥은 DOM 조작입니다.
morgancodes 2009

나는 우리가 같은 말을하고 있다고 생각합니다. 더 많은 데이터를로드할수록 더 많은 DOM 노드를로드 할 수 있습니다. 이러한 노드는 필요한 메모리 측면에서 관련됩니다. 어쨌든 상황이 나아 졌기를 바랍니다.
artlung 2009

1

빨리 제거하고 싶다면 .. 아래와 같이 할 수 있습니다 ..

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

그러나 테이블에 이벤트 바인딩 요소가있을 수 있습니다.

이 경우

위의 코드는 IE에서 메모리 누수를 방지하지 않습니다 ... TT 및 FF에서 빠르지 않습니다 ...

죄송합니다....


0

이것은 나를 위해 작동합니다.

1- 각 행 "removeRow"에 대한 클래스 추가

2- jQuery에서

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

-2

시도해 볼 수 있습니다 ...

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);
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.