2011-08-24 8 views
9

Diciamo che avere una funzione alert2 globale:È possibile chiamare un metodo Javascript nel contesto di un'altra finestra?

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

e hai anche un riferimento a un secondo oggetto finestra:

childWindow = window.open(myUrl); 

Ora che si desidera chiamare alert2 dalla finestra nel contesto della childWindow :

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

la finestra di dialogo viene visualizzata nella finestra principale perché "finestra" all'interno della alert2 è legato alla finestra in cui questo metodo è stato definire d (la finestra genitore).

Una soluzione è quella di modificare alert2:

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

E 'possibile farlo senza questa modifica? Qualcosa del genere:

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

Questo è un esempio forzato; childWindow.alert ("") non è quello che sto cercando!

La mia fonte può essere visto e modificato in jsfiddle partendo http://jsfiddle.net/hJ7uw/2/

risposta

5

Nota: questo funziona solo se entrambe le finestre appartengono allo stesso dominio (Policy singolo dominio).

Che cosa si può fare è di creare funzione nella 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 

Le funzioni nidificate fare in modo che è possibile accedere ai riferimenti dal contesto in cui è stato creato la funzione (notare il }(); alla fine che termina la prima funzione e la chiama immediatamente).

L'ultima riga crea la nuova funzione nella finestra secondaria; tutto il codice JavaScript nella finestra figlio può accedervi come window.func, anche.

È un po 'di confusione, ma pensa solo a questo: hai due istanze/oggetti di finestra. Proprio come con qualsiasi oggetto JavaScript, puoi assegnare loro nuove proprietà.

+1

Grazie ... il codice di illustrare la mia comprensione del problema. In questo caso non c'è modo di sostituire il significato di "figlio" o "genitore" in func() sopra. Allo stesso modo sembra che non ci sia modo di sostituire il significato di "finestra" in una funzione perché "finestra" è stata catturata quando alert2 è stato creato proprio quando "genitore" e "figlio" vengono catturati quando func è definita. –

2

È possibile utilizzare childWindow.opener per ottenere l'oggetto window che ha aperto la finestra secondaria.

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

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

Problemi correlati