2009-05-11 13 views

risposta

32

sorta di si può fare in questo modo:

if (history.length == 1) { // Um, needs to be 0 for IE, 1 for Firefox 
    // This is a new window or a new tab. 
} 

Ci possono essere altri modi per history.length per essere 1, ma non so quello che potrebbe essere.

+0

Si potrebbe anche guardare history.previous ... –

+0

@Jason: Ottengo errori di autorizzazione in Firefox quando provo a guardare history.previous. – RichieHindle

+0

@RichieHindle: hmmm ... Stavo provando a metterci un dito sopra ... ma sì ... ecco perché faccio schifo ... –

0

Davvero non la penso così. Il più vicino che si possa ottenere è quello di monitorare gli eventi di keypress e mouseclick per cercare di far corrispondere le azioni ai metodi più comuni per l'apertura di collegamenti in nuove schede. (cioè se stanno tenendo premuto Comando quando cliccano, o facendo clic con il tasto centrale, è probabilmente una nuova scheda). Ciò non sarebbe affidabile, in quanto uno di questi attacchi può essere modificato.

2

La risposta breve è, no. La lunga risposta è, se stai facendo una chiamata ajaxy dalle tue pagine ai metodi sul lato server, che potrebbe tenere aperto il windows delle finestre (chiamato in un breve lasso di tempo). Sarebbe un disordine sciatto, inaffidabile, e non è possibile distinguere tra una nuova finestra o una scheda.

3

La proprietà window.opener in JavaScript punterà alla finestra che ha aperto la nuova finestra. Tuttavia non fa distinzione tra una nuova finestra e una nuova scheda. Le schede non fanno parte delle specifiche W3C ufficiali quindi non c'è un supporto diretto per loro.

+0

+1 per l'utilizzo di window.opener –

+0

window.opener è nullo per me in Firefox quando "Apri collegamento in una nuova scheda". – RichieHindle

+1

window.opener viene impostato solo quando si utilizza js window.open, non tramite l'azione dell'utente su un tag A. – Tracker1

0

è un comportamento del cliente, quindi penso che si possa fare qualcosa con javascript, come assegno di cronologia del browser, ma è ambiguo tra una nuova scheda e una nuova finestra.

Oltre a ciò, non tutti i browser ha schede e non tutti i browser ha lo stesso significato di quello che una scheda è (in alcuni sono diverso processo, in alcune altre non lo sono).

Ma, perché vorresti verificarlo? È davvero importante se la tua applicazione è in esecuzione in una nuova scheda o no? Io non la penso così ...

11

Oltre a history.length in JavaScript è possibile leggere/scrivere il nome della finestra.

Quindi se si controlla se ha un nome su carico ... è dovrebbe essere vuoto sul primo carico ... se si imposta su "pippo" ... su ogni carico successivo in quella finestra ... la proprietà window.name restituirà "foo" ... a meno che non apri un link in una nuova scheda/finestra ... quella nuova finestra non debba avere un nome impostato.

(a meno che naturalmente si apre un pop-up con window.open (url, nome, caratteristiche); che consente di pre-impostare il nome)

<script> 
if(window.name == ''){ 
    //first load (or Nth load in a new Tab/Window) 
    if(!SOME_VALUE_SET_FOR_2ND_TO_NTH_LOADS){ 
    //set name so we can catch new Tab/Window 
    window.name = 'myWinName'; 
    } else { 
    //we have a new Tab/Window (or something funky) 
    alert('What?! One window not cool enough for ya?\n' + 
     'Calling the InterWeb Police!'); 
    } 
} else if(window.name == 'myWinName'){ 
    //2nd-Nth load 
    document.title = 'All is well... we think'; 
} 
</script> 

Avvertenze:

  • Se la tua pagina viene inizialmente caricata in una finestra/frame che aveva già un nome ...le cose diventeranno eccentriche
  • Se la tua pagina ha iframe (nominati) e hai dei collegamenti mirati in quegli iframe, c'è un bug in IE7/8 per cui quando l'utente apre quei link in una nuova scheda/finestra, la nuova scheda/window "erediterà" il nome dell'iframe originariamente preso di mira (molto errore ODD senza correzione mai previsto)
+0

Questo è un trucco eccellente :-) Ho dovuto provarlo personalmente per vederlo funzionare. Se capisco bene, si presume che si abbia una pagina di accesso all'app in cui window.name viene sempre considerato vuoto: quando si accede a quella pagina si imposta un valore noto. In ogni altra pagina, la navigazione nella stessa tab window.name è preservata. Tuttavia, se apri una scheda, window.name viene perso. A quel punto il tuo script controlla se window.name non è vuoto, e poiché non sei sulla prima pagina di entrata, hai rilevato una nuova scheda aperta. Molto pulito! –

6

Questo è quello che uso in ASP.NET MVC per impedire agli utenti autenticati di aprire più schede:

<script language="javascript" type="text/javascript"> 
    @if(Request.IsAuthenticated) 
    { 
     <text> 
     if (window.name != 'singleWindow') { 
      window.location.href = "Content/ErrorPages/SingleTab.htm"; 
     } 
     </text> 
    } 
    else 
    { 
     <text> 
     window.name = "singleWindow"; 
     </text> 
    } 
</script> 

Fondamentalmente, questo imposta il nome della finestra la prima volta quando l'utente visita la pagina di accesso. Dopo l'accesso, per ogni caricamento successivo della pagina viene verificato il nome della finestra.

due problemi:

  • non fa wok se JavaScript disabilitato
  • se per errore l'utente chiude la scheda originale e poi incolla qualche altro link al mio sito web nella barra degli indirizzi, l'utente riceverà sempre la pagina di errore. Per dare all'utente la possibilità di recuperare, ho incluso il link "Esci" nella pagina SingleTab.htm, in modo che l'utente possa distruggere il suo cookie di sessione e avviare una nuova sessione.
Problemi correlati