2010-09-21 20 views
5

Ho cercato per un po 'e non riesco a trovare una risposta adatta alle mie esigenze. Ho una pagina che apre una finestra (window.open), registra l'utente in (crea un cookie, imposta la sessione) quindi reindirizza a un'altra pagina. Mentre la modale sta reindirizzando, vorrei aggiornare la pagina padre, quindi tutte le cose buone che ho appena fatto saranno riconosciute dal genitore. Ho provato window.opener e cose del genere. Qualcuno può aiutarmi un po '? GrazieAggiorna la finestra genitore dalla finestra secondaria in javascript

+1

Intendevi "Aggiorna il genitore dal javascript di CHILD"? Mi piace il peperoncino verde, essendo del New Mexico, ma non so cosa sia un peperoncino in questo contesto. –

+0

window.parent non è vero? 'window.parent.frames [0]' o simile https://developer.mozilla.org/en/DOM –

+0

window.opener è in genere ciò che chiamerai nella finestra secondaria. Puoi mostrare il tuo script che usi per aprire questa nuova finestra? –

risposta

10

window.opener nel popup si riferirà all'oggetto window della finestra di apertura, quindi ovviamente dovresti essere in grado di chiamare window.opener.location.reload();. Se non si esegue il controllo di Same Origin Policy, la finestra popup può richiamare script e manipolare le proprietà sull'oggetto finestra padre proprio come il codice nel contenitore padre.

Ecco uno live example che dimostra che il figlio richiama una funzione sul genitore e manipola direttamente il genitore. Il codice completo per questo è citato di seguito.

Ma questo esempio non ha fatto esattamente quello che hai detto, così ho done this one as well, che ha il bambino aggiornare la pagina genitore tramite window.opener.location.reload().

codice capogruppo del primo esempio in diretta:

<!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>​ 

(Tu non fai hanno utilizzare una funzione di scoping come ho fatto in precedenza, ma è utile per mantenere i vostri globali contenute.)

Codice figlio del primo esempio live:

<!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 qualcosa di simile a quello che lo farà)

+0

window.opener è forse meglio – automagic

1

Se nessuno degli altri suggerimenti funziona (Ricordarsi di eseguire il test in tutti i principali browser), è anche possibile provare a passare esplicitamente un riferimento della finestra padre alla finestra secondaria. Perché window.open() dovrebbe restituire un riferimento alla finestra secondaria .. così si può fare child = window.open() e allora si può fare qualcosa di simile child.myParent = window

+0

Molto vero. 'window.opener' è affidabile se si esclude il SOP e anche questo funzionerà in modo anomalo, ma è utile avere opzioni. Devi gestire un po 'il tempo, il che è parte del motivo per cui preferisco che il bambino chiami il genitore. –

0

ho avuto lo stesso problema con la presentazione di una forma in un modal tramite la tecnologia AJAX e bisogno nella pagina sottostante (genitore pagina) per ricaricare. window.location.reload(); ha funzionato per me.

Problemi correlati