1

Web ページのサブフレームを使用する場合、作成者 (親) は通常、各サブフレームに「名前」を付け、mainWindow.dataFrame のような構文でフレームを参照できます。外部サイトからロードされたサブフレームがそのウィンドウの名前を、使用されている親とは異なる名前に変更するという事実まで追跡したブラウザー固有の問題に遭遇しました。これにより、Google Chrome では問題が発生しますが、Firefox では発生しません。

Firefox は、同じサブフレームの親の名前と子の名前を分けているようです。これにより、親の JavaScript は引き続き期待どおりに動作し、子の JavaScript は必要に応じて独自の名前を使用できます。

Chrome は別の考えを持っているようで、サブフレームの名前は 1 つしかありません。子がフレームの名前を変更すると、親は名前でアクセスできなくなります。別のコンテンツがサブフレームにロードされた後でも、「破損」は持続します。

他のブラウザが何をするかはまだ調査していません。

私は、この説明に関連するクロスドメイン セキュリティの問題があることを認識しています。オフサイトの子が読み込まれると、サブフレームのコンテンツにアクセスできなくなります。しかし、子に親の側からウィンドウの名前を変更させることは、潜在的なセキュリティの問題のようにも思えます。

これを解決するために、mainWindow.dataFrame 構文の使用をやめ、新しいデータをサブフレームにロードするときに固定インデックスを持つ frames[] 配列を使用する必要がありました - 見苦しいですが、実行可能です。これを回避するより良い方法はないという確認を探していると思います。そして、Firefox と Google のどちらが「正しい」かを知っておくとよいでしょう。私は Firefox に投票します。

4

1 に答える 1

0

私の問題の最初の分析を忘れてください。修正中の複雑なコードを単純化しようとしたとき、何が起こっているのかをさらに理解しました。問題は、Firefox での予期しない動作のようです。フレームには、親と子の両方に対して 1 つの名前しかありません。いずれかのコンテキストがフレームの .name プロパティを要求すると、同じ応答が得られます。

奇妙さは、javascript が維持する自動的に作成された変数/プロパティに関係しています。<frame> が name="subName" 属性で作成された場合、self.subName はそのフレームへの参照を提供します。self.subName.name=newName のように、親または子がフレームの名前を変更すると、新しい自動変数/プロパティ self.newName が存在し、元の​​フレームを参照します。Chrome では、古い変数/プロパティは消えます。Firefox では、古い名前は消えず (!!!)、トップ レベル ウィンドウの両方のプロパティが引き続き存在し、両方とも同じサブフレームを参照します。これはすべて、元のコードが Firefox では機能するのに Chrome では機能しなかった理由を説明しています。

于 2012-12-06T19:56:37.590 に答える