[javascript] 부모 페이지에서 iframe으로 JavaScript 코드 호출

기본적으로, 나는 한 iframe페이지에 포함하고는 iframe몇 가지가 자바 스크립트 내가 부모 페이지에서 호출 할 필요가 루틴을.

이제는 전화해야하기 때문에 그 반대가 매우 간단 parent.functionName()하지만 불행히도 나는 그 반대가 필요합니다.

내 문제는의 소스 URL 을 변경하는 것이 아니라에 iframe정의 된 함수를 호출하는 것 iframe입니다.



답변

iFrame의 ID가 “targetFrame”이고 호출하려는 함수가 다음과 같다고 가정하십시오 targetFunction().

document.getElementById('targetFrame').contentWindow.targetFunction();

window.frames대신을 사용하여 프레임에 액세스 할 수도 있습니다 document.getElementById.

// this option does not work in most of latest versions of chrome and Firefox
window.frames[0].frameElement.contentWindow.targetFunction(); 


답변

여기서 알아야 할 몇 가지 단점이 있습니다.

  1. HTMLIFrameElement.contentWindow아마도 더 쉬운 방법 일지 모르지만 표준 속성은 아니며 일부 브라우저는 대부분 오래된 브라우저를 지원하지 않습니다. DOM Level 1 HTML 표준은 window객체 에 대해 아무 말도하지 않기 때문 입니다.

  2. HTMLIFrameElement.contentDocument.defaultView몇 가지 구형 브라우저는 허용하지만 IE는 허용하지 않는을 시도 할 수도 있습니다 . 그럼에도 불구하고 표준은 window(1)과 같은 이유로 객체를 다시 가져 왔다고 명시 적으로 말하지 않지만, 관심이 있다면 여기에서 몇 가지 추가 브라우저 버전을 선택할 수 있습니다.

  3. window.frames['name']창을 반환하는 것이 가장 오래되고 가장 안정적인 인터페이스입니다. 그러나 name="..."이름으로 프레임을 얻을 수 있으려면 속성 을 사용해야합니다 . 이는 약간 추한 / 더 이상 사용되지 않거나 / 전환 된 것입니다. ( id="..."더 좋을 것이지만 IE는 그것을 좋아하지 않습니다.)

  4. window.frames[number]또한 매우 신뢰할 만하지 만 올바른 색인을 아는 것이 속임수입니다. 예를 들어이 문제를 해결할 수 있습니다. 페이지에 iframe이 하나만 있다는 것을 알고 있다면

  5. 자식 iframe이 아직로드되지 않았거나 액세스 할 수 없도록 잘못되었습니다. 통신 흐름을 반대로하는 것이 더 쉽다는 것을 알게 될 것입니다. 즉, 아이 iframe window.parent이로드가 완료되고 다시 호출 될 준비가되면 스크립트에 알리도록합니다 . 자체 객체 중 하나 (예 : 콜백 함수)를 상위 스크립트에 전달하면 해당 상위는 연관된 HTMLIFrameElement에 대해 걱정할 필요없이 iframe의 스크립트와 직접 통신 할 수 있습니다.


답변

에서 부모 JS 함수를 호출 할 iframe수 있지만 부모와 페이지에로드 된 페이지가 모두 iframe같은 도메인 (예 : abc.com)에서 온 경우와 둘 다 동일한 프로토콜을 사용하는 경우에만 둘 다 on http://또는 https://입니다.

아래 언급 된 경우 통화가 실패합니다.

  1. 부모 페이지와 iframe 페이지는 다른 도메인에 있습니다.
  2. 그들은 다른 프로토콜을 사용하고 있습니다. 하나는 http : //에 있고 다른 하나는 https : //에 있습니다.

이 제한에 대한 해결 방법은 매우 안전하지 않습니다.

예를 들어 도메인 superwinningcontest.com을 등록하고 사람들의 이메일에 대한 링크를 보냈다고 상상해보십시오. 그들이 메인 페이지를로드 할 때 iframe거기에 몇 가지를 숨기고 Facebook 피드를 읽거나 최근 Amazon 또는 PayPal 거래를 확인하거나 충분한 보안을 구현하지 않은 서비스를 사용하는 경우 돈을 송금 할 수 있습니다 계정. 이것이 JavaScript가 동일한 도메인 및 동일한 프로토콜로 제한되는 이유입니다.


답변

IFRAME에서 함수를 창 객체에 공개하십시오.

window.myFunction = function(args) {
   doStuff();
}

부모 페이지에서 액세스하려면 다음을 사용하십시오.

var iframe = document.getElementById("iframeId");
iframe.contentWindow.myFunction(args);


답변

iFrame의 대상과 포함하는 문서가 다른 도메인에있는 경우 이전에 게시 된 방법이 작동하지 않을 수 있지만 해결 방법이 있습니다.

예를 들어, 문서 A에 문서 B가 포함 된 iframe 요소가 있고 문서 A의 스크립트가 문서 B의 Window 객체에서 postMessage ()를 호출하면 해당 객체에서 메시지 이벤트가 시작되고 문서 A의 스크립트는 다음과 같습니다.

var o = document.getElementsByTagName('iframe')[0];
o.contentWindow.postMessage('Hello world', 'http://b.example.org/');

들어오는 이벤트에 대한 이벤트 핸들러를 등록하기 위해 스크립트는 addEventListener () (또는 유사한 메커니즘)를 사용합니다. 예를 들어, 문서 B의 스크립트는 다음과 같습니다.

window.addEventListener('message', receiver, false);
function receiver(e) {
  if (e.origin == 'http://example.com') {
    if (e.data == 'Hello world') {
      e.source.postMessage('Hello', e.origin);
    } else {
      alert(e.data);
    }
  }
}

이 스크립트는 먼저 도메인이 예상 도메인인지 확인한 다음 사용자에게 표시하거나 메시지를 보낸 문서로 메시지를 다시 보내 메시지에 응답하는 메시지를 확인합니다.

http://dev.w3.org/html5/postmsg/#web-messaging을 통해


답변

기록을 위해 오늘도 같은 문제가 발생했지만 이번에는 페이지가 iframe이 아닌 객체에 포함되었습니다 (XHTML 1.1 문서이므로). 객체와 작동하는 방법은 다음과 같습니다.

document
  .getElementById('targetFrame')
  .contentDocument
  .defaultView
  .targetFunction();

(못생긴 줄 바꿈에 대해 죄송하지만 한 줄에 맞지 않았습니다)


답변

IFRAME은 frames[]컬렉션에 있어야합니다 . 같은 것을 사용하십시오

frames['iframeid'].method();