これはWebKit固有のブラウザです(WebKit固有のもの、つまりiOS/Androidブラウザで動作させる必要がありますが、Chromeでテストしています)。JavaScriptでウィンドウとフレームの間でデータを共有する方法
私はページを持っています。ページには、別のドメインのコンテンツを含む1つ以上のiframeが読み込まれます。これらのiframeからメッセージ(postMessage()を使用して)を受け取る必要があり、特定のメッセージがどのiframeから来たのかを特定できる必要があります。
iframeのコンテンツが返されるようなiframe URLを投げることを含まない方法を見つけることができません。私はURLに憂慮する必要はありません。私は安全にそれを行うことができるという保証はありません(例えば、リダイレクトはパラメータを投げることができます)。
私は妥当だと思ったことを試しました。 iframe要素を作成すると(J/Sから実行されます)、要素にプロパティを関連付けました。「shared_secret」としましょう。フレームからメッセージイベントを取得したら、呼び出しフレームが作成された要素を探して、そのプロパティを読み取ろうとしました。
function onMessage(evt) {
var callerId = evt.source.frameElement.shared_secret;
// ....
}
window.addEventListener(message, onMessage);
var frameEl = document.createElement('iframe');
frameEl.shared_secret = 'sommething blue';
frameEl.src = 'http://aliens.com/my.html';
somewhereInMyDoc.appendChild(frameEl);
場合、フレームロード、それが実行される:
window.parent.postMessage('do you know who I am?', '*');
を但し、frameElement)が(上記のonMessageに未定義判明。セキュリティ上の理由から、親/子が同じドメインに属する場合は完全に機能します。
それは実際に皮肉です。 event.sourceはエイリアンウィンドウなので、親ウィンドウはevent.source.frameElementにアクセスできません。 frameElementはエイリアンウィンドウにあるため、iFrameウィンドウはwindow.frameElementを呼び出すことはできません。誰もそれにアクセスすることはできません。
それで、私は新たにロードされたフレームに設定できるトークンとして何かがありますが、何とか戻ってきますか?
ありがとうございます。
あなたは子供のiframeから親ウィンドウにアクセスしようとしていますか? – Roman
私はお互いからウィンドウにアクセスしようとしていません。私はメッセージAPIを使用していますが、私はどの子どもが電話しているのか知る必要があります。そして、事前に識別文字列に同意する方法はありません。 –
event.originフィールドに必要な値はありませんか? http://dev.w3.org/html5/postmsg/#dom-messageevent-origin – Roman