2

親ページに javascript を使用せずに、兄弟の iFrame に postMessage を送信する方法を探しています。私が抱えている問題は、最初の iFrame から他の iFrame のウィンドウ オブジェクトを取得しようとすることです

ページは次のようにレイアウトされます。

html body (http://host.com/)
  iFrame#a (http://me.com/a)
  iFrame#b (http://me.com/b)

iFrame#a私がやろうとしているから:

(iFrame#b window).postMessage(...)

iFrame#b問題は、内からウィンドウ オブジェクトを取得する方法がわからないことiFrame#aです。parent.getElementById()およびその他の機能は XSS 制限の対象となります。上記の例で、postMessage私のドメインから親ページにある他のすべての iFrame にa を発行したいだけです。http://me.com/

4

2 に答える 2

10

別のドメインにある別のウィンドウ/iframe とやり取りすることはできませんが、そのようなウィンドウ/iframe およびそのウィンドウ/iframe に埋め込まれたすべての子 iframe への参照を取得することは可能です。それを行う方法は、window.top.frames(最上位のウィンドウ オブジェクトにアクセスするため) またはwindow.parent.frames(直接の親ウィンドウ オブジェクトにアクセスするために) を使用することですが、他の上位レベルの祖先が存在する場合もあります。getElementByIdまたは他のDOM関連の機能を使用する必要はありません。詳細については、https ://developer.mozilla.org/en-US/docs/DOM/window.frames を参照してください。

window.frames プロパティは、配列のようなオブジェクトを返します。これを反復処理して、iframe ごとに postMessage を実行できます。postMessage を使用する以外の方法でウィンドウとやり取りしていないため、これは同じオリジンの制限をトリガーしません。特定のドメインからのすべての iframe で postMessage を実行したい場合は、次のようにするだけです。

var frames = window.parent.frames;
for (var i = 0; i < frames.length; i++) { 
  frames[i].postMessage("hello", targetDomain);
}
于 2012-09-17T11:40:44.827 に答える
2

親が同じドメインの下にない限り(あなたの例ではそうではありません)、iframeは埋め込まれたページ(またはそのページ内のもの)と対話できないため、これを行うことはできません。可能であれば、あなたが認識していることを示したように、XSS セキュリティの問題が発生します。

代わりに、次のことができます。

  • /a/ に Cookie を設定し、/b/ でそれをポーリングします (ただし、/b/ は何らかの形でサーバーへの呼び出しを継続する必要があるため、これにはコストがかかります)。
  • 「HTML5」永続データ ストレージ メカニズムを使用して、/a/ からデータを保存し、/b/ にポーリングします (おそらくlocalStorageを使用できます)。
  • Websocketを使用して、サーバー経由ですべての兄弟をリンクします
  • あなたがやろうとしていることを再考してください: あなたが達成しようとしていることは非常に奇妙に聞こえます.このような iframe を使用するよりも良い方法はありませんか?
于 2012-09-16T22:54:01.770 に答える