Cross-window Javascript: Gibt es einen richtigen Weg?

8

Problem

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?

IE Fehler

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:

%Vor%

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.

Firefox Fehler

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:

%Vor%

Die einzige Problemumgehung, die ich sehen kann, ist die Analyse der JSON-Zeichenfolge selbst.

    
Mark 21.01.2010, 12:13
quelle

4 Antworten

1

Für was es wert ist, das ist, was ich für jetzt mache:

  • Stellen Sie sicher, dass jquery-json im Popup-Fenster
  • geladen ist
  • Stringt das Objekt
  • Rufen Sie w.$.evalJSON(str) auf, was Grundelemente korrekt bindet
  • Übergeben Sie dieses Ergebnis an die Methode im Popup

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.

    
Mark 21.01.2010 00:09
quelle
1

Wenn Sie versuchen, domainübergreifende Skripts zu erstellen, scheint JSONP eine Untersuchung wert zu sein.

    
justkt 26.01.2010 22:53
quelle
1

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:)

    
Igor Klimer 28.01.2010 15:57
quelle
0
  

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.

    
kirilloid 20.01.2010 23:41
quelle