2011-01-24 13 views
12

Ho visto dei modi per vedere se una finestra aperta da uno specifico script è ancora aperta, ma cosa succede se non è così?Come sapere se esiste una finestra in Javascript?

Ho una piccola finestra che ha un pulsante per fare clic per caricare la finestra grande. Quando chiudo quello grande, voglio un particolare onUnload o onBeforeUnload sparare se il piccolo è chiuso; se è ancora aperto, tali procedure non verranno attivate. Potrei avere semplicemente un enorme scoreggia del cervello ma non riesco a capire come controllare se l'altra finestra è aperta. Il grande non lo apre, quindi non posso semplicemente registrare la maniglia dall'aprirlo.

In termini più brevi: Se finestra A ha aperto la finestra B, come posso verificare all'interno della finestra B se la finestra A esiste ancora?

risposta

19
if(window.opener && !window.opener.closed) 
    alert('Yup, still there.'); 
+0

Oh. Bene, era semplice. Ecco una domanda successiva, però ... se B è stato aperto indipendentemente da A, c'è un modo per vedere se esiste A? Avendo un nome/target particolare e tutto, non è come se stia cercando di divinare cosa intendo per A, sa cosa intendo con A. – Andrew

+0

window.parent? Questo è per i frame, non per i popups –

+0

Oh, jeez. Grazie, Juan. Sì, intendevo "apritore", non "genitore". Andrew: la chiave pertinente sarebbe l'argomento windowName a 'window.open', ma non sono a conoscenza di alcun modo di usarlo diverso da un'altra chiamata a' window.open', che è piuttosto distruttiva. – chaos

17

window.closed sarà impostato a true se spuntato una finestra ed era chiuso (da script o utente).

var win = window.open('...')'; 
if (win.closed) 

Il tuo caso sembra essere la seguente:

Da una finestra pop-up, è possibile controllare se la finestra che si apriva è ancora aperta utilizzando window.opener.closed

Get gestire a una finestra per nome

Ho accennato che non c'è modo di ottenere l'handle della finestra per nome nei commenti. Tuttavia, ho fatto qualche ricerca e ho scoperto che i seguenti lavori sono in FF/IE/Chrome; è un hack, non l'ho visto menzionato da nessuna parte come il comportamento previsto, quindi non mi fiderei troppo, ma è stato divertente trovarlo funziona! Nel mio codice, vorrei comunque assicurarmi di passare le maniglie necessarie.

//opened a window without storing a handle, but gave it a name 
window.open('/some/url', 'xxx'); 

// now I need to get a reference to that window 
// Calling open without setting a url gets you 
// a reference and doesn't reload the window 
var win = window.open('', 'xxx') 
+0

Grazie. Cosa succede se può essere aperto in un modo diverso dal javascript originale? (Ad esempio, se C ha aperto B, può B vedere se A è aperto?) – Andrew

+0

No, non è possibile "divinare" l'handle in una finestra. Non esiste un registro globale di Windows per nome. Nel tuo esempio, C ha creato A? se lo facesse, dovresti memorizzare quell'handle 'A = window.open(); B = window.open(); B.A = A''. Quindi B potrebbe controllare 'if (! A.closed)'; –

+0

Grazie per l'hack. Potrei prendere in considerazione l'idea, ma in questo momento sto cercando di renderlo più pulito e di formulare una soluzione completamente back-end. – Andrew

1

Utilizzare try {} e catch (err) {}.

try{ 
window.opener.document.body.getElementById('#elementId'); // do some action with window. opener 
} 
catch(err){ 
// if we are here then probably there is no window.opener 
window.close(); // closing this window or whatever you want 
} 
+0

Bene, "probabilmente non esiste window.opener" non è una soluzione esatta.Questa domanda ha due anni e ha una risposta accettata. In futuro, ti preghiamo di rivolgere il tuo sforzo a nuove domande oa quelle senza una risposta accettata;) – Mifeet

+1

@Mifeet questa risposta non mi ha soddisfatto. Volevo solo aggiungere un'alternativa e forse una soluzione migliore se qualcuno come me venisse qui. E non c'è niente di divertente in "probabilmente". Perché catch può essere attivato non solo se window.opener non esiste ma quando il tuo codice che si occupa di window.opener non è valido. – Audrius

+1

Ok, grazie per il chiarimento. Tuttavia, l'utilizzo di un try-catch non è una pratica consigliata, tuttavia è opportuno utilizzare le eccezioni per gli stati eccezionali, non per il normale flusso di esecuzione. Verificare se 'window.opener' è impostato è una soluzione migliore. – Mifeet

Problemi correlati