2014-09-18 16 views
5

Sto riscontrando problemi con una scheda duplicata su Chrome (contenuto della sessione) e vorrei evitare l'azione di duplicare le schede (o mancare quella che chiude quella duplicata). Sto aprendo la scheda perché era un popup, senza barra degli indirizzi, nessuna barra di stato e niente, solo la finestra. Non c'è modo di duplicare una scheda (aperta come popup) in IE e Firefox (almeno non ne ho trovata una), ma in chrome è ancora possibile.Come realizzare quando una scheda del browser è stata duplicata

I also know I'm not able to programmatically check if there's an already open duplicated tab

Qualsiasi idea di come avvicinarsi a questo?

grazie!

risposta

8

Goal

Giusto per chiarire: L'obiettivo è quello è quello di rilevare (e chiudere) una scheda che è stata aperta tramite Chrome di "Duplica" opzione di menu del tasto destro.

Prima prova

L'azione "scheda Duplicate" funziona quasi esattamente come quando ricaricare una pagina dopo che l'utente ha cliccato "Back" e poi "Avanti", quindi si sono fondamentalmente l'attuazione di una versione di this question:

function onLoad() 
{ 
    if ($('#myStateInput').val() === '') // Load with no state. 
     $('#myStateInput').val('already loaded'); // Set state 
    else 
     alert("Loaded with state. (Duplicate tab or Back + Forward)"); 
} 

Thats grande e tutti, ma si solo desidera rilevare quando si "scheda Duplica". Per fare ciò possiamo cancellare lo stato in onbeforeunload. Funziona perché onbeforeunload viene chiamato solo quando l'utente fa clic su "Indietro" o "Avanti" ma non quando duplica una scheda.

secondo tentativo

function onLoad() 
{ 
    if ($('#myStateInput').val() === '') // Load with no state. 
     $('#myStateInput').val('already loaded'); // Set state 
    else 
     alert("Duplicate tab! Do something."); 

    $(window).on('beforeunload', function() // Back or Forward buttons 
    { 
     $('#myStateInput').val(''); // Blank the state out. 
    }); 
} 
+0

grazie, ha funzionato! – robert

+0

Ciao @JosiahDaniels, questo sembra funzionare perfettamente con Chrome, ma quando l'ho testato su IE10 non è apparso l'avviso, sai se c'è una soluzione alternativa per IE? Continuerò a lavorare, nel caso lo risolvo ti risponderò qui, per quanto riguarda – maxivis

+2

@maxivis Il pulsante IE duplicato equivale a copiare l'url, aprire una nuova scheda e incollare. Nessun dato sulla forma viene conservato. A parte i brutti scherzi davvero brutti che usano i cookie, non vedo un buon modo per gestirlo. – JosiahDaniels

1

La mia applicazione richiede che un utente può accedere solo su una volta in modo da poter utilizzare il localStorage ai record affidabile di cache. Il collegamento utilizza i flag localStorage per applicare questo requisito e utilizza window.name per sapere quale utente possiede la scheda.

Il problema era che la funzione di tabulazione duplicata del browser ha incasinato l'applicazione. Il codice sottostante forza una pagina di collegamento a comparire nella scheda duplicata se duplicano una sessione firmata.

Questa soluzione è stata testata in Chrome. Fa uso del fatto che una scheda duplicata non ha un nome. Questa caratteristica potrebbe non esistere in tutti i browser.

La funzione preventDuplicateTab viene chiamata molto presto nella sequenza di caricamento della pagina.

/* This prevents users from duplicating the tab. If they do it 
* triggers the start page which checks for duplicate userid 
*/ 
function preventDuplicateTab() { 
    if (sessionStorage.createTS) { 
    // Chrome at least has a blank window.name and we can use this 
    // signal this is a duplicated tab. 
    console.log("Existing sessionStorage "+sessionStorage.createTS+" 
       w.name="+window.name); 
    if (!window.name) { 
     window.name = "*ukn*"; 
     sessionStorage.createTS = Date.now(); // treat as new 
     window.location = "/res/Frame.htm?page=start.htm"; // force to 
                   signon screen 
    } 
    } else { 
    sessionStorage.createTS = Date.now(); 
    console.log("Create sessionStorage "+sessionStorage.createTS+" 
            w.name="+window.name); 
    } 
} 
0

Se si vuole evitare che più schede (duplicati o no), è possibile utilizzare una combinazione di risposta accettata qui, e una delle soluzioni a questa domanda: https://stackoverflow.com/a/11008432/1257546

So che il mio soluzione, con archiviazione locale e di sessione, funziona per me :-)

Se è necessario rilevare sessioni in più browser, è necessaria una soluzione lato server.