2014-09-18 67 views
5

Mam problemy z duplikowaną zakładką w Chrome (rzeczy z sesji) i chciałbym uniknąć akcji powielania kart (lub jej braku, aby zamknąć duplikat). Otwieram zakładkę jako wyskakujące okienko, bez paska adresu, bez paska stanu i bez niczego, tylko z okna. Nie ma sposobu na duplikowanie karty (otwieranej jako popup) w IE i Firefox (przynajmniej ja jej nie znalazłem), ale w chrome jest nadal możliwe.Jak rozpoznać, kiedy zakładka przeglądarki została powielona?

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

Każdy pomysł, jak podejść do tego?

dziękuję!

Odpowiedz

8

bramki

prostu do wyjaśnienia: Celem jest to, aby wykryć (i zamknij) zakładka, która została otwarta przez Chrome „Duplikat” opcji menu prawego przycisku myszy.

Najpierw spróbuj

zakładce „Duplikat” akcja działa niemal identycznie jak podczas przeładowywania strony, gdy użytkownik kliknął „Wstecz”, a następnie „Forward”, więc są w zasadzie realizuje wersję 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)"); 
} 

Ów wielki i wszystko, ale ty tylko chce wykryć, kiedy „Zakładka Duplikat”. W tym celu możemy wyzerować stan w onbeforeunload. Dzieje się tak, ponieważ onbeforeunload jest wywoływane tylko wtedy, gdy użytkownik kliknie "Wstecz" lub "Przekaż", ale nie w przypadku duplikowania karty.

drugie spróbować

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

dziękuję, to działało! – robert

+0

Witaj w @Josiah Daniels, wydaje się, że działa dobrze w Chrome, ale kiedy przetestowałem go w IE10, alert się nie pojawił, czy wiesz, czy istnieje obejście tego problemu? Będę pracował dalej, na wypadek, gdy go rozwiążę, odpowiem tutaj, pozdrawiam – maxivis

+2

@maxivis Przycisk duplikatu IE odpowiada ekwiwalentowi kopiowania adresu URL, otwieraniu nowej zakładki i wklejaniu. Żadne dane formularzy nie są zachowywane. Inne niż brzydkie hacki używające ciasteczek, nie widzę dobrego sposobu, by sobie z tym poradzić. – JosiahDaniels

1

mojego wniosku wymaganej że użytkownik może podpisać tylko na raz, więc mogę używać localStorage wiarygodnie cache Records. Signon używa flag localStorage do wymuszenia tego wymagania i używa window.name, aby wiedzieć, który użytkownik jest właścicielem karty.

Problem polegał na tym, że moduł zakładki duplikat przeglądarki pomieszał wymuszenie. Poniższy kod wymusza wyświetlenie strony logowania na zduplikowanej karcie, jeśli powieli oni podpisaną sesję.

To rozwiązanie zostało przetestowane w przeglądarce Chrome. Wykorzystuje fakt, że zduplikowana karta nie ma nazwy. Ta właściwość może nie być dostępna we wszystkich przeglądarkach.

Funkcja preventDuplicateTab jest wywoływana bardzo wcześnie w sekwencji ładowania strony.

/* 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

Jeśli chcesz zapobiec wielu kart (duplikat lub nie), można użyć kombinacji zaakceptowanej odpowiedzi tutaj, a jednym z rozwiązań tego pytania: https://stackoverflow.com/a/11008432/1257546

wiem, że mój rozwiązanie z lokalnym i sesyjnym przechowywaniem działa dla mnie :-)

Jeśli musisz wykrywać sesje w wielu przeglądarkach, potrzebujesz rozwiązania po stronie serwera.