2010-10-27 6 views
27

Sto solo pensando all'intero processo di registrazione del sito.È possibile rilevare se un utente ha più schede del proprio sito aperte?

Un utente va al tuo sito, si iscrive, e poi gli dici che gli hai mandato una e-mail e ha bisogno di verificare il suo indirizzo e-mail. Quindi colpisce Ctrl + T, apre una nuova scheda, fa clic sul pulsante Gmail fav, non legge una parola della tua lunga e-mail di benvenuto, ma fa clic sul primo link che vede. Gmail apre il tuo sito in un'altra scheda ...

Non ha bisogno né vuole aprire due schede per il tuo sito, vuole solo visualizzare quella dannata pagina a cui gli hai negato l'accesso finché non si registra.

Quindi cosa facciamo? Ho visto un sito (ma ho dimenticato quello che era) che ha fatto un ottimo lavoro, e in realtà ha aggiornato la prima scheda che avevo aperto senza che io debba premere nulla.

Sto pensando, potrebbe essere bello se possiamo rilevare se l'utente ha già una scheda sul tuo sito aperta, potremmo chiudere automaticamente la nuova scheda di verifica, o dirgli che può chiuderla può tornare indietro alla sua altra scheda (che ora abbiamo aggiornato e loggato).

Oppure, forse quando ha ricevuto il tuo fastidioso messaggio "controlla la tua e-mail", è andato direttamente alla sua email, sostituendo il tuo sito con la sua e-mail sapendo perfettamente che l'e-mail lo ricollegherà nuovamente al sito. In tal caso, non vogliamo chiudere la scheda, ma forse avremmo potuto salvare la sua posizione da prima, e reindirizzarlo di nuovo?

In ogni caso, questo è solo il caso d'uso ... la domanda rimane valida. Possiamo rilevare se un utente ha già una scheda sul tuo sito aperta?


Questa domanda non è su come rilevare quando un utente ha completato il processo di iscrizione. Il sondaggio Ajax o la cometa possono risolvere questo problema. Voglio specificamente sapere se l'utente ha già una scheda aperta sul tuo sito o meno.

+0

Non sono abbastanza convincente per scrivere una risposta completa, ma fondamentalmente, è necessario rintracciarlo con un cookie, o una memoria locale, o lato server - in realtà, qualsiasi forma di memorizzazione dei dati al di fuori di una singola finestra. –

+1

@Ed: mi interessa. Noto le piccole cose Quel sito ha fatto una buona impressione su di me! – mpen

+0

Qual è il tuo browser di destinazione? Potresti usare qualcosa come localStorage? – Warty

risposta

33

Sono in ritardo per la festa qui (oltre un anno), ma non ho potuto fare a meno di notare che ti sei perso una soluzione incredibilmente facile ed elegante (e probabilmente quello che il sito web che hai visto utilizzato).

Usando JavaScript è possibile modificare il nome della finestra attualmente aperta attraverso:

window.name = "myWindow"; 

Poi, quando si invia l'email di conferma semplicemente fare (supponendo che si sta inviando un email HTML):

Il che dovrebbe comportare l'apertura di verificationLink all'interno della finestra in cui il sito Web è già stato caricato, se è già stato chiuso verrà aperta una nuova scheda con il nome della finestra specificato.

+2

Non funzionerà se la pagina è aperta in due diversi browser. Ma ovviamente non è stato menzionato nella domanda, quindi WTH sto dicendo? : D –

+3

Questo in realtà non risponde alla domanda: "Possiamo rilevare se un utente ha già una scheda aperta sul tuo sito?" Un altro esempio potrebbe essere che si desidera avvisare l'utente se hanno due finestre aperte sul tuo sito. – bvs

6

È possibile inviare una richiesta AJAX ogni X secondi dalla scheda originale che chiede al server se ha ricevuto una richiesta dall'e-mail.

Non è possibile chiudere automaticamente la seconda scheda, ma è possibile chiedere al server dopo 3X secondi se è stato ascoltato dalla prima scheda.

2

L'utente avrà comunque una sessione sul server. Perché non memorizzare la posizione dell'utente prima della registrazione e quando confermano la registrazione, leggere il percorso fuori dalla sessione e reindirizzare nuovamente a quella pagina. Non è richiesta alcuna tabulazione. Non è certamente quello che mi aspetterei da una procedura di registrazione.

+0

Quindi avresti ancora la prima scheda. – SLaks

+0

Sì. Questo è ciò che accade in un processo di registrazione. Ci siamo abituati. – spender

+0

Quindi entrambe le schede hanno la stessa pagina aperta ... non abbiamo bisogno di due con la stessa identica pagina. Sto chiedendo come posso chiudere uno di loro. – mpen

6

È possibile interrompere la funzionalità di pagina quando l'utente apre un'altra scheda o un'altra finestra o addirittura un altro browser

$(window).blur(function(){ 
    // code to stop functioning or close the page 
}); 
3

Quello che abbiamo qui è un caso d'uso diverso po 'a voi, ma rileva se il sito è essere accesso in un'altra scheda. In questo caso volevo limitare le persone utilizzando alcune pagine del call center a una sola scheda. Funziona bene ed è puramente lato client.

// helper function to set cookies 
function setCookie(cname, cvalue, seconds) { 
    var d = new Date(); 
    d.setTime(d.getTime() + (seconds * 1000)); 
    var expires = "expires="+ d.toUTCString(); 
    document.cookie = cname + "=" + cvalue + ";" + expires + ";path=/"; 
} 

// helper function to get a cookie 
function getCookie(cname) { 
    var name = cname + "="; 
    var decodedCookie = decodeURIComponent(document.cookie); 
    var ca = decodedCookie.split(';'); 
    for(var i = 0; i < ca.length; i++) { 
     var c = ca[i]; 
     while (c.charAt(0) == ' ') { 
      c = c.substring(1); 
     } 
     if (c.indexOf(name) == 0) { 
      return c.substring(name.length, c.length); 
     } 
    } 
    return ""; 
} 

// Do not allow multiple call center tabs 
if (~window.location.hash.indexOf('#admin/callcenter')) { 
    $(window).on('beforeunload onbeforeunload', function(){ 
     document.cookie = 'ic_window_id=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/;'; 
    }); 

    function validateCallCenterTab() { 
     var win_id_cookie_duration = 10; // in seconds 

     if (!window.name) { 
      window.name = Math.random().toString(); 
     } 

     if (!getCookie('ic_window_id') || window.name === getCookie('ic_window_id')) { 
      // This means they are using just one tab. Set/clobber the cookie to prolong the tab's validity. 
      setCookie('ic_window_id', window.name, win_id_cookie_duration); 
     } else if (getCookie('ic_window_id') !== window.name) { 
      // this means another browser tab is open, alert them to close the tabs until there is only one remaining 
      var message = 'You cannot have this website open in multiple tabs. ' + 
       'Please close them until there is only one remaining. Thanks!'; 
      $('html').html(message); 
      clearInterval(callCenterInterval); 
      throw 'Multiple call center tabs error. Program terminating.'; 
     } 
    } 

    callCenterInterval = setInterval(validateCallCenterTab, 3000); 
} 
+0

Riassumi cosa stai facendo qui? Sembra che stiate dando a ogni finestra/tab un nome casuale e salvandolo in un cookie. Quindi controlli il cookie ogni 10 secondi e se non corrisponde, li avvisi? Quando tornano alla scheda 1, ripristinerà il nome in modo che la prima scheda sia in buono stato? – mpen

1

Per aggiungere ad altre risposte: È inoltre possibile utilizzare localStorage. Avere una voce come "openTabs". Quando la tua pagina è aperta, aumenta questo numero. Quando l'utente lascia la pagina, ridurla.