2011-08-24 6 views
9

다른 창 컨텍스트에서 Javascript 메서드를 호출 할 수 있습니까?

전역 함수가 있다고 가정하십시오. alert2 :

function alert2(msg) { 
    window.alert(msg); 
} 

또한 두 번째 창 객체에 대한 참조가 있습니다.

childWindow = window.open(myUrl); 

이제 window에서 alert2를 childWindow의 컨텍스트로 호출하려고합니다.

alert2.call(childWindow, "does not work without this.window"); 

alert2의 "window"가이 메서드가 정의 된 창 (부모 창)에 바인딩되어 있기 때문에 대화 상자가 주 창에 나타납니다.

한 가지 해결책은 alert2를 수정하는 것입니다.

function alert2(msg) { 
    this.alert(msg); 
} 

이 수정없이이 작업을 수행 할 수 있습니까? 뭔가 이런 :

alert2.call(childWindow.parent, "no such thing as window.parent"); 

이것은 고안된 예제입니다; childWindow.alert ("")가 내가 찾고있는 것이 아닙니다!

http://jsfiddle.net/hJ7uw/2/

로 시작하는 jsfiddle에서 내 소스를보고 수정할 수 있습니다.

답변

5

참고로 시작하는 jsfiddle 수정할 수 있습니다 : 두 창 경우에만 작동합니다 같은 도메인 (단일 도메인 정책)에 속한다.

var func = function() { 
    var parent = window; // pointer to parent window 
    var child = childWindow; 

    return function() { 

     ... anything you like to do ... 
     parent.alert('Attached to main window') 
     child.alert('Attached to child window') 
    } 
}(); 

childWindow.func = func; // pass function to child window 

중첩 된 기능

당신은 함수가 생성 된 컨텍스트 (종료 끝에 }();주의에서 참조에 액세스 할 수 있는지 확인하십시오 당신이 할 수있는 일

childWindow에 함수를 만드는 것입니다 첫 번째 함수를 호출하고 즉시 호출).

마지막 줄은 자식 창에 새 함수를 만듭니다. 하위 창의 모든 JavaScript 코드는 window.func으로 액세스 할 수 있습니다.

다소 혼란 스럽지만 다음과 같이 생각하면됩니다. 두 개의 창 인스턴스/개체가 있습니다. JavaScript 객체와 마찬가지로 새 속성을 객체에 지정할 수 있습니다.

+1

감사합니다 ... 당신의 코드는 문제에 대한 이해를 보여줍니다. 이 경우 위의 func()에서 "child"또는 "parent"의 의미를 대체 할 방법이 없습니다. 비슷하게 func가 정의 될 때 alert2가 "parent"와 같이 생성되고 "child"가 캡처 될 때 "window"가 캡처 되었기 때문에 함수에서 "window"의 의미를 대체 할 방법이없는 것으로 보입니다. –

2

childWindow.opener을 사용하면 하위 창을 연 객체 인 window을 가져올 수 있습니다.

alert2.call(childWindow.opener, "called from child using parent as context"); 

데모 : http://jsfiddle.net/hJ7uw/8/

관련 문제