IFRAME과 메시지 전달

window.postMessage를 이용하면 iframe안의 페이지와 메시지를 주고 받을 수 있다.

iframe의 도메인이 다른 경우에도 사용할 수 있으며 IE8에서도 사용이 가능하다고 되어있으나 안되는 경우가 종종 있는 것 같다. ( http://caniuse.com/#search=postMessage );

메시지 송신

window.postMessage( data, [ports], targetOrigin );

data : 전달할 메시지 ( string )
ports : 메시지 포트(생략 가능)
targetOrigin : 메시지를 수신받는 도메인. 특정 도메인이 아니라면 * 로 지정한다

메시지 수신

window.addEventListener( 'message', function( e ) {
     // e.data가 전달받은 메시지
     console.log( e.data );
} );

e.data : 전달받은 메시지
e.origin : 송신자의 도메인

예시 )

1. 부모가 자식 iframe에 메시지 전달

부모 HTML ( 메시지 전송할 버튼과 Iframe 생성 )

 <button id="btn">자식에게 메시지 전송</button>
<iframe id="child" src="/lab/postMessage/child.html" width="100%" height="300px" frameborder="0"></iframe> 

부모 javascript ( 자식 Iframe에 메시지 전달 )

var btn = document.getElementById( 'btn' );       // 메시지 전송 버튼
var child = document.getElementById( 'child' );   // iframe

// 버튼 클릭하면 메시지 전달 함수 호출
btn.addEventListener( 'click', function( e ) {
    sendMsgToChild( '아들! 딸!' );
});

// 자식에게 메시지 전달
function sendMsgToChild( msg ) {
    child.contentWindow.postMessage( msg, '*' );
}

부모로부터의 메시지를 수신하는 EventListener 등록한다.  postMessage 함수는 window 객체에 접근해서 실행해야 하는데 iframe의 window에 접근하려면 contentWindow를 사용하여야 한다. contentWindow 속성은  iframe 에 의해 생성된 Window 객체를 말한다.

자식 Iframe의 javascript ( 부모로부터 메시지 수신 )

window.addEventListener( 'message', receiveMsgFromParent );
// 부모로부터 메시지 수신
function receiveMsgFromParent( e ) {
    // e.data가 전달받은 메시지
    console.log('부모로 부터 받은 메시지 ', e.data );
}

2. 자식 iframe이 부모에게 메시지 전달

부모 javascript ( 자식으로부터 메시지 수신 )

// 메시지 수신 받는 eventListener 등록
window.addEventListener( 'message', receiveMsgFromChild );

// 자식으로부터 메시지 수신
function receiveMsgFromChild( e ) {
    console.log( '자식으로부터 받은 메시지 ', e.data );
}

자식 Iframe의 HTML ( 전송 버튼 생성 )

 <button id="btn">부모에게 메시지 전송</button> 

자식 Iframe의 javascript ( 부모에게 메시지 전달 )

var btn = document.getElementById( 'btn' );

btn.addEventListener( 'click', function( e ) {
    sendMsgToParent( '엄마! 아빠!' );
});

// 부모에게 메시지 전달
function sendMsgToParent( msg ) {
    window.parent.postMessage( msg, '*' );
}

자식 iframe에서 window.parent는 부모의 window 객체이다.