2012-05-14 14 views
13

Estoy tratando de llamar a una función javascript definida en un elemento primario desde una ventana secundaria. Tengo dos archivos como este:JavaScript window.opener llamada principal función

Padres:

<html> 
<head> 
<title>Test</title> 
<script type="text/javascript"> 
function foo() { 
alert ("Hello from parent!"); 
} 
function doStuff() { 
var w = window.open("testa.html"); 
} 
</script> 
</head> 
<body> 
<input type="button" value="open" onClick="doStuff();" /> 
</body> 
</html> 

y el niño:

<html> 
<head> 
<title>Test A</title> 
<script type="text/javascript"> 
function get() { 
window.opener.foo(); 
} 
</script> 
</head> 
<body> 
<input type="button" value="Call Parent" onClick="get();" /> 
</body> 
</html> 

no puedo, por la vida de mí, llamar a la función foo del proceso hijo. Pensé que esto debería ser posible con el objeto window.opener, pero parece que no puedo hacer que esto funcione. ¿Alguna sugerencia?

+4

¿Está accediendo a estas páginas en 'http: //' o 'file: ///'? El protocolo 'file' no tiene un origen, por lo que siempre fallará el [SOP] (http://en.wikipedia.org/wiki/Same_origin_policy), haciendo que el' abrelatas' sea inaccesible. –

+0

Resulta que ese era el problema, simplemente estaba accediendo a ellos sobre el archivo: //. Cuando los arrojo al directorio http: //, funciona bien. – RPIBuckHunter

+0

¿Qué es http: // y file: ///? cómo cambiarlo de uno a otro. ¿Tengo el mismo problema? Por favor ayuda. –

Respuesta

16

Asegúrese de tener acceso a esto a través de http: // para que se apruebe la misma política de origen y pueda acceder al abridor desde el niño. No funcionará si solo está usando file: //.

+0

¿Funcionará para https: //? – Muthu

1

Respondiendo a la pregunta de Rahul:

Cada navegador puede cargar las páginas del servidor o desde el sistema de archivos local. Para cargar archivos desde el sistema de archivos local, debe poner en el navegador la dirección como esta file://[path], donde [ruta] es la ruta absoluta al archivo en el sistema de archivos (incluida la letra de unidad en Windows, consulte http://blogs.msdn.com/b/ie/archive/2006/12/06/file-uris-in-windows.aspx para más detalles).

Para cargar archivos desde el servidor HTTP local (si tiene uno) debe dirigirse a algo como este http://localhost:[port]/[path], donde [puerto] es el puerto donde se ejecuta su servidor (el valor predeterminado es 80) y [ruta] es el ruta del archivo relativa a la carpeta raíz del documento del servidor. La carpeta raíz del documento depende de la configuración del servidor.

Por lo tanto, como puede ver, el mismo archivo local se puede cargar en el navegador de dos maneras. Sin embargo, hay una gran diferencia entre estas dos formas. En el primer caso, el navegador no utiliza el protocolo HTTP para cargar el archivo y, por lo tanto, le faltan muchas cosas necesarias para que los diferentes mecanismos funcionen correctamente. Por ejemplo, AJAX no funciona con archivos locales, ya que el estado de respuesta HTTP no es 200, etc.

En este ejemplo particular, el mecanismo de seguridad del navegador no obtuvo la información de origen e impidió el acceso a la ventana principal.

Cuestiones relacionadas