JavaScript/DOM/Node/contains

Aus SELFHTML-Wiki
< JavaScript‎ | DOM‎ | Node
Wechseln zu: Navigation, Suche

Mit der Methode contains kann geprüft werden, ob ein Knoten Nachfahre eines anderen Knotens ist.


Syntax

Node.prototype.contains(otherNode)


Attribute
Writable true
Enumerable true
Configurable true


Beschreibung

Die Methode contains ermöglicht es, den Teilbaum mit dem Kontextobjekt als Wurzel nach einem anderen Knoten zu durchsuchen, welcher der Methode beim Aufruf als Argument übergeben wird. Dabei kann es sich auch um das Kontextobjekt selbst handeln, also das Objekt, auf dem die Methode aufgerufen wurde. – Oder anders formuliert, werden diejenigen Knoten nach dem übergebenen Objekt durchsucht, deren gemeinsamer Vorfahre das Kontextobjekt ist, ausgehend von diesem selbst.


Beispiel
<body>
    <header>
        <h1><code>Node.prototype.contains</code></h1>
    </header>
    <main>
        <p id="summary">Checks whether a node is another node’s descendant.</p>
    </main>
    <script>
        const [main, summary] = document.querySelectorAll('main, p');

        console.log(main.contains(summary)); // true
    </script>
</body>


In diesem Beispiel werden erst mit der Methode querySelectorAll ein Main-Element und ein Paragraph-Element aus der Objektrepräsentation des Dokuments selektiert und die erhaltenen Referenzen in Konstanten gespeichert. Im Anschluss wird mit der Methode contains geprüft, ob der Absatz ein Nachfahre von Main ist. Da p hier in main enthalten ist, wird von der Methode der boolesche Wert true in der Konsole ausgegeben.


Hinweis:
Anders als bei der Methode compareDocumentPosition, welche grundsätzlich ebenfalls für die Prüfung verwendet werden kann, ob ein Knoten Nachfahre eines anderen Knotens ist, umfasst der Suchbereich der Methode contains auch das Objekt, auf dem die Methode aufgerufen wurde. Würde also analog zum Beispiel oben geprüft, ob das Element Body in sich selbst enthalten ist, dann wäre das Ergebnis der Prüfung ebenfalls true.


Ein etwas realistischeres Anwendungsbeispiel für die Methode contains wäre die Prüfung, ob ein Ereignis innerhalb oder außerhalb eines bestimmten Elementes erfolgt ist. Dies wird im Folgenden anhand des click-Ereignisses veranschaulicht, das unter Verwendung der Methode addEventListener auf dem Element Body überwacht wird. In einem Output-Element wird ausgegeben, ob innerhalb oder außerhalb des durch das Main-Element ausgezeichneten Hauptinhalts geklickt wurde.


Beispiel
<body>
    <header>
        <h1><code>Node.prototype.contains</code></h1>
    </header>
    <main>
        <p id="summary">Checks whether a node is another node’s descendant.</p>
    </main>
    <output></output>
    <script>
        const [main, output] = document.querySelectorAll('main, output');


        document.body.addEventListener('click', function({ target }) {
            output.value = `click ${

                main.contains(target) ? 'inside' : 'outside' 

            } main element`;
        });
    </script>
</body>


Hier werden zunächst wieder die nötigen Objektreferenzen in Konstanten hinterlegt, nämlich für das Element Main und für das Element Output, wobei die Methode querySelectorAll verwendet wird. Danach wird auf Body ein Eventhandler registriert. Wird nun irgendwo innerhalb von Body geklickt, dann wird mit contains geprüft, ob das in der Eigenschaft target des als Argument übergebenen Eventobjektes hinterlegte Zielelement ein Nachfahre des Main-Elementes ist oder nicht.


Hinweis:
Zum Zeitpunkt der Lektüre könnte es noch einige ältere aber immernoch relevante Browser geben, die mit der oben gezeigten Syntax zur Destrukturierung von Parametern von Funktionen und der Notation von Templateliteralen nichts anfangen können, da es sich hierbei um vergleichsweise neue Sprachkonstrukte handelt. Vor der Verwendung im Produktiveinsatz sollte also noch einmal die Unterstützung dieser Features geprüft werden. Hierfür bietet sich die Kompatibilitätstabelle von kangax an.


Spezifikation

W3C DOM 4.1 – contains