2014-06-26 5 views
10

Ich benutze window.history in JavascriptMVC-Anwendung, um die Zurück/Weiterleiten/Refresh-Funktionalität für jeden Controller zu aktivieren. Jedes Mal, wenn ich einen neuen Controller lade, verwende ich window.history.pushState, um dem Verlauf einen neuen Status hinzuzufügen. Und dann wieder/aktualisiere ich den gespeicherten Zustand und verwende die Daten erneut, um den Controller wieder aufzubauen.Fehler beim Ausführen von 'pushState' bei 'History' Fehler bei Verwendung von window.history.pushState Funktion

Die ganze Idee funktioniert einwandfrei, mit Ausnahme eines Problems in einem bestimmten Szenario. Ich erhalte den folgenden Fehler:

Failed to execute 'pushState' on 'History': An object could not be cloned.

Die gleichen Daten werden ohne Probleme auf andere Szenario hinzugefügt. Was kann diesen Fehler verursachen? Danke für die Hilfe.

Antwort

19

https://developer.mozilla.org/en-US/docs/Web/Guide/API/DOM/Manipulating_the_browser_history

„Der Staat Objekt kann alles sein, das serialisiert werden kann. Da Firefox Statusobjekte auf der Festplatte des Benutzers gespeichert, so dass sie wiederhergestellt werden, nachdem der Benutzer den Browser neu gestartet wird, wir eine Größenbegrenzung von 640k Zeichen verhängen Wenn Sie ein Statusobjekt übergeben, dessen serialisierte Darstellung größer als this ist, wird die Methode eine Ausnahme auslösen.Wenn Sie mehr Speicherplatz benötigen, sollten Sie sessionStorage und verwenden/oder localStorage. "

Sieht aus wie die einfache Antwort ist, dass der Zustand, den Sie übergeben, Serialisierung zu größer als 640k ist. Ich bin gerade auf diesen Käfer gestoßen, und ich bin mir fast sicher, dass das der Grund ist.

+0

Danke für die Antwort. Das Problem wurde durch einige zyklische Abhängigkeiten in Objekten verursacht, die ich speichern und serialisieren wollte. Nachdem ich die zyklischen Abhängigkeiten entfernt hatte, wurde es aufgelöst. – Boltosaurus

+1

Ich hatte das gleiche Problem, weil ich ein DOM-Element an das Statusobjekt übergeben habe. Keine gute Idee. Danke für die Antwort: sehr hilfreich. – pmrotule

+0

Habe denselben Fehler mit Knockout bekommen, weil ich das Observable nicht dereferenziert habe - ich versuche ID zu drücken, wenn ich ID hätte drücken sollen() – Whelkaholism