Ich versuche eine Methode zu erstellen, die Objekte in einem Popup-Fenster an eine ähnliche Methode übergibt. Ich habe keine Kontrolle über den Code in der Zielmethode oder das übergebene Objekt. Die Zielmethode serialisiert das Objekt derzeit mit JSON.stringify
, soweit möglich, oder instanceof Array
.
Das erste Problem ist ein Fehler in IE8 (siehe unten). Die zweite und grundlegendere ist, dass Primitive über Fenster hinweg nicht gleich sind:
%Vor%Überschreibe alle Popup-Klassen, die übergeben werden könnten, und stelle sie dann wieder her, nachdem der Aufruf funktioniert hat, aber es ist wirklich spröde und es gibt Kopfschmerzen.
Das Serialisieren des Objekts in JSON und das anschließende Parsing im Kontext des Fensters führt zum folgenden Firefox-Fehler.
Ich bin auch ein bisschen verabscheut, eine tiefe Kopie des Objekts zu machen oder den JSON mit new w.Object
usw. zu analysieren, weil es sich nicht so kompliziert anfühlt.
Kann jemand einen vernünftigen Weg vorschlagen, damit umzugehen, oder sollte ich einfach akzeptieren, dass Objekte nicht wörtlich zwischen Fenstern weitergegeben werden können?
JSON.stringify
funktioniert nicht über Windows in IE8. Wenn ich ein Objekt an das Popup übergebe, das es zu serialisieren versucht, gibt stringify den Wert undefined
zurück. Um dieses Problem zu sehen, öffnen Sie die Skriptkonsole in IE8 und versuchen Sie Folgendes:
Ich habe versucht, dies zu umgehen, indem ich w.JSON = JSON
gesetzt habe, aber wie der letzte Test zeigt, bricht das ab, wenn Sie Objekte aus beiden Fenstern haben.
Es scheint, dass der Aufruf von w.Object()
zum Erstellen eines Objekts in Firefox tatsächlich window.Object()
aufruft. Der gleiche Fehler wird beim Aufruf von w.JSON.parse
oder w.eval
verursacht. Um dies zu sehen, öffne die Firebug-Konsole und versuche:
Die einzige Problemumgehung, die ich sehen kann, ist die Analyse der JSON-Zeichenfolge selbst.
Für was es wert ist, das ist, was ich für jetzt mache:
w.$.evalJSON(str)
auf, was Grundelemente korrekt bindet Alternativ (wenn jquery-json nicht verfügbar ist) könnten Sie das folgende Skript in das Ziel einfügen:
%Vor%, da dies das JSON des Popups erfasst und nicht das des Anrufers.
Jede bessere Lösung wird gerne angenommen.
Ich kann nicht sagen, dass ich dein Problem vollständig verstanden habe, aber es gibt einen interessanten window.name
Hack, der es wert ist, ihn auszuprobieren: Ссылка (der Blogbeitrag benutzt Dojo, aber natürlich auch mit reinem JS). Es ist sicherer als JSONP, einfach zu implementieren und scheint in allen Browsern zu funktionieren.
Grundsätzlich erlaubt es Ihnen, alle Daten mit der Länge any in der Variablen window.name
zu speichern. Was toll ist, ist, dass diese Variable beim Seitenwechsel nicht geleert / gelöscht wird, so dass man bei geschickter Verwendung von iframes einen einfachen und sicheren domänenübergreifenden Transport erhält:)
Um dies zu sehen, öffne die Firebug-Konsole und versuche es:
Fehler: Berechtigung verweigert für & lt; stackoverflow & gt; um die Eigenschaft Window.Object von & lt; google & gt; zu erhalten. In jeder Zeile außer der ersten: w = offen (" Ссылка ") Firefox 3.5.7
Denken Sie einen Moment nach: Sie versuchen, ein neues Fenster mit einer beliebigen Site zu öffnen und senden Sie Daten, die für js verfügbar sind. Scheint zu unsicher, um dies zuzulassen.
Tags und Links javascript serialization firefox popup internet-explorer-8