Jak testujesz element pod kątem istnienia bez użycia getElementById
metody?
Przygotowałem demo na żywo w celach informacyjnych. Tutaj również wydrukuję kod:
<!DOCTYPE html>
<html>
<head>
<script>
var getRandomID = function (size) {
var str = "",
i = 0,
chars = "0123456789abcdefghijklmnopqurstuvwxyzABCDEFGHIJKLMNOPQURSTUVWXYZ";
while (i < size) {
str += chars.substr(Math.floor(Math.random() * 62), 1);
i++;
}
return str;
},
isNull = function (element) {
var randomID = getRandomID(12),
savedID = (element.id)? element.id : null;
element.id = randomID;
var foundElm = document.getElementById(randomID);
element.removeAttribute('id');
if (savedID !== null) {
element.id = savedID;
}
return (foundElm) ? false : true;
};
window.onload = function () {
var image = document.getElementById("demo");
console.log('undefined', (typeof image === 'undefined') ? true : false); // false
console.log('null', (image === null) ? true : false); // false
console.log('find-by-id', isNull(image)); // false
image.parentNode.removeChild(image);
console.log('undefined', (typeof image === 'undefined') ? true : false); // false ~ should be true?
console.log('null', (image === null) ? true : false); // false ~ should be true?
console.log('find-by-id', isNull(image)); // true ~ correct but there must be a better way than this?
};
</script>
</head>
<body>
<div id="demo"></div>
</body>
</html>
Zasadniczo powyższy kod demonstruje element przechowywany w zmiennej, a następnie usuwany z DOM. Pomimo tego, że element został usunięty z DOM, zmienna zachowuje element tak, jak był po raz pierwszy zadeklarowany. Innymi słowy, nie jest to żywe odniesienie do samego elementu, ale raczej replika. W rezultacie sprawdzenie wartości zmiennej (elementu) pod kątem istnienia zapewni nieoczekiwany wynik.
isNull
Funkcja jest moja próba sprawdzenia dla istnienia elementów ze zmiennej, i to działa, ale chciałbym wiedzieć, czy istnieje prostszy sposób, aby osiągnąć ten sam rezultat.
PS: Interesuje mnie również, dlaczego zmienne JavaScript zachowują się w ten sposób, jeśli ktoś wie o dobrych artykułach związanych z tym tematem.
Odpowiedzi:
Wygląda na to, że niektórzy lądują tutaj i po prostu chcą wiedzieć, czy istnieje element (nieco inny niż pierwotne pytanie).
To tak proste, jak użycie dowolnej metody wyboru przeglądarki i sprawdzenie jej prawdziwej wartości (ogólnie).
Na przykład, jeśli mój żywioł mieliśmy
id
z"find-me"
, mogę po prostu użyć ...Jest to określone, aby zwrócić odwołanie do elementu lub
null
. Jeśli musisz mieć wartość logiczną, po prostu rzuć a!!
przed wywołaniem metody.Ponadto możesz użyć niektórych z wielu innych metod wyszukiwania elementów, takich jak (wszystkie żyjące
document
):querySelector()
/querySelectorAll()
getElementsByClassName()
getElementsByName()
Niektóre z tych metod zwracają a
NodeList
, dlatego należy sprawdzić jejlength
właściwość, ponieważ aNodeList
jest obiektem, a zatem jest prawdą .Aby faktycznie ustalić, czy element istnieje jako część widocznego DOM (podobnie jak pierwotnie zadane pytanie), Csuwldcat zapewnia lepsze rozwiązanie niż tworzenie własnych (jak kiedyś zawierała ta odpowiedź). Oznacza to, że do korzystania z
contains()
metody na elementach DOM.Możesz użyć go tak ...
źródło
var elementInDom = function( el ) { while ( el = el.parentNode ) if ( el === document ) return true; return false; }
getElementById()
będzie zwracać referencję do elementu DOM lubnull
w związku z użyciemtypeof
(szczególnie na RHS) jest niewłaściwy (jeśli nie zostały zdefiniowane, warunek LHS będzie rzucaćReferenceError
).document.body.contains()
które wydaje się mieć bardzo dobrą obsługę przeglądarki?Użyj,
getElementById()
jeśli jest dostępny.Oto prosty sposób, aby to zrobić za pomocą jQuery:
A jeśli nie możesz używać bibliotek stron trzecich, po prostu trzymaj się JavaScript:
źródło
$('#elementId')[0].length
nie dałoby tego samego wyniku.if (element) {}
? Jeśli element jest niezdefiniowany lub ma wartość NULL, to wyrażenie ma wartość fałsz. Jeśli element jest elementem DOM, wówczas wyrażenie jest prawdziwe.getElementById()
jest zwracany,null
jeśli nie znalazł elementu, więc sprawdzenie, czy rzeczywiście została zwrócona wartość, jest wszystkim, czego potrzeba.getElementById
nigdy nie powinien wracaćundefined
. W każdym razieelement != null
czek mógłby to odebrać.Za pomocą Node.contains DOM API możesz dość łatwo sprawdzić obecność dowolnego elementu na stronie (obecnie w DOM):
UWAGA : PRZEGLĄDARKA :
document
obiekt w Internet Explorerze nie macontains()
metody - aby zapewnić kompatybilność z różnymi przeglądarkami, użyjdocument.body.contains()
zamiast tego.źródło
document.contains()
powinno wystarczyć.document.contains(document.documentElement)
.document
maNode
na swoim łańcuchu prototypów, o ile mogę powiedzieć (document
->HTMLDocument
->Document
->Node
)document.body.contains([selector])
, tj.document.body.contains(document.getElementById('div')
Po prostu robię:
Działa dla mnie i nie miałem z tym żadnych problemów ...
źródło
id
. Lepsze rozwiązanie, które odpowiada na pytanie Jak sprawdzić, czy element istnieje w widocznym DOM? z dowolnym elementem, wystarczą nawet elementy bezid
sdocument.body.contains(element)
.contains()
Możesz po prostu sprawdzić, czy właściwość parentNode ma wartość NULL.
To jest,
źródło
Z sieci deweloperów Mozilla :
Ta funkcja sprawdza, czy element znajduje się w treści strony. Ponieważ zawiera () jest włącznie i ustalenie, czy treść zawiera się nie jest intencją isInPage, ten przypadek wyraźnie zwraca wartość false.
węzeł to węzeł, który chcemy sprawdzić w <body>.
źródło
false
byćtrue
?node
IS jestdocument.body
, z pewnością metoda powinna zwrócićtrue
? Tj.return (node === document.body) || document.body.contains(node);
Najłatwiejszym rozwiązaniem jest sprawdzenie właściwości baseURI , która jest ustawiana tylko wtedy, gdy element jest wstawiany do DOM, i wraca do pustego ciągu po usunięciu.
źródło
Cannot read property 'baseURI' of null
. Przykład:console.log(document.querySelector('aside').baseURI)
Rozwiązanie jQuery:
To działało dla mnie przy użyciu jQuery i nie wymagało
$('#elementId')[0]
użycia.źródło
$('#elementId')[0]
czegoś należy unikać?Rozwiązanie csuwldcat wydaje się być najlepszym z tego grona, ale potrzebna jest niewielka modyfikacja, aby działał poprawnie z elementem znajdującym się w innym dokumencie niż kod JavaScript, takim jak iframe:
Zwróć uwagę na użycie właściwości elementu
ownerDocument
, w przeciwieństwie do zwykłego staregodocument
(który może, ale nie musi odnosić się do dokumentu właściciela elementu).torazaburo opublikowało jeszcze prostszą metodę, która działa również z elementami nielokalnymi, ale niestety wykorzystuje
baseURI
właściwość, która w tej chwili nie jest jednolicie zaimplementowana w przeglądarkach (mogłem ją uruchomić tylko w oparciu o WebKit ). Nie mogłem znaleźć innych właściwości elementu lub węzła, które mogłyby być użyte w podobny sposób, więc myślę, że na razie powyższe rozwiązanie jest tak dobre, jak to możliwe.źródło
Zamiast iterujących rodziców, możesz po prostu uzyskać prostokąt ograniczający, który jest zerami, gdy element jest odłączony od DOM:
Jeśli chcesz obsłużyć przypadek krawędzi elementu o zerowej szerokości i wysokości w punkcie zero u góry i zero w lewo, możesz dwukrotnie sprawdzić, powtarzając rodziców, aż
document.body
:źródło
Prosty sposób sprawdzenia, czy element istnieje, można wykonać za pomocą jednowierszowego kodu jQuery.
Oto kod poniżej:
źródło
Inną opcją jest element.closest :
źródło
Ten kod działa dla mnie i nie miałem z nim żadnych problemów.
źródło
Możesz także użyć
jQuery.contains
, który sprawdza, czy element jest potomkiem innego elementu. Przeszedłemdocument
jako element nadrzędny do wyszukiwania, ponieważ wszelkie elementy, które istnieją na stronie DOM, są potomkamidocument
.źródło
Sprawdź, czy element jest dzieckiem
<html>
poprzezNode::contains()
:Omówiłem to i więcej w is-dom-odłączony .
źródło
Proste rozwiązanie z jQuery:
źródło
$(document).find(yourElement).length !== 0
null == undefined
. Rzeczywista zwrócona wartość toundefined
. Porównywanie tegonull
jest trochę dziwne.źródło
DOM
, jego rodzice również powinni być wdocument
Aby sprawdzić, czy po prostu zapętlamy
parentNode
drzewo drzewa, aż dotrzemy do ostatniego dziadkaUżyj tego:
źródło
Podobało mi się to podejście:
Również
źródło
!!
jeśli chcesz logicznego?Użyj
querySelectorAll
zforEach
,w przeciwieństwie do:
źródło
Spróbuj wykonać następujące czynności. Jest to najbardziej niezawodne rozwiązanie:
Na przykład,
źródło
Wszystkie istniejące elementy mają zestaw parentElement, z wyjątkiem elementu HTML!
źródło
ten stan kurcząt wszystkie przypadki.
źródło
Wolę korzystać z tej
node.isConnected
właściwości ( odwiedź MDN ).Uwaga: Zwróci wartość true, jeśli element zostanie również dołączony do ShadowRoot, co może nie być pożądane przez wszystkich.
Przykład:
źródło