2009-07-21 3 views
10

Hier ist der Fall:
Seite A enthält iframe B, B enthält iframe C, A und B sind unter der gleichen Domäne, C unter einem anderen.
C versucht, den Standort von Eltern B mit zusätzlichen Informationen nach "#" zurückzusetzen, um die domänenübergreifende Kommunikation mit Fragment Id Messaging zu lösen.

IE6/7/8 funktioniert einfach mit diesem Fall, während Firefox blockiert parent.location Einstellung mit Fehlermeldung [Zugriff auf Eigenschaft verweigert "code:" 1010]. Aber wenn B das oberste Fenster ist, was bedeutet, dass es kein A gibt, lebt auch Firefox.

Es ist mir seltsam ... Könntest du bitte helfen?

Vielen Dank!Cross Domain JavaScript übergeordnete Speicherort Einstellung firefox Fehler

Antwort

15

Historisch gesehen, könnte jedes Fenster, um die Lage eines anderen Fensters ändern. Dies stellte sich als ein Problem heraus, weil es unter anderem bedeutete, dass das Einbetten eines Login-Iframes in ein Fenster unsicher war (weil dann eine bösartige Site den Login-Iframe durch eine gefälschte Version ersetzen könnte). Im Laufe der Zeit wurden weitere Beschränkungen für Standortänderungen in Browserfenstern angewendet, bis jetzt HTML5 und die meisten Browser eine gemeinsame Vereinbarung über the ancestor policy erreicht haben. Auf den Punkt gebracht, die HTML5-Spezifikation zu paraphrasieren, kann ein Fenster A die Position eines anderen Fensters B iff ändern:

  • die Positionen von A und B haben die gleiche Herkunft, die sie haben das gleiche Schema zu sagen ist, Gastgeber , und port (http, stackoverflow.com, zum Beispiel 80), oder
  • B ist ein Top-Level-Fenster, und A ist ein Fenster in einem Rahmen mit einer gewissen Tiefe innerhalb B (direkte Kind, Kind eines Kindes, usw.) oder
  • B ist ein Fenster window.open und A kann sich die Position des Fensters ändern, die B geöffnet damit geöffnete (B so ist ein Popup durch A geöffnet wird, durch eine Popup-Fenster von A geöffnet wird, oder in größerer Tiefe) oder
  • B ist nicht ein Fenster der obersten Ebene, aber die übergeordnete Fenster oder Eltern übergeordneten Fensters, oder in einem ähnlichen Menge von Abstammungs die Stellen des Fensters, und A sind dieselben Ursprungs

(Same Ursprungs ist komplizierter als das, aber die eingebettete Beschreibung oben fängt seine Essenz ein und deckt die häufigsten Fälle ab.)

Gemäß dieser Richtlinie kann C die Position von A ändern, und A kann die Position von B oder C ändern, aber C darf den Speicherort von B nicht ändern. Wenn Sie dies umgehen müssen, sollten Sie den Speicherort Ihrer Seite A in etwas ändern, das B entsprechend ändert. alternativ könnten Sie ask your page B to change its own location.

Hoffentlich ist das informativ, wenn nicht unbedingt hilfreich. Das Browser-Sicherheitsmodell war nicht so sehr entworfen als entwickelt, und nur mit neueren Arbeiten in HTML5 ist es wirklich diese Cross-Browser zu adressieren Inkonsistenzen genau festgenagelt werden.

Alles, was gesagt, ich bin überrascht, IE7 und IE8 Arbeit für Sie - es ist mein Verständnis war die Politik soll in erster Linie auf die Politik beruhte IE7 implementiert.

+0

danke für deine klare und schöne antwort, ich werde meine lösung hierüber überdenken. –

+0

Danke Jeff. Es sollte beachtet werden, dass window.postMessage, mit dem Sie eine Verknüpfung herstellen, in allen modernen Browsern funktioniert, aber die Syntax in IE ist etwas anders. Ich habe eine ähnliche Frage gestellt und selbst beantwortet. Hier ist meine Antwort, die eine einfache browserübergreifende Beispielimplementierung hat: http://stackoverflow.com/questions/1860470/is-there-any-way-for-an-iframe-to-change-the-top-windows- url/1861054 # 1861054 – Kip

0

Von C aus können Sie unter Verwendung von window.top auf das Fenster von B zugreifen.

Versuche, var B = window.top; B.location = "...";

+0

Wenn ich window.top von C verwende, habe ich A statt B, aber ich möchte A nicht zurücksetzen ... –