답변:
다른 도메인에서는 메소드를 호출하거나 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
에는 웹 페이지에 링크를 넣고 사용자의 시스템 폴더를 바로 가리킬 수있었습니다. 요즘 브라우저는 대부분 그런 링크의 클릭을 무시합니다. 웹 서버를 실행하고이를 통해 코드에 액세스하면 오류가 사라지는 것을 볼 수 있습니다.
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'}
}
추신 : 물론, 같은 방식으로 반대 방향으로 이벤트를 보낼 수도 있습니다.
document.querySelector('#iframe_id').contentDocument.dispatchEvent(event)
dispatchEvent
모든 주요 브라우저에서 지원됩니다. IE9는 처음 출시 된 버전이므로 대부분의 OS에서 작동합니다. caniuse.com/#search=dispatchEvent
이 라이브러리는 resize + hash가있는 HTML5 postMessage 및 기존 브라우저를 지원합니다 https://github.com/ternarylabs/porthole이있는
편집 : 이제 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', '*')
}