Apri il popup e aggiorna la pagina principale alla chiusura del popup


93

Ho aperto una finestra popup tramite window.open in JavaScript, voglio aggiornare la pagina padre quando chiudo questa finestra popup. (Evento onclose?) Come posso farlo?

window.open("foo.html","windowName", "width=200,height=200,scrollbars=no");

1
Si prega di controllare questo: stackoverflow.com/questions/18321323/… potrebbe aiutare qualcuno
NoNaMe

Risposte:


230

Puoi accedere alla finestra genitore usando ' window.opener ', quindi scrivi qualcosa come il seguente nella finestra figlia:

<script>
    window.onunload = refreshParent;
    function refreshParent() {
        window.opener.location.reload();
    }
</script>

Non sapevo window.opener, grazie! Metto sempre la finestra del chiamante in una variabile nella contentWindow del bambino. : - /
kay - SE è il male

3
Se non controlli JavaScript sulla pagina figlio (es. Flusso OAuth), dovrai controllare popupWindow.closedutilizzando setIntervalcome nella soluzione di @ Zuul.
jchook

34

La finestra pop-up non ha alcun evento di chiusura che puoi ascoltare.

D'altra parte, c'è una proprietà closed che è impostata su true quando la finestra viene chiusa.

Puoi impostare un timer per controllare quella proprietà chiusa e farlo in questo modo:

var win = window.open('foo.html', 'windowName',"width=200,height=200,scrollbars=no");   
var timer = setInterval(function() {   
    if(win.closed) {  
        clearInterval(timer);  
        alert('closed');  
    }  
}, 1000); 

Guarda questo esempio di violino funzionante !


1
non voglio usare il timer! qualche altra idea?
ArMaN

1
Un po 'hacker, ma penso che l'uso di un timer funzionerà al meglio su tutti i browser.
kay - SE è il male

Questa è anche la soluzione migliore se il popup ha diverse pagine prima della chiusura, poiché l'evento onunload viene attivato solo dopo che l'utente si allontana dalla prima pagina.
AntonChanning

14

nella pagina di tuo figlio, inserisci questi:

<script type="text/javascript">
    function refreshAndClose() {
        window.opener.location.reload(true);
        window.close();
    }
</script>

e

<body onbeforeunload="refreshAndClose();">

ma come buon design dell'interfaccia utente, dovresti usare Close buttonperché è più facile da usare. vedere il codice sotto.

<script type="text/javascript">
    $(document).ready(function () {
        $('#btn').click(function () {
            window.opener.location.reload(true);
            window.close();
        });
    });
</script>

<input type='button' id='btn' value='Close' />

quando la finestra popup è chiusa, non quando l'utente fa clic su un pulsante per aggiornare la pagina e chiudere la finestra popup
gengkev

@gengkev, sapevo che OP voleva allegare l'evento alla chiusura della finestra, ma credo che l'utilizzo di un pulsante sia un design dell'interfaccia utente migliore. tuttavia, ho incluso il codice per entrambi. si prega di avvisare.
Ray Cheng,

Ho usato la funzione <body onbeforeunload = "refreshAndClose ();"> <script type = "text / javascript"> refreshAndClose () {window.opener.location.reload (true); } self.close (); </script>
steve0nz

3

Io uso questo:

<script language='javascript'>
var t;
function doLoad() {
t = setTimeout("window.close()",1000);
}

</script>
<script type="text/javascript">
function refreshAndClose() {
    window.opener.location.reload(true);
    window.close();
}
</script>
<body onbeforeunload="refreshAndClose();" onLoad='doLoad()''>

quando la finestra si chiude, aggiorna la finestra padre.


2

window.open restituirà un riferimento alla finestra appena creata, a condizione che l'URL aperto sia conforme alla politica della stessa origine .

Questo dovrebbe funzionare:

function windowClose() {
    window.location.reload();
}

var foo = window.open("foo.html","windowName", "width=200,height=200,scrollbars=no");
foo.onbeforeunload= windowClose;​

Non funzionerà se l'utente sarà in grado di seguire i collegamenti nella finestra aperta. E sono abbastanza sicuro che venga generato un evento di scaricamento prima che l'URL di destinazione venga caricato per la prima volta, poiché lasci implicitamente circa: vuoto. (+1 per aver menzionato SOP)
kay - SE è il male

2

Nel mio caso ho aperto una finestra pop-up facendo clic sul pulsante di collegamento nella pagina principale. Per aggiornare il genitore alla chiusura del figlio utilizzando

window.opener.location.reload();

nella finestra figlio ha causato la riapertura della finestra figlio (potrebbe essere a causa dello stato di visualizzazione, immagino. Correggimi se sbaglio). Quindi ho deciso di non ricaricare la pagina nel genitore e caricare di nuovo la pagina assegnandole lo stesso URL.

Per evitare che il popup si riapra dopo aver chiuso la finestra pop-up, questo potrebbe aiutare,

window.onunload = function(){
    window.opener.location = window.opener.location;};

1

Se la tua app viene eseguita su un browser abilitato per HTML5. Puoi usare postMessage . L'esempio fornito è abbastanza simile al tuo.


"Altrimenti, non puoi comunicare tra finestre diverse." è sbagliato. La tecnica è ancora possibile, anche se consiglierei la risposta di @Moses
gengkev

-1 rimosso. Se fai un piccolo esempio otterrai anche un +1 ;-)
kay - SE è il male

Non importa. Ma non penso che window.opener sia OK per IE. Proverò
Chris Li

1
@kay, funziona benissimo in IE7, 8. Molto carino, non lo sapevo prima. +1 per Mosè.
Chris Li

1
@ArMaN: jsfiddle.net/8c2e4/10 , usa window.opener. Puoi usarlo per testare il tuo ambiente.
Chris Li

1

Prova questo

        self.opener.location.reload(); 

Apri il genitore di una finestra corrente e ricarica la posizione.


0

Puoi raggiungere la pagina principale con il comando genitore (genitore è la finestra) dopo il passaggio puoi fare tutto ...

    function funcx() {
        var result = confirm('bla bla bla.!');
        if(result)
            //parent.location.assign("http://localhost:58250/Ekocc/" + document.getElementById('hdnLink').value + "");
            parent.location.assign("http://blabla.com/" + document.getElementById('hdnLink').value + "");
    } 

0

Puoi utilizzare il codice sottostante nella pagina principale.

<script>
    window.onunload = refreshParent;
    function refreshParent() {
      window.opener.location.reload();
    }
</script>

0

Il codice seguente riuscirà ad aggiornare la chiusura del post della finestra principale:

function ManageQB_PopUp() {
            $(document).ready(function () {
                window.close();
            });
            window.onunload = function () {
                var win = window.opener;
                if (!win.closed) {
                    window.opener.location.reload();
                }
            };
        }
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.