2011-11-21 16 views
6

Chromeでいくつかの実験を行いましたが、確認が必要なのでわかりません:フレームとiframeは分離されたjavascriptコンテキストを持っていますか?

iframeとフレームに別々のJavaScriptコンテキストがあり、それらのフレーム間で変数を共有できないという点を修正しました/ iframe?

簡単にするために、のは、クライアントは常にクロムの同じバージョンになると仮定しましょう

+0

答えが「イエス」であるが、それは「シェア変数」には不可能ではありません。ただし、Internet ExplorerはJavaScriptオブジェクトの系統について非常に厄介なので、危険です。 – Pointy

+0

あなたはコメントの代わりに答えを出すべきです;)また、クライアントが常にChromeであると仮定しましょう。 – Klaim

+0

回答が準備完了です。私はChromeがIEのような感度を持っているとは思っていませんが、私は100%確実ではありません。テストするのは簡単でしょう。 – Pointy

答えて

8

はい(それは私の場合です)。

ただし、framesコレクションまたはparentを使用して、他のフレームにアクセスすることができます(同じドメインのものと仮定します)。

1

コンテキストの分離はフレーム間ではなく、ドメイン間で行われます。つまり、ドメインAでフレームAをロードし、ドメインBでフレームBをロードすると、フレームAのjavascriptはドメインBのコンテキストにアクセスできなくなります。詳細な説明はthisをチェックしてください。

編集:もちろん、同じドメインにいる場合は、SLaksの回答が完全に適用されます。

6

フレーム間で値を共有することは不可能ではありませんが、注意する必要があります。 Internet Explorerで、次のシナリオは、エラーになります:

  1. どこか(フレームB内の値を保存し、フレームB内の関数へのJavaScriptオブジェクトを渡すフレームAに
  2. をJavaScriptオブジェクトを作成)AがフレームBに新しいページ
  3. コードとリロードさ
  4. フレームは、AからオブジェクトのInternet Explorerがそれを好きではない(旧)フレームA.

から保存されたオブジェクトを参照しようとしデフンtページが参照されます。

3

さて、それらはちょうど異なるグローバルオブジェクトとグローバルスコープを持っています。ただし、同じドメインにある場合は、コードを別のドメインから実行できます。しかし、あなたは(親ウィンドウ内で)これを実行した場合:

のiframeのグローバルスコープ内のグローバル変数 globalArrayを作成
document.getElementById("myiframe").contentWindow.window.globalArray = []; 

Arrayは、IFRAMEのArrayコンストラクタを参照しているため、その後のiframe内

console.log(globalArray instanceof Array);

falseを返します。

console.log(globalArray instanceof top.Array); 

ここで、topは、コンテナウィンドウのグローバルオブジェクトを参照しています。

jsfiddle:http://jsfiddle.net/EFbtN/

関連する問題