부모에서 모든 자식 노드를 제거 하시겠습니까?


79

목록이 있는데 여기에서 모든 자식 노드를 제거하고 싶습니다. jquery를 사용하는 가장 효율적인 방법은 무엇입니까? 이것이 내가 가진 것입니다.

<ul id='foo'>
  <li>a</li>
  <li>b</li>
</ul>

var thelist = document.getElementById("foo");   
while (thelist.hasChildNodes()){
    thelist.removeChild(thelist.lastChild);
}

한 번에 하나씩 각 항목을 제거하는 대신 바로 가기가 있습니까?

----------- 편집하다 ----------------

각 목록 요소에는 일부 데이터가 첨부되어 있으며 다음과 같은 클릭 핸들러가 있습니다.

$('#foo').delegate('li', 'click', function() {
    alert('hi!');
});

// adds element to the list at runtime
function addListElement() {
    var element = $('<li>hi</hi>');
    element.data('grade', new Grade());
}

결국 목록 항목 당 버튼을 추가 할 수도 있습니다. 그래서 empty ()가 메모리 누수가 없는지 확인하는 방법 인 것처럼 보입니다.


어떤면에서 효율적입니까? 성능, 가독성?
Gumbo 2010-06-15

@Gumbo의 질문에 덧붙여서, 메모리도 얼마나 걱정됩니까? 이러한 항목에 이벤트 핸들러가 바인딩되어 있습니까?
Nick Craver

업데이트 된 대답을 감안할 때, 예 .empty()로부터 데이터를 삭제, 이동하는 방법이 될 것입니다 $.cacheelement.data('grade', new Grade());에 추가합니다.
닉 Craver

예, 데이터 바인딩이 있고 결국 이벤트 핸들러가 바인딩 될 수 있습니다 (지금은 모든 항목에 대리자를 사용하고 있습니다).
user246114

난 그냥 여기 spitballing하지만, 심지어 사용하고 @NickCraver JS을 수행 할 수 있습니다theList.innerHTML=""
존 Strood

답변:


185

당신이 사용할 수있는 .empty()것처럼, :

$("#foo").empty();

문서에서 :

DOM에서 일치하는 요소 집합의 모든 자식 노드를 제거합니다.


6
또한 주목할만한 가치가 있습니다 (문서에서) 메모리 누수를 피하기 위해 jQuery는 요소 자체를 제거하기 전에 자식 요소에서 데이터 및 이벤트 핸들러와 같은 다른 구조를 제거합니다.
user113716

1
@patrick-+1, .html('')데이터가 요소에 전혀 저장되지 않기 때문에 자주 권장되는 경로를 통해이 경로를 사용하는 또 다른 이유 는 많은 사람들이 원인이되는 누출을 잊어 버립니다.
Nick Craver

1
+1 또한 확실한 이벤트가 없다면 부모의 자녀에게 $("#foo")[0].innerHTML="";더 빠를 것입니다. 이러한 방식으로 요소를 제거 할 때 메모리 누수가 발생하지 않도록주의하십시오 ( empty()특히 IE에서 이러한 일이 발생하지 않도록 이미 많은주의를 기울였습니다).
David Murdoch

@David-이벤트는 모든 브라우저에서 문제가 될 수 있지만 좋은 점은 IE에는 다른 메모리 문제가 많이 있습니다. 이벤트는 실제로 $.cache데이터의 나머지 부분과 함께 저장 되므로 html 설정 호출로 제거되지 않습니다.
Nick Craver

1
Ok 업데이트 된 질문, 예, 각 요소와 관련된 데이터가 있으므로 empty ()가 갈 길입니다.
user246114 2010-06-15

5

다른 사용자가 제안했습니다.

.empty()

모든 하위 노드 (태그 노드 및 텍스트 노드 모두)와 해당 노드 내에 저장된 모든 종류의 데이터를 제거하기 때문에 충분합니다. JQuery의 API 빈 문서를 참조하십시오 .

예를 들어 이벤트 핸들러와 같은 데이터를 유지하려면 다음을 사용해야합니다.

.detach()

JQuery의 API 분리 문서 에 설명되어 있습니다 .

.remove () 메서드는 비슷한 목적으로 유용 할 수 있습니다.

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