Košík je prázdný

Chyba NS_ERROR_DOM_WRONG_DOCUMENT_ERR je jednou z běžných chyb spojených s manipulací Document Object Modelu (DOM) v JavaScriptu. Tato chyba se vyskytuje zejména při pokusu přesunout nebo zkopírovat uzel z jednoho dokumentu do jiného, což není v rámci DOM přímo povoleno. V tomto článku si vysvětlíme, co tato chyba znamená a jak ji efektivně opravit.

Co znamená NS_ERROR_DOM_WRONG_DOCUMENT_ERR?

Chyba NS_ERROR_DOM_WRONG_DOCUMENT_ERR je vyvolána v situaci, kdy se snažíte manipulovat s DOM uzlem z jiného dokumentu, než s jakým právě pracujete. K tomu dochází typicky v případě, kdy dojde k pokusu vložit element z jednoho HTML dokumentu do jiného bez správné metody k překonání omezení mezi dokumenty.

Například pokud máte iframe nebo jiný externí dokument a pokusíte se z něj vzít prvek a přímo ho přidat do hlavního dokumentu pomocí appendChild() nebo podobné metody, prohlížeč z bezpečnostních důvodů tuto operaci neprovede a vrátí právě chybu NS_ERROR_DOM_WRONG_DOCUMENT_ERR.

Jak opravit chybu NS_ERROR_DOM_WRONG_DOCUMENT_ERR?

Chybu lze opravit tak, že uzel přizpůsobíte aktuálnímu dokumentu, s nímž pracujete, což lze provést metodou importNode() nebo adoptNode(). Pojďme se podívat, jak každá z těchto metod funguje.

Použití metody document.importNode()

Metoda importNode() se používá k importu uzlu z jiného dokumentu do aktuálního. Syntaxe této metody je následující:

let importedNode = document.importNode(externalNode, true);

První parametr představuje uzel, který chcete importovat, a druhý parametr, pokud je nastaven na true, znamená, že se importuje i celý strom potomků (včetně všech poduzlů). Pokud je nastaven na false, importuje se pouze samotný uzel bez poduzlů.

let iframeDoc = document.getElementById('myIframe').contentDocument;
let externalNode = iframeDoc.getElementById('externalElement');
let importedNode = document.importNode(externalNode, true);
document.body.appendChild(importedNode);

Tímto způsobem úspěšně přenesete uzel z jednoho dokumentu do jiného bez vyvolání chyby.

Použití metody document.adoptNode()

Další možností je použití metody adoptNode(), která změní vlastnictví uzlu tak, aby se stal součástí aktuálního dokumentu. Tato metoda je užitečná, když nepotřebujete vytvářet kopii uzlu, ale chcete pracovat přímo s originálem.

Syntaxe této metody je následující:

let adoptedNode = document.adoptNode(externalNode);

Příklad:

let iframeDoc = document.getElementById('myIframe').contentDocument;
let externalNode = iframeDoc.getElementById('externalElement');
let adoptedNode = document.adoptNode(externalNode);
document.body.appendChild(adoptedNode);

V tomto případě přenesete uzel přímo do hlavního dokumentu, aniž byste museli vytvářet jeho kopii.

Jaký přístup zvolit?

  • importNode() je vhodný v případě, že potřebujete vytvořit kopii uzlu a jeho obsahu z jiného dokumentu, aniž byste změnili originál.
  • adoptNode() je vhodný tehdy, pokud chcete přesunout uzel přímo do aktuálního dokumentu bez vytváření jeho kopie.

 

Chyba NS_ERROR_DOM_WRONG_DOCUMENT_ERR je běžným problémem při manipulaci s DOM uzly mezi různými dokumenty. Klíčem k její opravě je správné použití metod importNode() nebo adoptNode(), které umožňují přenos nebo adoptování uzlů z jednoho dokumentu do jiného. Při výběru metody záleží na tom, zda chcete vytvořit kopii uzlu (použijte importNode()) nebo přímo přesunout existující uzel (použijte adoptNode()).

Tímto způsobem zajistíte, že se vyhnete chybám a vaše aplikace bude správně pracovat s DOM strukturami i v případě práce s více dokumenty.