Signatur
Beschreibung
Node.ownerDocument gibt das Document zurück, in dessen Kontext ein Knoten erzeugt oder in das er übernommen wurde. Das gilt auch für Knoten, die (noch) nicht im DOM-Baum hängen: Ein mit document.createElement() erzeugtes Element hat bereits document als ownerDocument, auch vor dem Einfügen.
Nützlich ist die Eigenschaft vor allem in wiederverwendbarem Code, der mit mehreren Dokumenten arbeitet – etwa mit <iframe>-Inhalten, Pop-up-Fenstern, per DOMParser erzeugten Dokumenten oder document.implementation.createHTMLDocument(). Statt global auf document zuzugreifen, erzeugt man neue Knoten über node.ownerDocument.createElement() und bleibt so im richtigen Dokument. Über ownerDocument.defaultView erreicht man zudem das zugehörige window.
Ist der Knoten selbst ein Document, ist der Wert null. Bei einem DocumentType oder Elementen in einem Shadow-Root ist es das Dokument, das auch den Host enthält. Für den tatsächlichen Wurzelknoten des Baums (z. B. einen ShadowRoot oder ein losgelöstes Fragment) ist dagegen getRootNode() die richtige Wahl.
Rückgabewert
Document, dem der Knoten gehört; null, wenn der Knoten selbst ein Document ist.Beispiele
Grundlegende Abfrage
const p = document.querySelector('p');
console.log(p.ownerDocument === document);
// Auch nicht eingefügte Knoten haben ein ownerDocument
const div = document.createElement('div');
console.log(div.ownerDocument === document);
// Ein Dokument selbst hat keines
console.log(document.ownerDocument);
Knoten im richtigen Dokument erzeugen (iframe-sicher)
// Fügt ein Hinweis-Element neben ein beliebiges Ziel ein –
// funktioniert auch, wenn das Ziel in einem iframe liegt.
const addHint = (target, text) => {
const doc = target.ownerDocument;
const hint = doc.createElement('span');
hint.className = 'hint';
hint.textContent = text;
target.after(hint);
return hint;
};
const frame = document.querySelector('iframe');
const input = frame.contentDocument.querySelector('input');
addHint(input, 'Pflichtfeld');
console.log(input.ownerDocument === frame.contentDocument);
Zugehöriges window ermitteln
// z. B. für Maße oder Styles im richtigen Fenster-Kontext
const getWindowOf = (node) => node.ownerDocument?.defaultView ?? null;
const el = document.body;
const win = getWindowOf(el);
console.log(win === window);
console.log(win.getComputedStyle(el).display);
Dokument aus DOMParser
const parser = new DOMParser();
const xml = parser.parseFromString('<root><item/></root>', 'application/xml');
const item = xml.querySelector('item');
console.log(item.ownerDocument === xml);
console.log(item.ownerDocument === document);
// In das aktuelle Dokument übernehmen
const adopted = document.adoptNode(item);
console.log(adopted.ownerDocument === document);
// Wichtig · Fallstricke
- Schreibgeschützt: Eine Zuweisung an
ownerDocumenthat keine Wirkung (im Strict Mode gibt es einenTypeError). Um einen Knoten in ein anderes Dokument zu verschieben, nutzt mandocument.adoptNode()oderdocument.importNode()(Kopie). nullbei Dokumenten: Generischer Code, der beliebige Knoten verarbeitet, sollte das abfangen, z. B. mitnode.ownerDocument ?? node.- Nicht gleich „im DOM“:
ownerDocumentsagt nichts darüber aus, ob der Knoten eingehängt ist – dafür dientnode.isConnected. - Shadow DOM: Knoten in einem Shadow-Root liefern das Host-Dokument, nicht den
ShadowRoot. Für LetzteresgetRootNode()verwenden. - Andere Fenster: Bei iframes anderer Herkunft (Cross-Origin) ist
contentDocumentnicht zugänglich;instanceof-Prüfungen scheitern außerdem zwischen Fenstern, da jedes eigene Konstruktoren hat. - Seit Anfang an in allen Browsern unterstützt; auch in DOM-Implementierungen wie jsdom verfügbar.