2009-12-22 6 views
15

페이지에 iframe이 생성되어 있고 해당 페이지의 도메인이 명시 적으로 'xyz.com'으로 설정되어 있지만 iframe의 도메인은 'dev.xyz.com'으로 기본 설정되어 있습니다. 실제 도메인을 개발하고 있습니다.도메인 간 iframe 통신

iframe.contentWindow.document를 통해 해당 iframe에 액세스하려고하면 도메인의 차이로 인해 문제가 발생합니다.

나는 ... 그 트릭을하고있을 것 같지 않습니다 = 'xyz.com'하지만, document.domain을 가진 파일에 iframe을의 SRC를 설정

어떤 아이디어를 시도했습니다?

+0

다음은 iframe을 생성하고 액세스하려고 시도하는 코드입니다. jQuery ("body"). prepend (''); var ihistory = jQuery ("# jQuery_history") [0]; var iframe = ihistory.contentWindow.document; – Chris

+1

이 라이브러리는 resize + hash가있는 HTML5 postMessage 및 레거시 브라우저를 지원합니다. https://github.com/ternarylabs/porthole (Ben Alman의 jQuery 플러그인은 3 년 만에 사용되지 않았습니다) – jpillora

+0

Ben Alman은 멋진 jquery 플러그인을 제공합니다. 이 문제를 해결하는 데 사용됩니다. http://benalman.com/projects/jquery-postmessage-plugin/ – Justin

답변

11

페이지 안에 iframe에서 :

<script> 
document.domain = document.domain; 
</script> 

그것은 바보 보이지만, 그것을 작동합니다. "What does document.domain = document.domain do?"을 참조하십시오.

+19

왜 이렇게합니까? 작업? – ripper234

+1

그건 더러운 속임수 야, 나는 그것을 좋아한다. –

+0

** 더러운 해킹은 ** Access-Control-Allow-Origin ** 요청을받을 때 AJAX의 유사한 CDN이 JS에서로드 될 때 방해가됩니다. 사용에주의하십시오. – Farside

8

약간의 연구 끝에 postMessage가 다양한 트릭을 사용하는 구형 브라우저와 역 호환되도록 해주는 jQuery plugin을 발견했습니다. iframe이 페이지에서

// executes when a message is received from the iframe, to adjust 
    // the iframe's height 
    $.receiveMessage(
     function(event){ 
      $('my_iframe').css({ 
       height: event.data 
      }); 
    }); 
    // Please note this function could also verify event.origin and other security-related checks. 

: 호스트 (상위) 페이지에서

: 여기

부모 창에 iframe이의 몸의 높이를 보내는 방법을 보여주는 간단한 예입니다 : 나는 XP에 크롬 13 세 이상, 파이어 폭스 3.6 이상, Internet Explorer 7, 8, 9에서이 작업을 테스트 한

$(function(){ 

    // Sends a message to the parent window to tell it the height of the 
    // iframe's body   
    var target = parent.postMessage ? parent : (parent.document.postMessage ? parent.document : undefined); 

    $.postMessage(
     $('body').outerHeight(true) + 'px', 
     '*', 
     target 
    ); 

}); 

및 W7, OSX 및 W7의 사파리. ;)

0

Ben Alman 플러그에 대한 참조에 추가하여이 작업 예제를 게시하겠다고 생각했습니다. 그것은 jRery 인증을 포함하는 소스 페이지가있는 iframe의 rRelies입니다. & 데이터 쿼리 스크립트는 메시지 플러그인을 사용하여 {other domain} 상위 창으로 결과를 전달합니다. JQ의 V9를 사용하는 JQV9는 플러그인에서 참조 "브라우저"를 사용하지 않는 경우

NB 메시지 플러그인은 중단됩니다

1 단계 : 모두 전송 및 수신 문서에 플러그인 코드를 추가

http://benalman.com/projects/jquery-postmessage-plugin/

2 단계 : 보내는 문서에이 추가 :

$.postMessage(
$(X).html(),  
'http://DOMAIN [PORT]/FOLDER/SUBFOLDER/RECIEVINGDOCNAME.XXX' 
) ;  

여기서 X는 미리 포맷 된 json 배열 또는 기타 내용을 포함하는 로컬 변수 일 수 있으며 여기에서 http url은 수신 문서의 주소입니다.

3 단계 : 는 수신 문서에이 추가 :

$.receiveMessage(
    function(event){ 
     alert("event.data: "+event.data); 
       $("#testresults").append('<h1>'+event.data+'<h1>'); 

    },   
    'http://DOMAIN.COM OR SOMETHING' 

); 

는 HTTP URL이 전송 문서의 DOMAIN이다. Internet Explorer 8, 9, FF16, Safari Windows (Windows 대기 x V9 아직 테스트하지 않음), Safari x Mac에 좋습니다.

그 결과는 다른 도메인 페이지에서 원하는 항목입니다 (..에 액세스 할 수 있음).