2009-07-21 8 views
10


ページAはiframe Bを含み、Bはiframe Cを含み、AとBは同じドメインの下にあり、Cは別のドメインの下にあります。
Cは、フラグメントIDメッセージングを使用してクロスドメイン通信を解決するために、親Bの位置を "#"に続く追加情報でリセットしようとします。

Firefoxのブロックparent.locationエラーメッセージ[へのアクセスが拒否された "コード:" 1010]の場合、IE6/7/8はこのケースで正常に機能します。 しかし、Bがトップウインドウであれば、Aがないことを意味します.Firefoxも存続します。

私には奇妙なことです...皆さん、助けてくださいますか?

ありがとうございました!クロスドメインJavaScriptの親ロケーションの設定Firefoxのエラー

答えて

15

歴史的には、任意のウィンドウが他のウィンドウの位置を変更することができます。これは、とりわけ、ログインiframeをウィンドウに埋め込むことは安全ではないことを意味しています(悪意のあるサイトがログインiframeを詐称したバージョンに置き換える可能性があるため)。時間が経つにつれて、さらに制限が今、HTML5とほとんどのブラウザはthe ancestor policyに共通の合意に達したときまで、ブラウザウィンドウの位置の変更に適用されています。一言で言えば、HTML5仕様を言い換え、ウィンドウAが別のウィンドウBのIFFの位置を変更することができる:

  • A及びBの位置は、それらが同じスキーム、ホストを持っていると言うことである同じ起源を有します(HTTP、stackoverflow.com、例えば80)、およびポート、または
  • Bは、トップレベルのウィンドウであり、そしてAはB(直接の子、子の子、内にいくつかの深さでネストされたフレーム内のウィンドウでありますなど)、または
  • Bはwindow.openを使用して開いたウィンドウで、AはBを開いたウィンドウの位置を変更できます(BはAによって開いたポップアップ、Aで開いたポップアップウィンドウ、またはより深いところです) 、または
  • Bトップレベルウィンドウではなく、その親ウィンドウ、又は親の親ウィンドウまたはそのウィンドウの親子関係のいくつかの類似の量での位置とA同一生成元である

(同じ起源上記よりも複雑ですが、上記の埋め込み説明はその本質を捉え、最も一般的なケースをカバーしています)。

このポリシーでは、CはAの場所を変更し、AはBまたはCの場所を変更することができますCはBの位置を変更しないことがあります。これを回避する必要がある場合は、ページAの位置をBを適切に変更するものに変更する必要があります。代わりに、あなたはask your page B to change its own locationでした。

必ずしも有用ではない場合うまくいけば、それは、有益です。ブラウザのセキュリティモデルは、そんなにとしてを設計されていないとだけHTML5における最近の研究で、を進化させ、それは本当に正確にこれらのクロスブラウザの不整合に対処するために釘付けされています。

IE7とIE8があなたのために働いていると私は驚いています。上記のポリシーは主にIE7の実装したポリシーに基づいています。

+0

あなたの明確で美しい答えをありがとう、私はこれについて私のソリューションを再考します。 –

+0

ありがとうございました。あなたがリンクしているwindow.postMessageはすべての最新のブラウザで動作しますが、IEの構文は少し異なります。私はこれに似た質問を投稿し、自分でそれに答えることになった。ここで私の答えは、単純なクロスブラウザの実装例があります:http://stackoverflow.com/questions/1860470/is-there-any-way-for-an-iframe-to-change-the-top-windows- url/1861054#1861054 – Kip

0

Cからあなたはwindow.topを使用してBのウィンドウにアクセスすることができます。

てみてください、var B = window.top; B.location = "...";

+0

Cのwindow.topを使用している場合、私はBではなくAを取得しましたが、Aの場所をリセットしたくありません... –

関連する問題