Chyba s kódem NS_ERROR_DOM_DATA_CLONE_ERR patří mezi chyby související s pokusem o klonování dat ve webových aplikacích, které nelze správně serializovat. Tento problém je častý v prostředí JavaScriptu při práci s postMessage, localStorage, nebo při pokusu o serializaci objektů, které obsahují nepodporované typy dat, jako jsou funkce, DOM elementy nebo objekty typu File.
Níže si vysvětlíme, jak k této chybě dochází a jak ji můžete efektivně opravit.
Příčiny vzniku chyby NS_ERROR_DOM_DATA_CLONE_ERR
K chybě NS_ERROR_DOM_DATA_CLONE_ERR může dojít v následujících případech:
- Použití nepodporovaných typů dat: JavaScript standardně nepodporuje klonování některých objektů, jako jsou například funkce, DOM elementy, cyklické struktury nebo instance tříd jako File, Blob či ImageData.
- Nesprávné předávání dat při postMessage: Chyba často nastává při pokusu o přenos dat mezi okny nebo worker procesy pomocí postMessage, kdy jsou data nekompatibilní s procesem klonování.
- Přímá manipulace s objekty: Pokusy uložit komplexní struktury dat do localStorage nebo sessionStorage, které musí být serializovány do řetězce, mohou také způsobit tuto chybu.
Jak identifikovat, co způsobuje NS_ERROR_DOM_DATA_CLONE_ERR
Nejprve je důležité pochopit, které typy dat jsou problémové. K tomu můžete provést následující kroky:
- Zkontrolujte, jaká data klonujete: Pokud používáte postMessage, localStorage nebo jiný způsob přenosu či ukládání dat, ujistěte se, že neobsahují funkce, DOM elementy nebo cyklické reference.
- Vyzkoušejte serializaci pomocí JSON: Většina dat lze snadno zkontrolovat tím, že se pokusíte data převést na JSON formát pomocí JSON.stringify(). Pokud se objeví chyba během serializace, pravděpodobně jste narazili na problémový typ dat.
Oprava chyby NS_ERROR_DOM_DATA_CLONE_ERR
Jakmile identifikujete, která data způsobují chybu, můžete přistoupit k opravě. Následující přístupy jsou nejčastější řešení:
1. Vyhněte se nepodporovaným datovým typům
Pokud se pokoušíte klonovat data, která zahrnují funkce, DOM elementy nebo instance tříd jako File či Blob, budete muset tato data před klonováním odstranit nebo nahradit:
let obj = {
name: "Example",
func: function() { console.log("Hello world!"); } // Funkce nelze klonovat
};
delete obj.func; // Odstraňte funkci, která způsobuje chybu
window.postMessage(obj, "*");
2. Použití JSON pro serializaci a deserializaci
Můžete data serializovat do JSON formátu, což zajistí, že se nebudou přenášet nepodporované datové struktury:
let obj = {
name: "Example",
value: 123
};
// Serializace do JSON
let jsonData = JSON.stringify(obj);
// Přenos přes postMessage
window.postMessage(jsonData, "*");
// Na druhé straně
let receivedData = JSON.parse(event.data);
3. Použití klonovacích knihoven
Existují knihovny, které zvládnou klonování komplexních objektů, například knihovna structuredClone(), která umožňuje bezpečné klonování, včetně podpory cyklických referencí:
let obj = {
name: "Example",
value: 123
};
let clonedObj = structuredClone(obj); // Bezpečné klonování objektu
window.postMessage(clonedObj, "*");
4. Uložení pouze serializovatelných částí do localStorage
Pokud potřebujete uložit komplexní struktury dat do localStorage nebo sessionStorage, musíte se omezit na typy dat, které lze serializovat do JSON, případně ukládat pouze jednoduché typy a ostatní hodnoty vynechat:
let complexObject = {
name: "Example",
date: new Date(), // Date objekt nelze serializovat do JSON
};
// Pouze serializovatelné části objektu
let serializablePart = {
name: complexObject.name
};
localStorage.setItem("data", JSON.stringify(serializablePart));
Chyba NS_ERROR_DOM_DATA_CLONE_ERR je důsledkem pokusu o klonování dat, která obsahují nepodporované struktury. Nejlepší postup, jak se této chybě vyhnout, je věnovat pozornost tomu, jaká data klonujete, a používat techniky jako serializace JSON, případně využití moderních API jako structuredClone(). Tímto způsobem zajistíte, že vaše aplikace bude pracovat spolehlivě a nebude náchylná na problémy s klonováním dat.
Dodržováním těchto rad se vyhnete vzniku chyby NS_ERROR_DOM_DATA_CLONE_ERR a zvýšíte stabilitu a použitelnost vašich webových aplikací.