2010-05-02 3 views
14

나는 다소 흥미로운 문제가 있습니다. 대화 상자에 포함 된 iframe이있는 모달 jquery 대화 상자를 만드는 부모 페이지가 있습니다. iframe에는 타사 도메인의 콘텐츠가 채워집니다. 내 문제는 iframe의 내용이 성공적으로로드되고 5 초 내에 있지 않으면 대화 상자를 닫고 부모 페이지로 사용자를 반환 할 수 있는지 감지 할 수있는 대화 상자 수준의 자바 스크립트를 만들어야한다는 것입니다.iframe 콘텐츠로드 감지 교차 도메인

저는 수많은 솔루션을 연구했으며 두 가지만 사실입니다.

  1. 원격 사이트에서 document.domain = 'our-domain.com'의 javascript 행을 포함하십시오.
  2. URL 조각 해킹을 사용하지만 원격 사이트 에 URL 끝에 '#some_value'을 추가하여 URL을 수정할 수있는 요청이 필요합니다. 대화 상자 창은 URL을 폴링해야합니다. 그것을 보거나 시간 초과합니다.

솔직히 내가 함께해야 할 유일한 옵션입니까? 이걸 감지하는 간단한 방법이 없습니까?

HTTP 응답 오류를 폴링하는 방법이 있다면 연구하고 있지만 여전히 동일한 제한 사항에 국한되어 있습니다.

도움이 될만한 의견을 보내 주시면 감사하겠습니다.

감사

답변

10

가장 쉬운 방법은 (외부 사이트에 코드를 추가 할 수있는 경우) 도메인의 특수 html 파일을 가리키는 보이지 않는 iframe을 추가하는 것입니다.그러면 parent.parent.foo()을 사용하여로드 이벤트에 대해 원본 창에 알릴 수 있습니다.

"로드"이벤트를 수신하면로드 된 윈도우가 아닌로드 된 이벤트 또는 문서가 상호 작용할 준비가되었는지 여부 만 알려줍니다.

+0

이것은 확실한 옵션처럼 들립니다. 나는이 옵션을 고려할 것인지를 알기 위해 개발자에게 제안 할 것입니다. 감사합니다. –

+2

+1은 나의 특정한 문제에 대한 유일한 해결책이라고 생각합니다. 감사. – Town

+0

이것은 놀랍게도 생각할 때까지 훌륭하게 작동합니다. – Kaganar

2

당신은 프레임 사이의 통신에 postMessage를 사용하여 시도 할 수 있습니다.
로드가 완료되면 부모 사이트에 메시지를 게시하기 위해 원격 사이트에 특정 JavaScript가 포함되어야합니다.

+0

내가 할 수있는. 죄송합니다.이 기능은 IE 6,7 및 8의 클라이언트 사양대로 작동해야합니다. –

+0

[뻔뻔한 광고] 나는 당신의 웹 사이트에 보안 버그를 열지 못하게 도와주기 위해 마이크로 프레임 워크를 만들었습니다 : https://github.com/Okrajs/Okrajs –

3

Nicholas Zakas는 iframe을로드했는지 감지하는 방법에 대한 기사가 있습니다 : http://www.nczonline.net/blog/2009/09/15/iframes-onload-and-documentdomain/. 기본적으로이 코드가 있습니다

var iframe = document.createElement("iframe"); 
iframe.src = "simpleinner.htm"; 

if (iframe.attachEvent){ 
    iframe.attachEvent("onload", function(){ 
     alert("Local iframe is now loaded."); 
    }); 
} else { 
    iframe.onload = function(){ 
     alert("Local iframe is now loaded."); 
    }; 
} 

document.body.appendChild(iframe); 

나는 그것을 테스트하지 않은,하지만 난 jQuery를 당신이 몇 가지가 필요합니다 어떤 경우 $("#iframe").load(function() { alert("Local iframe is now loaded."); });

+0

코드를 보내 주셔서 감사합니다. 나는 그것을 시도하고 이것이 어떻게 작동하는지 보겠습니다. –

0

같은 일을하여 처리 할 수 ​​있어야합니다 확실 해요 다른 도메인의 서버에서 일종의 협력을 악용하려는 경우 Same Origin Policy (SOP)

도메인이 다른 경우 첫 번째 해결책 document.domain=...은 작동하지 않습니다. 위의 링크에서 설명한 것처럼 하위 도메인과 포트에서만 작동합니다.

폴링없이 도메인 간 통신을 허용하는 유일한 옵션은 JSONP 또는 JS 함수 콜백이있는 스크립트 삽입입니다. 이 방법은 모든 Google API에서 사용할 수 있으며 잘 작동합니다.

our blog에서 iframe에서 이러한 호출을 샌드 박스로 보호하는 방법을 설명했습니다. postMessage이 더 나아지는 동안 window.name hack은 오래된 브라우저에서 작업하는 장점이 있습니다.

역설적으로 SOP는 다른 도메인에 POST를 수행하는 것을 방해하지 않습니다. 그러나 당신은 그 반응을 읽을 수 없을 것입니다.

+1

글쎄, 나는 SOP 정책을 '남용하려하지 않고있다. 그러나 이것에 대한 필요성은 사용자의 활동에서 중요한 단계에있다. 예, 위에서 언급 한 브라우저에서 작동해야합니다. 이상하게도 다른 브라우저는 현재 사양에 없습니다. 아직! 해당 링크를 살펴보고 추가 정보를 보내 주셔서 감사합니다. –

1

iframe 자체에서 onload 핸들러를 사용하여이를 수행 할 수 있습니다. 불행히도 (놀라움!) IE는 어렵게 만듭니다. 이 작업을 수행 할 수있는 유일한 방법은 iframe에 대해 HTML을 작성한 다음 innerHTML으로 문서에 추가하는 것입니다. 그런 다음 DOM에 iframe이 표시되는 시점을 확인하기 위해 폴링해야하며, 페이지가로드 중인지 여부에 따라 다릅니다. 다음은 출처로 연결되는 링크입니다. http://svn.openlaszlo.org/openlaszlo/trunk/lps/includes/source/iframemanager.js

, __finishCreate()gotload()을 참조하십시오. 이 복사본을 가지고 직접 사용해보십시오! 단지 IE8에서 작동 네,하지만

감사합니다, 최대 칼슨 OpenLaszlo.org

+1

가능한 솔루션을 제공해 주셔서 감사합니다. Max. 내 동료 & 나는 postMessage 메서드를 사용해보기로 결정했습니다. 이것이 IE 6 & 7에서는 작동하지 않지만, 우리가 클라이언트에게 postMessage의 사용에 동의하게 할 수 있다면 우리의 즉각적인 필요는 충분하다는 것을 알게되었습니다. 나는 당신의 제안을 기꺼이 검토 할 것입니다. :) –

관련 문제