2011-08-24 14 views
9

Say masz globalnej funkcji alert2:Możliwe wywołanie metody Javascript w kontekście innego okna?

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

I masz również odniesienie do drugiego obiektu window:

childWindow = window.open(myUrl); 

Teraz chcesz zadzwonić alert2 z okna w kontekście childWindow :

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

pojawi się okno dialogowe, w głównym oknie, bo „okna” wewnątrz alert2 jest zobowiązany do okna, w którym metoda ta była definiować d (okno nadrzędne).

Jednym z rozwiązań jest zmiana alert2:

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

Czy można to zrobić bez tej modyfikacji? Coś w tym stylu:

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

To jest wymyślny przykład; childWindow.alert ("") nie jest tym, czego szukam!

Moje źródło można zobaczyć i zmodyfikowano jsfiddle zaczynając http://jsfiddle.net/hJ7uw/2/

Odpowiedz

5

Uwaga: Funkcja ta działa tylko wtedy, gdy oba okna należą do tej samej kategorii (Single Polityka Domain).

Co można zrobić, to utworzyć funkcję w childWindow:

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 

zagnieżdżonych funkcji upewnij się, że można uzyskać dostęp do odwołań od kontekstu, w którym funkcja została stworzona (uwaga }(); na koniec zakończonego pierwsza funkcja i wywołuje ją natychmiast).

Ostatni wiersz tworzy nową funkcję w oknie podrzędnym; cały kod JavaScript w oknie podrzędnym może uzyskać do niego dostęp również jako window.func.

To trochę zagmatwane, ale pomyśl o tym w następujący sposób: Masz dwa wystąpienia/obiekty okna. Podobnie jak w przypadku dowolnego obiektu JavaScript, możesz przypisać do nich nowe właściwości.

+1

Dzięki ... kod ilustrują moje rozumienie problemu. W tym przypadku nie ma możliwości zastąpienia znaczenia "child" lub "parent" w func() powyżej. Podobnie wydaje się, że nie ma sposobu na zastąpienie znaczenia "okna" w funkcji, ponieważ "okno" zostało przechwycone, gdy alert2 został utworzony, tak jak "rodzic" i "dziecko" jest przechwytywane, gdy zdefiniowano func. –

2

Możesz użyć childWindow.opener, aby uzyskać obiekt window, który otworzył okno potomne.

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

Demo: http://jsfiddle.net/hJ7uw/8/