2012-04-20 9 views
17

Questa domanda non è il duplicato di if window is popup, ma simile.Controlla se una finestra è popup o no?

Sto sviluppando un'estensione che inietta gli script a tutte le pagine Web. Devo rilevare se la finestra è popup o no.

Nota: Non sono io quello che sta aprendo la finestra popup, quindi la soluzione di cui sopra non funzionerà.

+0

è il vostro popup è window.open()? –

+0

No, non sono quello che sta aprendo il popup. Quindi non ho alcuna relazione con window.open() – Jeevan

+0

quindi quale tipo di popup stai usando? –

risposta

2

la seguente dichiarazione sarà vero se la finestra è una finestra popup o telaio ausiliario:

window.parent != window 
0

Questo non è un metodo sicuro fuoco, ma in genere un popup utilizzando window.open() non direttamente a un nuovo URL, in modo che entrambi Windows avrà lo stesso href. Pertanto, in molti casi:

window.location.href == window.opener.location.href 

sarà vero per un popup. Così si potrebbe fare:

var isPopup = (window.location.href == window.opener.location.href); 

Come ho detto, questo funziona nel mio test limitati, quindi non ci può essere qualche feedback che mostra dove questo non sarà affidabile.

+0

widnow.open() può aprire la finestra vuota e avere il conent creato con JavaScirpt o con qualsiasi URL, sia set interno che esterno (ovviamente non sarai in grado di controllare la finestra popup con un altro URL doity a causa dello stesso criterio di dominio). –

+0

Giusto. Se l'URL è specificato, questo non funzionerà. Ma di solito quando viene specificato l'url, in una situazione come quella degli OP, lui probabilmente vorrebbe che qualunque iniezione di codice avvenga comunque. Non è sicuro, ma il più delle volte. – Anthony

+0

solo per aggiungere hai un errore se window.location.href == window.opener.location.href è vero che non è popup –

0

window.locationbar.visible non necessariamente solo per un pop-up, ma può aiutare a rilevare se l'utente può modificare la posizione manualmente tramite barra degli indirizzi ...

18

Di seguito ha lavorato per me durante il test in Chrome, Firefox, Safari e IE8 . Ha funzionato per una finestra creata usando window.open() o target = _blank.

if (window.opener) { 
    alert('inside a pop-up window or target=_blank window'); 
} else if (window.top !== window.self) { 
    alert('inside an iframe'); 
} else { 
    alert('this is a top level window'); 
} 
+4

window.opener, questo sarà vero anche su jsbuster

+0

grazie jsbuster, ho modificato il codice per riflettere questo. – BarelyFitz

+0

window.opener non è definito in IE se il popup ha un'altra origine. –

0

Il modo migliore, è semplicemente quello di controllare la larghezza della finestra, quindi provare a ridimensionare la larghezza della finestra in un pixel o due, e poi verificare se la larghezza corrente è uguale o no a quella prima del ridimensionamento

in altre parole, se sei riuscito a ridimensionare la finestra, probabilmente sei all'interno di un popup.

buona fortuna.

2

Perché non controllare solo se l'apertura non è indefinita? un popup ha un opener mentre non ha una pagina normale.

if (window.opener != undefined) 
15

Ho trovato che alcuni browser imposteranno window.opener in alcuni casi. Questo è il controllo popup più affidabile che sto usando in questo momento.

if (window.opener && window.opener !== window) { 
    // you are in a popup 
} 
+0

Sì, penso che questo sia il biglietto. – prograhammer

+0

obbligatorio "questa dovrebbe essere la risposta accettata". Un'altra aggiunta però; se forse conosci il nome della finestra dal secondo argomento di window.open, puoi usare questo: 'window.open ('example.org', 'the-window-name')' può essere controllato con 'if (window.opener && ... window.name === 'the-window-name') ' –

0

Per me, ero attuando uno schermo Logout che potrebbe essere mostrato in un'altra finestra tramite window.open (..) o da un collegamento all'interno di una singola pagina.

avevo bisogno per determinare:

1) se lo schermo Logout è all'interno di un pop-up, quindi:

event.preventDefault(); 
window.close(); 

2) utilizzare in altro modo la funzione del browser schiena ..

window.history.back(); 

La mia soluzione: Se la pagina è all'interno di un popup, nel mio caso si ha una pagina finestra della cronologia di 1:

event.preventDefault(); 
if (window.history.length === 1) { 
    window.close(); 
} else { 
    window.history.back(); 
}