3

の JavaScript<iframe>では、親ウィンドウで関数を呼び出す必要があります。両方のウィンドウが同じドメインからのものです。

安全に使用できwindow.parent.myFunction();ますか?

4

1 に答える 1

2

簡潔な答え

window.parentはい、同一ドメインからご利用いただけます。

WhatWG 仕様の第6 章: Web ページの読み込みには、次のように書かれています。

  • iframe.parent存在する
  • iframe.parentiframeの親のDOM へのプロキシです
  • オリジンが同じならアクセス可

本当に長い、長い答え

心に留めながら、仕様を読むことでこの結論に到達する方法をお見せしようとしていますparentiframe

はじめましょう。長文です。

1.DOM属性parent

WhatWG#dom-parentについてwindow.parent:

ブラウジング コンテキスト b 内のaWindowのオブジェクトの親 IDL 属性は、親ブラウジング コンテキストが存在する場合 (つまり、bが子ブラウジング コンテキストの場合)、またはブラウジング コンテキストb自体のオブジェクトを返す必要があります。 (つまり、トップレベルのブラウジング コンテキストまたは切り離されたネストされたブラウジング コンテキストである場合)。DocumentWindowProxyWindowProxy

parent親ウィンドウの DOM などにアクセスするための属性です。でも:

  • ブラウジング コンテキストとは
  • 何をしWindowProxyますか?

読み続けましょう。

2. ブラウジング コンテキスト

ブラウジング コンテキストは、Documentオブジェクトがユーザーに表示される環境です。

WhatWG#Browsing contextには次のように書かれています:

通常、Web ブラウザーのタブまたはウィンドウには、フレームセット内の iframe やフレームと同様に、ブラウジング コンテキストが含まれています。各ブラウジング コンテキストには、対応する WindowProxy オブジェクトがあります。

3. ウィンドウ プロキシ

ウィンドウ プロキシは、オブジェクトをプロキシしwindow、セキュリティ制約などを実施するためのオブジェクトです。1 つのwindowオブジェクトに対して複数のプロキシが存在する場合があります (たとえばiframes、2 つの異なるドメインから 2 つが同じ親にアクセスする場合など)。

WhatWG#proxy-object のコメント:

WindowProxy オブジェクトを使用すると、各ブラウジング コンテキストに単一の Window オブジェクトがあるかのようにスクリプトを動作させることができますが、ドキュメントごとに個別の Window オブジェクトを保持できます。

4. セキュリティ

私たちは、ほぼ、そこにいる。読み続けます。

WhatWG#security-nav のコメント:

次の条件のいずれかが true の場合、ブラウジング コンテキスト A は 2 番目のブラウジング コンテキスト B をナビゲートできます。
  • A のアクティブ ドキュメントの起点が B のアクティブ ドキュメントの起点と同じである、または
  • ブラウジング コンテキスト A は、トップレベルのブラウジング コンテキストを持つネストされたブラウジング コンテキストであり、そのトップレベルのブラウジング コンテキストは B です。
  • ブラウジング コンテキスト B は補助的なブラウジング コンテキストであり、A は B のオープナー ブラウジング コンテキストをナビゲートすることが許可されています。
  • ブラウジング コンテキスト B はトップレベルのブラウジング コンテキストではありませんが、A のアクティブなドキュメントと同じ起点を持つアクティブなドキュメントを持つ B の祖先ブラウジング コンテキストが存在します (実際には A 自体である可能性があります)。

5.控除

両方が同じドメインからのものである場合、 はiframeその から機能にアクセスできますか? parent推測しましょう。

  1. parentwindow親のオブジェクトではなく、 WindowProxy.
  2. ブラウジング コンテキストは、iframeその親にアクセスできます。これは、両者が同じオリジンを持っているためです (上記の最初のセキュリティ条件を参照)。

ご覧のとおり: 仕様を注意深く読めば、ブラウザーがどのように振る舞うべきかという答えを見つけることができます。仕様を読むことは後天的なスキルです。忍耐と正確さが必要です。

しかし、世界はそれほど素晴らしいものではありません。仕様を適切に実装していないブラウザがあります。emptorに注意してください。

于 2012-10-18T18:18:49.440 に答える