2010-09-21 29 views
5

He buscado durante un tiempo y no puedo encontrar una respuesta que se ajuste a mis necesidades. Tengo una página que muestra una ventana (window.open), registra al usuario (crea una cookie, establece una sesión) y luego redirige a otra página. Mientras que el modal se redirecciona, me gustaría actualizar la página principal, por lo que todo lo bueno que acabo de hacer será reconocido por el padre. He intentado window.opener y cosas así. ¿Puede alguien ayudarme un poco? GraciasActualice la ventana principal desde la ventana secundaria en javascript

+1

¿Te refieres a "Actualizar el directorio original de CHILD"? Me gusta el chile verde, que es de Nuevo México, pero no sé qué es un chile en este contexto. –

+0

window.parent ¿verdad? 'window.parent.frames [0]' o similar https://developer.mozilla.org/en/DOM –

+0

window.opener es generalmente lo que llamará en la ventana secundaria. ¿Puedes mostrar tu script usando para abrir esta nueva ventana? –

Respuesta

10

window.opener en la ventana emergente se referirá al objeto window de la ventana de apertura, por lo que, por supuesto, debe poder llamar al window.opener.location.reload();. Siempre que no se encuentre en conflicto con el Same Origin Policy, la ventana emergente puede invocar scripts y manipular propiedades en el objeto de la ventana principal al igual que el código en el padre.

Aquí hay un live example que demuestra que el hijo vuelve a llamar a una función en el elemento primario y también manipula el elemento primario directamente. El código completo para esto se cita a continuación.

Pero ese ejemplo no hizo exactamente lo que ha dicho, así que he done this one as well, que tiene el niño actualizar la página de los padres a través de window.opener.location.reload().

código de Padres del primer ejemplo vivo:

<!DOCTYPE html> 
<html> 
<head> 
<meta charset=utf-8 /> 
<title>Parent Window</title> 
<!--[if IE]> 
    <script src="http://html5shiv.googlecode.com/svn/trunk/html5.js"></script> 
<![endif]--> 
<style> 
    article, aside, figure, footer, header, hgroup, 
    menu, nav, section { display: block; } 
</style> 
</head> 
<body> 
    <input type='button' id='btnOpen' value='Open Window'> 
    <div id='display'></div> 
</body> 
<script type='text/javascript'> 
    (function() { 
    var btnOpen = document.getElementById('btnOpen'); 
    btnOpen.onclick = btnOpenClick; 

    function btnOpenClick() { 
     window.open('http://jsbin.com/ehupo4/2'); 
    } 

    // Make the callback function available on our 
    // `window` object. I'm doing this explicitly 
    // here because I prefer to export any globals 
    // I'm going to create explicitly, but if you 
    // just declare a function in a script block 
    // and *not* inside another function, that will 
    // automatically become a property of `window` 
    window.callback = childCallback; 
    function childCallback() { 
     document.getElementById('display').innerHTML = 
      'Got callback from child window at ' + new Date(); 
    } 
    })(); 
</script> 
</html>​ 

(No hace tienen utilizar una función de alcance como lo hice anteriormente, pero es útil para mantener las variables globales contenida.)

Código de hijo del primer ejemplo en vivo:

<!DOCTYPE html> 
<html> 
<head> 
<meta charset=utf-8 /> 
<title>Child Window</title> 
<!--[if IE]> 
    <script src="http://html5shiv.googlecode.com/svn/trunk/html5.js"></script> 
<![endif]--> 
<style> 
    article, aside, figure, footer, header, hgroup, 
    menu, nav, section { display: block; } 
</style> 
</head> 
<body> 
    <p>I'm the child window</p> 
</body> 
<script type='text/javascript'> 
    if (window.opener) { 
    // Call the provided callback 
    window.opener.callback(); 

    // Do something directly 
    var p = window.opener.document.createElement('p'); 
    p.innerHTML = "I was added by the child directly."; 
    window.opener.document.body.appendChild(p); 
    } 
</script> 
</html>​ 
1

window.parent.top.location = window.parent.top.location; (o algo similar a eso lo hará)

+0

window.opener es quizás mejor – automagic

1

Si ninguna de las otras sugerencias funciona (recuerde probar en todos los navegadores principales), también puede tratar de pasar una referencia de la ventana primaria explícitamente a la ventana secundaria. Debido window.open() debe devolver una referencia a la ventana secundaria .. para que pueda hacer child = window.open() y entonces usted puede hacer algo como child.myParent = window

+0

Muy cierto. 'window.opener' es confiable y excluye el SOP, y esto también entrará en conflicto con el SOP, pero es bueno tener opciones. Tienes que lidiar con el tiempo un poco, que es parte de por qué prefiero que el niño llame al padre. –

0

que tenía el mismo problema con la presentación de un formulario en un modal a través de AJAX y necesito la página debajo (padres página) para volver a cargar. window.location.reload(); funcionó para mí.

Cuestiones relacionadas