669 Stimmen

Wie kann ich prüfen, ob ein Element im sichtbaren DOM existiert?

Wie testet man ein Element auf seine Existenz ohne die Verwendung der getElementById Methode?

Ich habe eine Live-Demo als Referenz. 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>

Der obige Code zeigt, wie ein Element in einer Variablen gespeichert und dann aus dem DOM entfernt wird. Auch wenn das Element aus dem DOM entfernt wurde, behält die Variable das Element so bei, wie es bei der ersten Deklaration war. Mit anderen Worten, es handelt sich nicht um einen Live-Verweis auf das Element selbst, sondern um eine Kopie. Daher wird die Überprüfung des Variablenwerts (des Elements) auf Existenz ein unerwartetes Ergebnis liefern.

El isNull Funktion ist mein Versuch, das Vorhandensein eines Elements aus einer Variablen zu überprüfen, und es funktioniert, aber ich würde gerne wissen, ob es einen einfacheren Weg gibt, um das gleiche Ergebnis zu erzielen.

PS: Ich bin auch daran interessiert, warum JavaScript-Variablen verhalten sich so, wenn jemand weiß, einige gute Artikel zu diesem Thema.

28 Stimmen

Eigentlich ist es ein aktiver Verweis auf das Element selbst, es befindet sich nur nicht mehr in einem Dokument. Diese Funktionalität ist erforderlich, weil Sie tatsächlich ein Element aus dem DOM herausziehen und es später wieder einfügen können, wobei alle Ereignishandler usw. immer noch mit ihm verbunden sind. Und warum verhalten sich JS-Variablen so? Weil es unglaublich ärgerlich wäre, wenn sie es nicht täten. JS löscht Variablen nur, wenn Sie nicht mehr JEDEN Verweis auf sie haben. Die Sprache hat keine Möglichkeit zu wissen, welche Verweise Sie für wichtig halten und welche Sie für wertlos halten.

0 Stimmen

@cwolves Interessant. Ich bin schon oft darauf gestoßen und habe mir nie viel dabei gedacht. In meinem aktuellen Projekt speichere ich Elemente in einem Array, bevor ich sie ändere, nur für den Fall, dass ich die Änderungen rückgängig machen möchte.

1 Stimmen

Die Garbage Collection läuft von Zeit zu Zeit und löscht alles, was sie für möglich hält. Sie scheint in den meisten Browsern ziemlich lausig zu sein, wird aber immer besser, da die Entwickler erkennen, dass einige Browser tagelang oder wochenlang zwischen zwei Neustarts laufen, so dass eine gute Garbage Collection für die Leistung des Browsers entscheidend ist. Webentwickler können dazu beitragen, indem sie Eigenschaften (und damit Verweise auf Dinge im Speicher) löschen, die nicht mehr benötigt werden.

263voto

csuwldcat Punkte 7665

Die Verwendung des Node.enthält DOM API können Sie ganz einfach prüfen, ob ein beliebiges Element auf der Seite (im DOM) vorhanden ist:

document.body.contains(YOUR_ELEMENT_HERE);

CROSS-BROWSER-HINWEIS : die document Objekt im Internet Explorer hat keine contains() Methode - um die Kompatibilität mit anderen Browsern zu gewährleisten, verwenden Sie document.body.contains() stattdessen.

4 Stimmen

Das scheint die ultimative Lösung für dieses Problem zu sein... und der Support ist, wenn man MDN glauben darf, ziemlich gut.

3 Stimmen

Dies ist die beste Antwort. Beachten Sie, dass nur die Überprüfung document.contains() sollte ausreichend sein.

0 Stimmen

@csuwldcat Bei mir hat es funktioniert, zumindest in Chrome mit document.contains(document.documentElement) . document hat Node auf seiner Prototypenkette, soweit ich das beurteilen kann ( document -> HTMLDocument -> Document -> Node )

48voto

Robbendebiene Punkte 3367

Ich ziehe es vor, die node.isConnected Eigenschaft ( MDN besuchen ).

Hinweis: Dies gibt true zurück, wenn das Element auch an eine ShadowRoot angehängt wird, was nicht unbedingt von jedem gewünscht wird.

Exemple :

const element = document.createElement('div');
console.log(element.isConnected); // Returns false
document.body.append(element);
console.log(element.isConnected); // Returns true

3 Stimmen

Die einfachste Lösung... Einfacher als document.body.contains.

34voto

Blaze612 YT Punkte 331

Das ist der einfachste Weg:

const cond = document.getElementById('elem') || false
if (cond) {
    //does
} else {
    //does not
}

Wenn im streng sichtbaren DOM benötigt, d.h. nicht auf der gesamten Seite, verwenden Sie etwas wie view-js (meine Lib so schlagen Sie es so viel wie Sie wollen)

<script src='https://view-js.glitch.me/view-main.js'></script>
<script>
elem = $sel('#myelem');
if (isVis(elem)) { //yes } else { //no }
</script>

function test() {
  pt = document.querySelector('#result')
  iv = document.querySelector('#f')

  cond = document.querySelector('#'+iv.value) || false

if (cond) {
    pt.innerText = 'Found!'
} else {
    pt.innerText = 'Not found!'
    }
}

Enter an id to see if it exists: <input id='f'></input>
<button onclick='test()'>Test!</button>

<br />
<p id='result'>I am a p tag. I will change depending on the result.</p>
<br />
<div id='demo'>I am a div. My id is demo.</div>

1 Stimmen

17 Hochstufungen. Meine meisten jemals!

13voto

mikechambers Punkte 3024

Sie könnten einfach prüfen, ob die Eigenschaft parentNode null ist.

Das heißt,

if(!myElement.parentNode)
{
    // The node is NOT in the DOM
}
else
{
    // The element is in the DOM
}

1 Stimmen

Ich weiß, dass dies eine alte Frage ist, aber diese Antwort ist genau die Art von eleganter, einfacher Lösung der Frage, nach der ich gesucht habe.

15 Stimmen

@poby: Es mag elegant erscheinen, aber es tut nicht wirklich das, was verlangt wurde. Es wird nur geprüft, ob das Element ein übergeordnetes Element hat. Das bedeutet nicht, dass das Element im sichtbaren DOM ist, weil das übergeordnete Element vielleicht nicht mit ihm verbunden ist.

0 Stimmen

Man müsste alle Elternteile der Eltern durchgehen, um herauszufinden, ob das letzte ein Dokument ist. Das andere Problem ist, dass es immer noch außerhalb des sichtbaren Bereichs liegen könnte oder aus vielen anderen Gründen verdeckt oder nicht sichtbar sein könnte.

13voto

Ekramul Hoque Punkte 4761

Von Mozilla-Entwickler-Netzwerk :

Diese Funktion prüft, ob sich ein Element im Body der Seite befindet. Da contains() inklusiv ist und die Feststellung, ob der Body sich selbst enthält, nicht das Ziel von isInPage ist, wird in diesem Fall explizit false zurückgegeben.

function isInPage(node) {
  return (node === document.body) ? false : document.body.contains(node);
}

Knoten ist der Knoten, auf den wir im <body> prüfen wollen.

0 Stimmen

+1, funktioniert dies auch für (beliebige) Textknoten (oder Kommentar-Knoten)?

0 Stimmen

@NikosM. Es sollte in jedem html-Tag funktionieren, aber ich habe es nicht getestet.

5 Stimmen

Sollte nicht die false sein true ?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X