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
고맙지 만 불행히도 이전 브라우저에서는 작동하지 않습니다.
Danny Fox

106
부모님 : window.onmesage = function().... iframe에서 :window.top.postMessage('hello', '*')
user123444555621

3
버그가 아닙니다. 파일 URL은 매우 안전하지 않을 수 있으며 브라우저는 계속해서주의를 기울여 처리하고 있습니다. 예전 file://C:/Windows/system32/whatever에는 웹 페이지에 링크를 넣고 사용자의 시스템 폴더를 바로 가리킬 수있었습니다. 요즘 브라우저는 대부분 그런 링크의 클릭을 무시합니다. 웹 서버를 실행하고이를 통해 코드에 액세스하면 오류가 사라지는 것을 볼 수 있습니다.
Stijn de Witt

4
모범 사례로 대상에 '*'를 사용하지 마십시오. 실제로 MDN은 "다른 윈도우의 문서가 어디에 위치해야하는지 알고있는 경우 항상 *가 아닌 특정 targetOrigin을 제공합니다. 특정 대상을 제공하지 않으면 관심있는 악성 사이트에 보내는 데이터가 공개됩니다"라고 말합니다.
rodiwa

2
window.frames[index]하위 프레임 ( <iframe>, <object>, <frame>) 을 얻는 데 사용할 수도 있습니다 getElementsByTagName("iframe")[index].contentWindow. 더 나은 사용하는 것입니다,의 iframe에서 부모 창 개체를 가져 window.parent로, window.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'}
}

추신 : 물론, 같은 방식으로 반대 방향으로 이벤트를 보낼 수도 있습니다.

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

1
안녕하세요, 같은 도메인에 있어야합니까?
기 illa하라 리


1
주목해야한다 dispatchEvent모든 주요 브라우저에서 지원됩니다. IE9는 처음 출시 된 버전이므로 대부분의 OS에서 작동합니다. caniuse.com/#search=dispatchEvent
Dan Atkinson

1
이 방법으로 부모에서 iframe으로 통신 할 수 없습니다.
Avan

네, iframe js가 부모 창 다음에로드 중이므로 보낼 때 msg를받을 수 없습니다. iframe에서 부모까지만 작동합니다.
radtek

14

이 라이브러리는 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


IE8 / 9는 문자열 caniuse.com/#search=postmessage (알려진 문제 참조) 만 지원한다는 경고와 함께
Harry

이것은 이벤트 객체를 json으로 인코딩하고 반대쪽에서 디코딩하여 해결할 수 있습니다.
codewandler



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.