2011-08-24 11 views
9

que usted tiene un alert2 función global:¿Es posible llamar a un método de Javascript en el contexto de otra ventana?

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

Y también hay una referencia a un segundo objeto de la ventana:

childWindow = window.open(myUrl); 

Ahora que desea llamar alert2 de la ventana en el contexto de la ChildWindow :

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

aparece el cuadro de diálogo en la ventana principal porque "ventana" dentro de alert2 está unido a la ventana en la que este método era definir d (la ventana principal).

Una solución es modificar alert2:

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

¿Es posible hacer esto sin esta modificación? Algo como esto:

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

Esto es un ejemplo artificial; childWindow.alert ("") no es lo que estoy buscando!

Mi fuente puede ser visto y modificado en jsFiddle comenzando con http://jsfiddle.net/hJ7uw/2/

Respuesta

5

Nota: esto sólo funciona si ambas ventanas pertenecen al mismo dominio (Directiva de dominio individual).

Lo que puede hacer es crear la función en el 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 

Las funciones anidadas asegúrese de que puede acceder a las referencias del contexto en el que se creó la función (nótese el }(); al final que termina la primera función y la llama inmediatamente).

La última línea crea la nueva función en la ventana secundaria; todo el código de JavaScript en la ventana secundaria también puede acceder a él como window.func.

Es un poco confuso pero solo piénselo de esta manera: tiene dos instancias/objetos de ventana. Al igual que con cualquier objeto de JavaScript, puede asignarles nuevas propiedades.

+1

... Gracias a su código de ilustrar mi comprensión del problema. En este caso, no hay forma de sustituir el significado de "niño" o "padre" en func() anterior. De forma similar, parece que no hay forma de sustituir el significado de "ventana" en una función porque se capturó "ventana" cuando se creó la alerta2 así como "padre" y "niño" se captura cuando se define func. –

2

Puede usar childWindow.opener para obtener el objeto window que abrió la ventana secundaria.

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

Demostración: http://jsfiddle.net/hJ7uw/8/

Cuestiones relacionadas