Usunąć wszystkie węzły podrzędne od rodzica?

79

Mam listę, chcę tylko usunąć z niej wszystkie węzły potomne. Jaki jest najskuteczniejszy sposób korzystania z jquery? Oto co mam:

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

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

czy istnieje skrót, zamiast usuwać każdą pozycję pojedynczo?

----------- Edytować ----------------

Każdy element listy ma dołączone dane i moduł obsługi kliknięć, taki jak ten:

$('#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());
}

w końcu mógłbym dodać przyciski również do każdego elementu listy - więc wygląda na to, że pusty () jest drogą do zrobienia, aby upewnić się, że nie ma wycieków pamięci?

user246114
źródło
Skuteczny pod jakim względem? Wydajność, czytelność?
Gumbo
Dodając do pytań @ Gumbo, jak bardzo niepokojąca jest również pamięć? Czy te elementy mają powiązane programy obsługi zdarzeń?
Nick Craver
Biorąc pod uwagę zaktualizowane odpowiedź, tak .empty()będzie do zrobienia, aby usunąć dane z $.cachektóry element.data('grade', new Grade());dodaje w.
Nick Craver
Tak, istnieje powiązanie z danymi i ostatecznie mogą być powiązane programy obsługi zdarzeń (w tej chwili używam tylko delegata dla wszystkich elementów).
user246114
@NickCraver Po prostu się tu bawię, ale nawet używając JS, możesz to zrobićtheList.innerHTML=""
John Strood

Odpowiedzi:

185

Można użyć .empty(), podobnie jak to :

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

Z dokumentów :

Usuń wszystkie węzły potomne zestawu dopasowanych elementów z DOM.

Nick Craver
źródło
6
Warto również zauważyć (z dokumentacji) Aby uniknąć wycieków pamięci, jQuery usuwa inne konstrukcje, takie jak programy obsługi danych i zdarzeń, z elementów potomnych przed usunięciem samych elementów.
user113716
1
@patrick - +1, kolejny powód, aby przejść tę trasę przez często zalecane .html(''), ponieważ dane nie są w ogóle przechowywane w elemencie, wiele osób zapomina o wycieku, który powoduje.
Nick Craver
1
+1 Ponadto, jeśli jesteś pewien, że żadne wydarzenia nie zostały powiązane z dziećmi rodzica, $("#foo")[0].innerHTML="";będzie to szybsze. Po prostu uważaj, aby nie spowodować wycieków pamięci podczas usuwania elementów w ten sposób ( empty()już bardzo się stara, aby tak się nie stało, szczególnie w IE).
David Murdoch
@David - zdarzenia byłyby problemem we wszystkich przeglądarkach, ale dobra uwaga, IE ma inne problemy z pamięcią, wiele z nich. Ponieważ zdarzenia są w rzeczywistości przechowywane $.cachewraz z resztą danych, nie zostałyby one usunięte za pomocą wywołań ustawień HTML.
Nick Craver
1
Ok, zaktualizowane pytanie, tak, mam pewne dane powiązane z każdym elementem, więc wygląda na to, że pusty () jest drogą do zrobienia.
user246114
5

Inni użytkownicy zasugerowali,

.empty()

jest wystarczająco dobry, ponieważ usuwa wszystkie węzły potomne (zarówno węzły znaczników, jak i węzły tekstowe) ORAZ wszelkiego rodzaju dane przechowywane w tych węzłach. Zobacz pustą dokumentację interfejsu API JQuery .

Jeśli chcesz zachować dane, takie jak na przykład programy obsługi zdarzeń, powinieneś użyć

.detach()

zgodnie z opisem w dokumentacji odłączania interfejsu API JQuery .

Metoda .remove () może być przydatna do podobnych celów.

Marco Ottina
źródło