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?


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.


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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.