回答:
異なるドメインでは、メソッドを呼び出したり、iframeのコンテンツドキュメントに直接アクセスしたりすることはできません。
クロスドキュメントメッセージングを使用する必要があります。
たとえば、上のウィンドウでは:
myIframe.contentWindow.postMessage('hello', '*');
そしてiframeで:
window.onmessage = function(e){
if (e.data == 'hello') {
alert('It works!');
}
};
iframeから親ウィンドウにメッセージを投稿する場合
window.top.postMessage('hello', '*')
window.onmesage = function()...
。iframe内:window.top.postMessage('hello', '*')
file://C:/Windows/system32/whatever
は、Webページにリンクを配置して、ユーザーのシステムフォルダを直接指すようにすることができました。最近のブラウザは、そのようなリンクのクリックをほとんど無視しています。ウェブサーバーを実行してコードにアクセスすると、エラーが表示されなくなります。
window.frames[index]
して、子フレーム(<iframe>, <object>, <frame>
)を取得することもできgetElementsByTagName("iframe")[index].contentWindow
ます。親ウィンドウオブジェクトをIFrameから取得するには、最上位の親ウィンドウwindow.parent
をwindow.top
表すを使用することをお勧めします
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)
dispatchEvent
はすべての主要ブラウザでサポートされていることに注意してください。IE9が最初のバージョンでしたので、ほとんどのOSがIE9で動作します。caniuse.com/#search=dispatchEvent
このライブラリは、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
window.top
プロパティは、必要なものを提供できる必要があります。
例えば
alert(top.location.href)
http://cross-browser.com/talk/inter-frame_comm.htmlを参照して ください
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', '*')
}