Powiedzmy, że definiuję element
$foo = $('#foo');
a potem dzwonię
$foo.remove()
z jakiegoś wydarzenia. Moje pytanie brzmi, jak sprawdzić, czy $ foo zostało usunięte z DOM, czy nie? Przekonałem się, że to $foo.is(':hidden')
działa, ale to oczywiście zwróci prawdę, gdybym tylko zadzwonił $foo.hide()
.
$foo.closest(document.documentElement)
jest szybsze (jeśli kogoś to obchodzi jsperf.com/jquery-element-in-dom )$.contains(document.documentElement, $foo.get(0))
to najszybszy sposób.document.contains($foo[0])
Co powiesz na to:
źródło
Właśnie zrozumiałem odpowiedź, kiedy pisałem swoje pytanie: Zadzwoń
Jeśli
$f00
został usunięty z DOM, to$foo.parent().length === 0
. W przeciwnym razie jego długość będzie wynosić co najmniej 1.[Edycja: Nie jest to całkowicie poprawne, ponieważ usunięty element może nadal mieć rodzica; na przykład, jeśli usuniesz a
<ul>
, każde z jego dzieci<li>
nadal będzie miało rodzica. Zamiast tego użyj odpowiedzi SLaków.źródło
$foo
został usunięty z DOM. Jeśli zostanie pomyślnie usunięty, nie będzie już miał elementu nadrzędnego. Oznacza$foo.parent().length === 0
to, że usunięcie powiodło się.Ponieważ nie mogę odpowiedzieć jako komentarz (wydaje mi się, że jest to zbyt niska karma), oto pełna odpowiedź. Najszybszym sposobem jest łatwe rozwinięcie sprawdzania jQuery pod kątem obsługi przeglądarki i ograniczenie stałych współczynników do minimum.
Jak widać również tutaj - http://jsperf.com/jquery-element-in-dom/28 - kod wyglądałby tak:
Jest to semantyczne odpowiednik jQuery.contains (document.documentElement, elt [0]).
źródło
Prawdopodobnie najbardziej performatywny sposób to:
Działa to również z jQuery:
Źródło z MDN
źródło
Podobało mi się to podejście. Bez jQuery i bez wyszukiwania DOM. Najpierw znajdź najwyższego rodzica (przodka). Następnie sprawdź, czy to jest documentElement.
źródło
zamiast iterować rodziców, możesz po prostu uzyskać prostokąt ograniczający, który składa się z samych zer, gdy element jest odłączany od domeny
jeśli chcesz obsłużyć skrajny przypadek elementu o zerowej szerokości i wysokości na zero na górze i zero po lewej stronie, możesz dwukrotnie sprawdzić, iterując rodziców aż do dokumentu. body
źródło
display: none
bez ograniczeńRectZgadzam się z komentarzem Perro. Można to również zrobić w ten sposób:
źródło
źródło
Dlaczego nie tylko
if( $('#foo').length === 0)...
:?źródło
$foo
i sprawdzenie, czy ponowne zapytanie pasowało do dowolnego elementu, wydaje się realnym rozwiązaniem problemu w wielu scenariuszach. Może to być nawet szybsze niż niektóre inne rozwiązania ze względu na to, jak zarówno jQuery, jak i przeglądarki optymalizują niektóre selektory (na przykład według identyfikatora).źródło