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.