iframeと親サイトの間の通信方法は?


185

iframeのウェブサイトは同じドメインありませんが、どちらも私のドメインiframeです。と親サイトの間で通信したいと考えています。出来ますか?

回答:


307

異なるドメインでは、メソッドを呼び出したり、iframeのコンテンツドキュメントに直接アクセスしたりすることはできません。

クロスドキュメントメッセージングを使用する必要があります。

たとえば、上のウィンドウでは:

 myIframe.contentWindow.postMessage('hello', '*');

そしてiframeで:

window.onmessage = function(e){
    if (e.data == 'hello') {
        alert('It works!');
    }
};

iframeから親ウィンドウにメッセージを投稿する場合

window.top.postMessage('hello', '*')

2
ありがとうございましたが、残念ながら古いブラウザでは動作しません。
ダニーフォックス

106
親:window.onmesage = function()...。iframe内:window.top.postMessage('hello', '*')
user123444555621

3
バグではありません。ファイルのURLは非常に安全ではない可能性があり、ブラウザはますます注意してそれらを扱います。昔file://C:/Windows/system32/whateverは、Webページにリンクを配置して、ユーザーのシステムフォルダを直接指すようにすることができました。最近のブラウザは、そのようなリンクのクリックをほとんど無視しています。ウェブサーバーを実行してコードにアクセスすると、エラーが表示されなくなります。
Stijn de Witt 14年

4
ターゲットとして「*」を使用しないことをお勧めします。実際、MDNは次のように述べています。「他のウィンドウのドキュメントを配置する場所がわかっている場合は、*ではなく常に特定のtargetOriginを提供してください。特定のターゲットを提供しないと、関心のある悪意のあるサイトに送信するデータが開示されます。」
Rodiwa、2015年

2
を使用window.frames[index]して、子フレーム(<iframe>, <object>, <frame>)を取得することもできgetElementsByTagName("iframe")[index].contentWindowます。親ウィンドウオブジェクトをIFrameから取得するには、最上位の親ウィンドウwindow.parentwindow.top表すを使用することをお勧めします
phoenisx

46

2012年からの回答が承認されたため、ここにある必要があります

2018年および最新のブラウザーでは、カスタムイベントをiframeから親ウィンドウに送信できます。

iframe:

var data = { foo: 'bar' }
var event = new CustomEvent('myCustomEvent', { detail: data })
window.parent.document.dispatchEvent(event)

親:

window.document.addEventListener('myCustomEvent', handleEvent, false)
function handleEvent(e) {
  console.log(e.detail) // outputs: {foo: 'bar'}
}

PS:もちろん、同じ方法でイベントを反対方向に送信できます。

document.querySelector('#iframe_id').contentDocument.dispatchEvent(event)

1
こんにちは、同じドメインにいる必要がありますか?
ギョームハラリ


1
dispatchEventはすべての主要ブラウザでサポートされていることに注意してください。IE9が最初のバージョンでしたので、ほとんどのOSがIE9で動作します。caniuse.com/#search=dispatchEvent
Dan Atkinson

1
この方法では、親からiframeに通信できません。
Avan

ええ、私はそれを動作させることもできません、iframe jsは親ウィンドウの後に読み込まれているので、送信時にメッセージを受信するためにそこにはありません。私にとってはiframeから親までしか機能しません。
radtek

14

このライブラリは、resize + hash https://github.com/ternarylabs/portholeを使用してHTML5 postMessageおよびレガシーブラウザをサポートします

編集:現在2014年には、IE6 / 7の使用率はかなり低く、IE8以上がサポートされているpostMessageため、今すぐ使用することをお勧めします。

https://developer.mozilla.org/en-US/docs/Web/API/Window.postMessage


IE8 / 9は文字列caniuse.com/#search=postmessageのみをサポートするという警告(既知の問題を参照)
Harry

これを回避するには、イベントオブジェクトをjsonにエンコードして、反対側でデコードします。
codewandler 2017年



1

event.source.window.postMessage送信者に送り返すために使用します。

iframeから

window.top.postMessage('I am Iframe', '*')
window.onmessage = (event) => {
    if (event.data === 'GOT_YOU_IFRAME') {
        console.log('Parent received successfully.')
    }
}

その後、親から言い返します。

window.onmessage = (event) => {
    event.source.window.postMessage('GOT_YOU_IFRAME', '*')
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.