iframe에서 부모 창 함수 호출


282

iframe에서 부모 창 JavaScript 함수를 호출하고 싶습니다.

<script>
    function abc()
    {
        alert("sss");
    }
</script>

<iframe id="myFrame">
    <a onclick="abc();" href="#">Call Me</a>
</iframe>

1
지금 당장 아무 것도 보여줄 수 없습니다 (2016). 나이든 선수가 지원할 지 모르겠습니다
Weijing Jay Lin

답변:


438
<a onclick="parent.abc();" href="#" >Call Me </a>

window.parent 참조

현재 윈도우 또는 서브 프레임의 부모에 대한 참조를 반환합니다.

창에 부모가없는 경우 부모 속성은 자체에 대한 참조입니다.

윈도우가 넣었을 경우 <iframe>, <object>또는 <frame>, 그 부모 윈도우 매립 요소 창이다.


17
항상 상위 문서와 iframe 문서가 프로토콜 및 도메인 이름으로 일치해야한다는 점을 고려하십시오. 발생하지 않으면 도메인 간 스크립팅이 허용되지 않으므로 보안 오류가 발생합니다.
a4bike

M은 둘 중 어느 alert것이 호출 될지 궁금합니다 . alertiframe에서 호출 alert되는 경우 부모의 기능 또는 iframe의 기능 parent.abc();?
Prakhar Mishra

@PrakharMishra 혼동하지 마십시오. 부모는 부모를 의미합니다.
Sahu V Kumar

3
@ 같은 시나리오에 대한 a4bike는, window.postMessage()(나 window.parent.postMessage())이 존재한다. @Andrii 답변
Fr0zenFyr

81

최근에 이것이 왜 작동하지 않는지 알아 내야했습니다.

자식 iframe에서 호출하려는 자바 스크립트는 부모의 머리에 있어야합니다. 본문에있는 경우 전역 범위에서 스크립트를 사용할 수 없습니다.

<head>
    <script>
    function abc() {
        alert("sss");
    }
    </script>
</head>
<body>
    <iframe id="myFrame">
        <a onclick="parent.abc();" href="#">Click Me</a>
    </iframe>
</body>

이것이이 문제를 다시 우연히 발견하는 사람에게 도움이되기를 바랍니다.


1
이 게시물에 언급 된 기술 중 어느 것도 Chrome에서 작동하지 않습니다. 이에 대한 해결책이 있습니까?
Kumar Kush

3
올바르게 기억하면 iframe에 부모와 다른 도메인이 있으면 예상대로 작동하지 않을 수 있습니다. 죄송하지만 이것이 해결책이 아니지만 작동하지 않는 이유를 설명 할 수 있습니다.
Ash Clarke

1
예. 도메인이 다르기 때문에이 문제를 해결할 방법이 없습니까?
Kumar Kush

1
방금 문제의 해결 방법이 무엇인지 게시했습니다. 다른 답변을 살펴보십시오.
Ash Clarke

1
동일한 원본 정책 결정 규칙 ( en.wikipedia.org/wiki/… 참조 )에 따라 하위 도메인은 도메인의 하위 도메인과 다른 호스트 이름으로 간주됩니다. 아직하지 않은 경우 document.domain을 하위 도메인으로 설정해보십시오.
Ash Clarke

73

Window.postMessage ()

이 방법은 안전하게 cross-origin 통신을 합니다.

부모 페이지 코드에 액세스 할 수있는 경우 부모 메서드를 호출 할 수있을뿐 아니라에서 데이터를 직접 전달할 수도 있습니다 Iframe. 다음은 작은 예입니다.

부모 페이지 :

if (window.addEventListener) {
    window.addEventListener("message", onMessage, false);        
} 
else if (window.attachEvent) {
    window.attachEvent("onmessage", onMessage, false);
}

function onMessage(event) {
    // Check sender origin to be trusted
    if (event.origin !== "http://example.com") return;

    var data = event.data;

    if (typeof(window[data.func]) == "function") {
        window[data.func].call(null, data.message);
    }
}

// Function to be called from iframe
function parentFunc(message) {
    alert(message);
}

iframe 코드 :

window.parent.postMessage({
    'func': 'parentFunc',
    'message': 'Message text from iframe.'
}, "*");
// Use target origin instead of *

업데이트 :

보안 정보 :

*다른 창의 문서 위치를 알고있는 경우 항상 특정 targetOrigin, NOT을 제공하십시오 . 특정 대상을 제공하지 않으면 관심있는 악성 사이트 ( ZalemCitizen의 의견)에 보내는 데이터가 공개됩니다 .

참고 문헌 :


1
나는 다른 사람들보다 이것을 사용하는 것을 선호합니다. 특히 크로스 소스 문서에서 iframe을 사용하는 것이 더 합리적이기 때문에 (프로그래머는 iframe을 더 자주 악용하지만) 브라우저에서이 기능을 광범위하게 지원합니다.
Fr0zenFyr

1
감사! 나는 항상 한 시간 이상을 돌아가서 복잡하고 자세한 예제를 통해 메시지를 보내는 방법을 연구해야합니다. 이것은 60 초 안에 작동했습니다. 간결하고 요점에 대한 예를 주셔서 감사합니다.
Randall18 년

2
MDN 웹 문서 에서 올릴 가치 가 있습니다. 다른 창의 문서 위치를 알고 있다면 항상 *가 아닌 특정 targetOrigin을 제공하십시오. 특정 대상을 제공하지 않으면 관심있는 악성 사이트로 보내는 데이터가 공개됩니다
ZalemCitizen

20

기존 답변과 관련이 없으므로이 답변을 별도의 답변으로 게시했습니다.

이 문제는 최근 하위 도메인을 참조하는 iframe에서 부모에 액세스하기 위해 다시 발생했으며 기존 수정이 작동하지 않았습니다.

이번에는 부모 페이지와 iframe의 document.domain을 동일하게 수정했습니다. 이것은 동일한 원산지 정책 점검을 속일 것입니다 동일한 도메인 이 동일한 도메인에 공존한다고 생각하게됩니다 (서브 도메인은 다른 호스트로 간주되고 동일한 원본 정책 확인에 실패 함).

<head>부모 도메인과 일치하도록 iframe의 페이지에 다음을 삽입 합니다 (문서 유형에 맞게 조정).

<script>
    document.domain = "mydomain.com";
</script>

로컬 호스트 개발시 오류가 발생하므로 다음과 같은 확인을 사용하여 오류를 피하십시오.

if (!window.location.href.match(/localhost/gi)) {
    document.domain = "mydomain.com";
} 

localhost에서 이것을 테스트하는 것은 어떻습니까? 그 해결 방법이 있습니까?
Umesh Awasthi

참조 : "로컬 호스트 개발시 오류가 발생하므로 오류를 피하기 위해 다음과 같은 검사를 사용하십시오"
Ash Clarke

2
부모와 자식 모두 (적어도 Chrome에서는) document.domain 중 하나가 이미 "정확한"경우에도 document.domain을 설정해야합니다. 예 : Parent is example.comiframe is abc.example.com이면 부모와 iframe 모두 전화해야합니다document.domain = "example.com"
KillerX

예, 맞습니다. "iframe의 페이지가 동일해야합니다." "페이지와 iframe이 같아야합니다." ..... 감사!
Ash Clarke

if ()에 대해 if (document.domain! = "mydomain.com"을 사용하지 않는 이유는 무엇입니까? 또한 혼란 스럽습니다. <script>가 부모 창이나 iFrame에 있습니까? iFrame의 document.domain에서 " 'Document'에 'domain'속성을 설정하지 못했습니다 : 'localhost'는 'sc-localhost'의 접미사가 아닙니다.
user2568374

18

당신이 사용할 수있는

window.top

다음을 참조하십시오.

<head>
    <script>
    function abc() {
        alert("sss");
    }
    </script>
</head>
<body>
    <iframe id="myFrame">
        <a onclick="window.top.abc();" href="#">Click Me</a>
    </iframe>
</body>

parent.custom_function ()을 호출하려고 할 때; iframe에서 작동하지 않습니다. window.top.custom_function (); 작동합니다. 이상한 이유로 나를 위해 일합니다. 부모 창에 내 자바 스크립트가 모두 바닥 글에 포함되어 있습니다. 바닥 글에 자바 스크립트 파일을 포함하면 문제가 발생한다는 것을 읽습니다 .parent.custom_function () 작동하지 않습니다.
Friso Horstman

@Vinothkumar, 하나의 질문은 "abc ()"만 호출하는 것보다 "window.top.abc ()"호출의 차이입니다. 미리 감사드립니다 =)
Zilev av

@Zilev av이 스레드의 전체 요점은 자식 iframe에서 부모 문서의 함수를 호출하는 것입니다. 그 차이입니다. 부모 페이지가 아닌 iframe에서 선언 abc() 경우에만 호출 이 작동합니다 . iframe에서 상위 문서로 나눕니다. function abc()window.top.abc()
Sean Kendle

3

그것을 필요로하는 사람들을위한 또 다른 추가. Ash Clarke의 솔루션은 다른 프로토콜을 사용하는 경우 작동하지 않으므로 SSL을 사용하는 경우 iframe도 SSL을 사용하고 있는지 또는 기능이 중단되는지 확인하십시오. 그의 솔루션은 도메인 자체에서 효과가 있었으므로 감사합니다.


2

하위 도메인을 위해 Ash Clarke가 제공 한 솔루션은 훌륭하지만, document.domain = "mydomain.com"을 포함해야합니다. 링크 동일한 출처 정책 확인에 명시된 바와 같이 iframe 페이지의 헤드와 상위 페이지의 헤드 모두

JavaScript DOM 액세스를 위해 구현 된 동일한 오리진 정책에 대한 중요한 확장은 (동일 출처 확인의 다른 특징 대부분은 아님) 공통 호스트 도메인을 공유하는 두 사이트가 "동일한 호스트"에 실패하더라도 통신을 선택할 수 있다는 것입니다 각각의 document.domain DOM 속성을 현재 호스트 이름의 동일한 정규화 된 오른쪽 조각으로 상호 설정하여 확인하십시오. 예를 들어 http://en.example.com/http://fr.example.com/이 모두 document.domain을 "example.com"으로 설정 한 경우 해당 시점부터 동일한 출처로 간주됩니다. DOM 조작의 목적.


예, 맞습니다. "iframe의 페이지가 동일해야합니다." "페이지와 iframe이 같아야합니다." ..... 감사!
Ash Clarke

로컬 컴퓨터에서 파일을 실행하는 방법은 무엇입니까? 의 가치는 document.domain무엇입니까?
랩터

그것은 것 localhost또는 기계 (보통의 IP 주소 127.0.0.1), URL 주소 표시 줄에 무엇에 따라 달라집니다.
Ash Clarke

2

parent.abc () 는 보안상의 이유로 동일한 도메인에서만 작동합니다. 나는이 해결 방법을 시도하고 내 것이 완벽하게 작동했습니다.

<head>
    <script>
    function abc() {
        alert("sss");
    }

    // window of the iframe
    var innerWindow = document.getElementById('myFrame').contentWindow;
    innerWindow.abc= abc;

    </script>
</head>
<body>
    <iframe id="myFrame">
        <a onclick="abc();" href="#">Click Me</a>
    </iframe>
</body>

도움이 되었기를 바랍니다. :)


이것은 실제로 iframe의 문서에 대해서만 사용되므로 부모 양식의 컨트롤을 참조 해야하는 경우 엄청난 복잡성을 추가합니다.
Paul

1

Firefox와 Chrome에서는 다음을 사용할 수 있습니다.

<a href="whatever" target="_parent" onclick="myfunction()">

myfunction이 iframe과 부모 모두에있는 경우 부모 함수가 호출됩니다.


작동하지 않습니다. 여기 내 데모가 있습니다 : dotku.github.io/tech/html/iframe/iframe_function_container.html
Jay Lin

Ash Clarke이 말했듯이 자식 iframe에서 호출하려는 자바 스크립트는 부모의 머리에 있어야합니다.
눈송이

받아 들여진 대답은 대본이 필요하지 않습니다. 이 솔루션이 더 이상 스크립트가 머리에 있어야하는지 여부를 테스트하지 않았습니다.
Guy Schalnat

0

이러한 솔루션 중 일부는 작동하지만 모범 사례를 따르는 것은 없습니다. 많은 사람들이 전역 변수를 할당하고 여러 부모 변수 또는 함수를 호출하여 혼란스럽고 취약한 네임 스페이스로 연결될 수 있습니다.

이를 방지하려면 모듈 패턴을 사용하십시오. 부모 창에서 :

var myThing = {
    var i = 0;
    myFunction : function () {
        // do something
    }
};

var newThing = Object.create(myThing);

그런 다음 iframe에서

function myIframeFunction () {
    parent.myThing.myFunction();
    alert(parent.myThing.i);
};

이것은 Crockford의 주요 텍스트 "자바 스크립트 : 좋은 부분"의 상속 장에 설명 된 패턴과 유사합니다. 또한 자바 스크립트 모범 사례에 대해서는 w3 페이지에서 자세히 알아볼 수 있습니다. https://www.w3.org/wiki/JavaScript_best_practices#Avoid_globals

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.