기본적으로, 나는 한 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();
답변
여기서 알아야 할 몇 가지 단점이 있습니다.
-
HTMLIFrameElement.contentWindow
아마도 더 쉬운 방법 일지 모르지만 표준 속성은 아니며 일부 브라우저는 대부분 오래된 브라우저를 지원하지 않습니다. DOM Level 1 HTML 표준은window
객체 에 대해 아무 말도하지 않기 때문 입니다. -
HTMLIFrameElement.contentDocument.defaultView
몇 가지 구형 브라우저는 허용하지만 IE는 허용하지 않는을 시도 할 수도 있습니다 . 그럼에도 불구하고 표준은window
(1)과 같은 이유로 객체를 다시 가져 왔다고 명시 적으로 말하지 않지만, 관심이 있다면 여기에서 몇 가지 추가 브라우저 버전을 선택할 수 있습니다. -
window.frames['name']
창을 반환하는 것이 가장 오래되고 가장 안정적인 인터페이스입니다. 그러나name="..."
이름으로 프레임을 얻을 수 있으려면 속성 을 사용해야합니다 . 이는 약간 추한 /더 이상 사용되지 않거나/ 전환 된 것입니다. (id="..."
더 좋을 것이지만 IE는 그것을 좋아하지 않습니다.) -
window.frames[number]
또한 매우 신뢰할 만하지 만 올바른 색인을 아는 것이 속임수입니다. 예를 들어이 문제를 해결할 수 있습니다. 페이지에 iframe이 하나만 있다는 것을 알고 있다면 -
자식 iframe이 아직로드되지 않았거나 액세스 할 수 없도록 잘못되었습니다. 통신 흐름을 반대로하는 것이 더 쉽다는 것을 알게 될 것입니다. 즉, 아이 iframe
window.parent
이로드가 완료되고 다시 호출 될 준비가되면 스크립트에 알리도록합니다 . 자체 객체 중 하나 (예 : 콜백 함수)를 상위 스크립트에 전달하면 해당 상위는 연관된 HTMLIFrameElement에 대해 걱정할 필요없이 iframe의 스크립트와 직접 통신 할 수 있습니다.
답변
에서 부모 JS 함수를 호출 할 iframe
수 있지만 부모와 페이지에로드 된 페이지가 모두 iframe
같은 도메인 (예 : abc.com)에서 온 경우와 둘 다 동일한 프로토콜을 사용하는 경우에만 둘 다 on http://
또는 https://
입니다.
아래 언급 된 경우 통화가 실패합니다.
- 부모 페이지와 iframe 페이지는 다른 도메인에 있습니다.
- 그들은 다른 프로토콜을 사용하고 있습니다. 하나는 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();