Wie testet man ein Element ohne Verwendung der getElementById
Methode auf Existenz ?
Ich habe eine Live-Demo als Referenz eingerichtet. Ich werde den Code auch hier ausdrucken:
<!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>
Grundsätzlich zeigt der obige Code, dass ein Element in einer Variablen gespeichert und dann aus dem DOM entfernt wird. Obwohl das Element aus dem DOM entfernt wurde, behält die Variable das Element bei, wie es beim ersten Deklarieren war. Mit anderen Worten, es handelt sich nicht um eine Live-Referenz auf das Element selbst, sondern um eine Nachbildung. Infolgedessen führt das Überprüfen des Werts der Variablen (des Elements) auf Existenz zu einem unerwarteten Ergebnis.
Die isNull
Funktion ist mein Versuch, anhand einer Variablen zu prüfen, ob Elemente vorhanden sind, und sie funktioniert. Ich möchte jedoch wissen, ob es einen einfacheren Weg gibt, dasselbe Ergebnis zu erzielen.
PS: Ich bin auch daran interessiert, warum sich JavaScript-Variablen so verhalten, wenn jemand einige gute Artikel zum Thema kennt.
Antworten:
Es scheint, dass einige Leute hier landen und einfach wissen wollen, ob ein Element existiert (ein bisschen anders als die ursprüngliche Frage).
Dies ist so einfach wie die Verwendung einer Auswahlmethode des Browsers und die Überprüfung auf einen wahrheitsgemäßen Wert (im Allgemeinen).
Wenn mein Element beispielsweise ein
id
von hätte"find-me"
, könnte ich einfach ...Dies wird angegeben, um entweder einen Verweis auf das Element zurückzugeben oder
null
. Wenn Sie einen booleschen Wert haben müssen, werfen Sie einfach einen!!
vor dem Methodenaufruf.Darüber hinaus können Sie einige der vielen anderen Methoden verwenden, um Elemente zu finden, z. B. (alle leben davon
document
):querySelector()
/.querySelectorAll()
getElementsByClassName()
getElementsByName()
Einige dieser Methoden geben a zurück.
NodeList
Überprüfen Sie daher unbedingt seinelength
Eigenschaft, da aNodeList
ein Objekt ist und daher wahr ist .Um tatsächlich festzustellen, ob ein Element als Teil des sichtbaren DOM vorhanden ist (wie die ursprünglich gestellte Frage), bietet Csuwldcat eine bessere Lösung als das Rollen eines eigenen Elements (wie diese Antwort früher enthielt). Das heißt, die
contains()
Methode für DOM-Elemente zu verwenden.Sie könnten es so verwenden ...
quelle
var elementInDom = function( el ) { while ( el = el.parentNode ) if ( el === document ) return true; return false; }
getElementById()
sie einen Verweis auf ein DOM-Element zurückgibt odernull
daher die Verwendungtypeof
(insbesondere auf der RHS) falsch ist (wenn sie nicht definiert wäre, würde die LHS-Bedingung a auslösenReferenceError
).document.body.contains()
scheint eine sehr gute Browserunterstützung zu haben?Verwenden Sie,
getElementById()
wenn es verfügbar ist.Hier ist eine einfache Möglichkeit, dies mit jQuery zu tun:
Und wenn Sie keine Bibliotheken von Drittanbietern verwenden können, halten Sie sich einfach an das Basis-JavaScript:
quelle
$('#elementId')[0].length
würde nicht das gleiche Ergebnis erzeugen.if (element) {}
? Wenn das Element undefiniert oder null ist, ist dieser Ausdruck falsch. Wenn element ein DOM-Element ist, ist der Ausdruck wahr.getElementById()
wird zurückgegeben,null
wenn das Element nicht gefunden wurde. Daher ist nur die Überprüfung auf einen wahrheitsgemäßen Rückgabewert erforderlich.getElementById
sollte niemals zurückkehrenundefined
. In jedem Fallelement != null
würde der Scheck dies aufgreifen.Mit der Node.contains DOM-API können Sie ganz einfach überprüfen, ob ein Element auf der Seite (derzeit im DOM) vorhanden ist:
CROSS-BROWSER HINWEIS : Das
document
Objekt in Internet Explorer verfügt nicht über einecontains()
Methode. Um die browserübergreifende Kompatibilität sicherzustellen, verwenden Siedocument.body.contains()
stattdessen.quelle
document.contains()
ausreichen sollte.document.contains(document.documentElement)
.document
hatNode
an seiner Prototypenkette, soweit ich das beurteilen kann (document
->HTMLDocument
->Document
->Node
)document.body.contains([selector])
, dhdocument.body.contains(document.getElementById('div')
Ich mache einfach:
Es funktioniert bei mir und hatte noch keine Probleme damit ...
quelle
id
. Die bessere Lösung, die die Frage beantwortet Wie kann überprüft werden, ob das Element im sichtbaren DOM vorhanden ist? Mit jedem Element sind auch Elemente ohneid
s zu tundocument.body.contains(element)
.contains()
Sie können einfach überprüfen, ob die parentNode-Eigenschaft null ist.
Das ist,
quelle
Aus dem Mozilla Developer Network :
Diese Funktion prüft, ob sich ein Element im Hauptteil der Seite befindet. Da enthält () inklusive ist und die Bestimmung, ob der Körper sich selbst enthält, nicht die Absicht von isInPage ist, gibt dieser Fall explizit false zurück.
Knoten ist der Knoten, nach dem wir im <body> suchen möchten.
quelle
false
seintrue
?node
IS der istdocument.body
, sollte die Methode doch zurückkehrentrue
? Dh,return (node === document.body) || document.body.contains(node);
Die einfachste Lösung besteht darin, die baseURI- Eigenschaft zu überprüfen , die nur festgelegt wird, wenn das Element in das DOM eingefügt wird, und beim Entfernen in eine leere Zeichenfolge zurückgesetzt wird.
quelle
Cannot read property 'baseURI' of null
. Beispiel:console.log(document.querySelector('aside').baseURI)
jQuery-Lösung:
Dies funktionierte bei mir mit jQuery und musste nicht
$('#elementId')[0]
verwendet werden.quelle
$('#elementId')[0]
etwas zu vermeiden?Die Lösung von csuwldcat scheint die beste zu sein, aber es sind geringfügige Änderungen erforderlich, damit sie mit einem Element, das sich in einem anderen Dokument befindet als der JavaScript-Code, wie z. B. einem Iframe, ordnungsgemäß funktioniert.
Beachten Sie die Verwendung der
ownerDocument
Eigenschaft des Elements im Gegensatz zu einfach nur altdocument
(die sich möglicherweise auf das Eigentümerdokument des Elements bezieht oder nicht).torazaburo hat eine noch einfachere Methode veröffentlicht , die auch mit nicht lokalen Elementen funktioniert. Leider wird die
baseURI
Eigenschaft verwendet, die derzeit nicht einheitlich in allen Browsern implementiert ist (ich konnte sie nur in den WebKit- basierten Elementen zum Laufen bringen ). Ich konnte keine anderen Element- oder Knoteneigenschaften finden, die auf ähnliche Weise verwendet werden könnten, daher denke ich, dass die oben genannte Lösung vorerst so gut ist, wie es nur geht.quelle
Anstatt Eltern zu iterieren, können Sie einfach das Begrenzungsrechteck erhalten, das alle Nullen enthält, wenn das Element vom DOM getrennt wird:
Wenn Sie den Randfall eines Elements mit der Breite und Höhe Null bei Null oben und Null links behandeln möchten, können Sie dies überprüfen, indem Sie die Eltern iterieren, bis
document.body
:quelle
Eine einfache Möglichkeit, um zu überprüfen, ob ein Element vorhanden ist, besteht in einem einzeiligen Code von jQuery.
Hier ist der Code unten:
quelle
Eine weitere Option ist element.closest :
quelle
Dieser Code funktioniert für mich und ich hatte keine Probleme damit.
quelle
Sie können auch verwenden
jQuery.contains
, um zu überprüfen, ob ein Element ein Nachkomme eines anderen Elements ist. Ich habedocument
als übergeordnetes Element für die Suche übergeben, da alle Elemente, die auf der Seite DOM vorhanden sind, ein Nachkomme von sinddocument
.quelle
Überprüfen Sie, ob das Element ein untergeordnetes Element von
<html>
via istNode::contains()
:Ich habe dies und mehr in is-dom-losgelöst behandelt .
quelle
Eine einfache Lösung mit jQuery:
quelle
$(document).find(yourElement).length !== 0
null == undefined
. Der tatsächlich zurückgegebene Wert wäreundefined
. Es zu vergleichennull
ist ein bisschen komisch.quelle
DOM
, sollten auch seine Eltern in seindocument
Um zu überprüfen, ob wir nur zum
parentNode
Baum des Elements gelangen, bis wir den letzten Großelternteil erreichenBenutze das:
quelle
Dieser Ansatz hat mir gefallen:
Ebenfalls
quelle
!!
wenn Sie einen Booleschen wollen?Verwenden Sie
querySelectorAll
mitforEach
,als das Gegenteil von:
quelle
Versuche Folgendes. Es ist die zuverlässigste Lösung:
Zum Beispiel,
quelle
Für alle vorhandenen Elemente ist parentElement festgelegt, mit Ausnahme des HTML-Elements!
quelle
dieser Zustand Küken alle Fälle.
quelle
Ich bevorzuge die Nutzung der
node.isConnected
Eigenschaft ( MDN besuchen ).Hinweis: Dies gibt true zurück, wenn das Element auch an einen ShadowRoot angehängt wird, was möglicherweise nicht jedermanns gewünschtes Verhalten ist.
Beispiel:
quelle