Wykryj zamknięcie przeglądarki lub karty

306

Czy jest jakiś kod JavaScript / jQuery dla różnych przeglądarek, aby wykryć, czy przeglądarka lub karta przeglądarki jest zamykana, ale nie z powodu kliknięcia łącza?

cometta
źródło
1
Zobacz moją odpowiedź na to pytanie: stackoverflow.com/questions/3735198/...
Nivas,
Użyj sessionStorage właściwości, wygasa po zamknięciu przeglądarki. w3schools.com/jsref/prop_win_sessionstorage.asp
csandreas1
Sprawdź tę odpowiedź! Uznałem, że jest to bardzo przydatne i obejmuje większość przypadków. stackoverflow.com/a/26275621/7192927
SukanyaPai

Odpowiedzi:

273

Jeśli otrzymam poprawnie, chcesz wiedzieć, kiedy karta / okno jest skutecznie zamknięte. AFAIK to jedyny sposób Javascriptna wykrycie tego rodzaju rzeczy onunloadi onbeforeunloadzdarzeń.

Niestety (lub na szczęście?) Zdarzenia te są również uruchamiane, gdy opuszczasz witrynę nad linkprzyciskiem Wstecz lub przeglądarki. To jest najlepsza odpowiedź, jaką mogę udzielić, nie sądzę, abyś mógł natywnie wykryć czysty closekod JavaScript. Popraw mnie, jeśli się tu mylę.

jAndy
źródło
39
Poprawny. Możesz jedynie wykryć, kiedy strona jest rozładowana, a nie kiedy okno jest zamknięte. Ponadto, onbeforeunload jest niestandardowy, więc nie jest obsługiwany przez wszystkie przeglądarki.
Guffa,
7
Chciałem również użyć funkcji „przy zamknięciu”, ale zauważyłem, że moi użytkownicy od czasu do czasu odświeżają ekran, naciskając klawisz F5. Ponieważ moje moduły obsługi „przy zamknięciu” są wywoływane podczas takiego odświeżania, oznacza to, że nie mogę używać tego w sposób, w jaki go potrzebowałem (co było prawdziwą „zamknij kartę lub okno”) ... cholera, potrzebujemy nowego modelu zdarzenia za to wszystko!
Jeach
1
Nie działa już na chrome / opera ... chromestatus.com/feature/5349061406228480
Samir Seetal
2
Oczywiście to nadal będzie działać, właśnie usunęli niestandardową Stringwartość zwracaną z onbeforeunload. Nie możesz już wyświetlać niestandardowego komunikatu przed rozładowaniem.
jAndy
@jAndy @Guffa Jak mogę dowiedzieć się, które okno zostało uruchomione unload?
Egor Dudyak
125

Z dokumentacji Firefox

Z niektórych powodów przeglądarki oparte na Webkit nie są zgodne ze specyfikacją okna dialogowego. Prawie przekrojowy przykład byłby bliski poniższemu przykładowi.

window.addEventListener("beforeunload", function (e) {
  var confirmationMessage = "\o/";

  (e || window.event).returnValue = confirmationMessage; //Gecko + IE
  return confirmationMessage;                            //Webkit, Safari, Chrome
});

Ten przykład obsługi wszystkich przeglądarek.

mohamed-ibrahim
źródło
2
To jedyne rozwiązanie, które działało w mojej przeglądarce Chrome. Nie próbowałem żadnych innych.
Chase Roberts,
4
tak, wypróbowuję wiele rozwiązań i mam na końcu tę kombinację, która daje najlepsze odpowiedzi, i testuję to we wszystkich przeglądarkach.
mohamed-ibrahim
1
Ta metoda nie działa idealnie przy zamykaniu tabulatorów podczas używania Firefoxa (> = wer. 44) z otwartą tylko tabulacją.
Rajkishore
Na dzień dzisiejszy, przy użyciu wszystkich najnowszych wersji przeglądarek, monit działa podczas zamykania karty, nawigacji lub zamykania przeglądarki w Chrome, Firefox, Opera, IE11 i Edge, a także działa, gdy masz otwartych wiele kart, z wyjątkiem Chrome, w której Chrome zamyka wszystkie karty bez monitowania, przynajmniej na moim komputerze.
Thierry
nie podawać poprawnie, jak zdefiniowano w pytaniu. To również wywołało zdarzenie opuszczania strony, nie tylko zamknięcie przeglądarki lub zamknięcie karty
Sunil Acharya,
48

Proste rozwiązanie

window.onbeforeunload = function () {
    return "Do you really want to close?";
};

źródło
7
Co to za magia? (y) czy działa na wszystkich przeglądarkach? działa świetnie na chromie
Ziv Weissman
5
uruchamia się po odświeżeniu strony. to mój jedyny problem.
Leo Leoncio,
6
To rozwiązanie nie jest już dostępne w przeglądarce Firefox i Chrome
Mehdi Dehghani,
To również wywołało zdarzenie opuszczania strony, nie tylko zamknięcie przeglądarki lub zamknięcie karty
Sunil Acharya,
20
<body onbeforeunload="ConfirmClose()" onunload="HandleOnClose()">

var myclose = false;

function ConfirmClose()
{
    if (event.clientY < 0)
    {
        event.returnValue = 'You have closed the browser. Do you want to logout from your application?';
        setTimeout('myclose=false',10);
        myclose=true;
    }
}

function HandleOnClose()
{
    if (myclose==true) 
    {
        //the url of your logout page which invalidate session on logout 
        location.replace('/contextpath/j_spring_security_logout') ;
    }   
}

// Działa to w IE7, jeśli zamykasz kartę lub przeglądarkę za pomocą tylko jednej karty

jyothis
źródło
2
ya. ale w przypadku przeglądarki z wieloma kartami, np. Firefox 8. czy jest problem z użyciem tego?
cometta
Okazuje się, że użycie tego kodu w IE9 spowoduje pojawienie się tego komunikatu, gdy użytkownik kliknie myszką przyciski wstecz, do przodu lub odświeżania.
Steve Wortham
Tylko jedna wiadomość, że wdrożyliśmy podobne rozwiązanie w 2007 roku. To rozwiązanie nie działa już w IE9 mniej więcej tydzień temu. Już dawno przestał działać (lub być może nigdy nie działał) w przeglądarkach z kartami.
tjfo
Wstrzyknąłem window.onunload = "alert('wait')"i window.onbeforeunload = "alert('wait... chrome!')"korzystałem z konsoli w Chromium / Ubuntu, ale żaden nie został uruchomiony po zamknięciu karty.
lodowaty
window.onunload = "alert('wait')"i takie nie powinny naprawdę działać. „Funkcja powinna przypisać wartość ciągu do właściwości returnValue obiektu Event i zwrócić ten sam ciąg”. Proszę spojrzeć na artykuł MDN
Dmitrij Wypriczenko
8

Musiałem automatycznie wylogować użytkownika po zamknięciu przeglądarki lub karty, ale nie wtedy, gdy użytkownik przejdzie do innych łączy. Nie chciałem też, aby pojawił się monit o potwierdzenie. Po dłuższej walce z tym, szczególnie w IE i Edge, oto co skończyłem (sprawdziłem pracę z IE 11, Edge, Chrome i Firefox) po tym, jak oparłem podejście na tej odpowiedzi .

Najpierw uruchom licznik czasu na serwerze w beforeunloadmodule obsługi zdarzeń w JS. Wywołania ajax muszą być synchroniczne, aby IE i Edge działały poprawnie. Musisz także użyć, return;aby zapobiec wyświetlaniu okna dialogowego potwierdzenia w następujący sposób:

    window.addEventListener("beforeunload", function (e) {        
      $.ajax({
          type: "POST",
          url: startTimerUrl,
          async: false           
      });
      return;
    });

Uruchomienie timera ustawia cancelLogoutflagę na false . Jeśli użytkownik odświeży stronę lub przejdzie do innego łącza wewnętrznego, cancelLogoutflaga na serwerze zostanie ustawiona na wartość true . Po upływie zdarzenia licznika czasu sprawdza cancelLogoutflagę, aby sprawdzić, czy zdarzenie wylogowania zostało anulowane. Jeśli stoper został anulowany, wówczas stoper zostałby zatrzymany. Jeśli przeglądarka lub karta cancelLogoutzostaną zamknięte, flaga pozostanie fałszywa, a moduł obsługi zdarzeń wyloguje użytkownika.

Uwaga dotycząca implementacji: używam ASP.NET MVC 5 i anuluję wylogowanie w przesłoniętej Controller.OnActionExecuted()metodzie.

Ionian316
źródło
To działało świetnie. Czy istnieje powód, dla którego wybierasz „async: false”? Generuje to ostrzeżenia, że ​​synchroniczne wywołania AJAX są przestarzałe. Dzięki!
cat_in_hat 16.07.2018
1
@FoundWaldoException, jak zauważono w odpowiedzi, stwierdziłem, że async musi być ustawiony na false, aby działał w IE i Edge.
Ionian316
Jak anulować wylogowanie OnActionExecuted?
Kiquenet,
@Kiquenet Wystarczy zatrzymać minutnik, który został uruchomiony w kodzie.
Ionian316,
6

Niestety, nie byłem w stanie dodać komentarza do jednej z istniejących odpowiedzi, ale jeśli chciałbyś zaimplementować rodzaj okna dialogowego z ostrzeżeniem, chciałem tylko wspomnieć, że każda funkcja obsługi zdarzeń ma argument - zdarzenie. W twoim przypadku możesz wywołać event.preventDefault (), aby uniemożliwić automatyczne opuszczanie strony, a następnie wydać własne okno dialogowe. Uważam to za zdecydowanie lepszą opcję niż używanie standardowego brzydkiego i niepewnego alert (). Osobiście zaimplementowałem własny zestaw okien dialogowych opartych na obiekcie kendoWindow (interfejs użytkownika Kendo Telerik, który jest prawie w całości otwarty, z wyjątkiem kendoGrid i kendoEditor). Możesz także użyć okien dialogowych z interfejsu użytkownika jQuery. Pamiętaj jednak, że takie rzeczy są asynchroniczne i będziesz musiał powiązać moduł obsługi ze zdarzeniem onclick każdego przycisku, ale wszystko to jest dość łatwe do wdrożenia.

Zgadzam się jednak, że brak prawdziwego zdarzenia zamknięcia jest okropny: jeśli na przykład chcesz zresetować stan sesji na zapleczu tylko w przypadku prawdziwego zamknięcia, jest to problem.

Alex Iurovetski
źródło
6

W przypadku podobnych zadań można użyć sessionStoragedo lokalnego przechowywania danych do momentu zamknięcia karty przeglądarki.

Te sessionStoragedane przechowuje obiekt tylko dla jednej sesji (dane są usuwane po zamknięciu przeglądarki zakładka). ( W3Schools )

To jest mój długopis .

<div id="Notice">
    <span title="remove this until browser tab is closed"><u>dismiss</u>.</span>
</div>
<script>
    $("#Notice").click(function() {
     //set sessionStorage on click
        sessionStorage.setItem("dismissNotice", "Hello");
        $("#Notice").remove();
    });
    if (sessionStorage.getItem("dismissNotice"))
    //When sessionStorage is set Do stuff...
        $("#Notice").remove();
</script>
csandreas1
źródło
5

Nie ma zdarzenia, ale jest właściwość window.closed która jest obsługiwana we wszystkich głównych przeglądarkach w momencie pisania tego tekstu. Dlatego jeśli naprawdę potrzebujesz wiedzieć, możesz przeszukać okno, aby sprawdzić tę właściwość.

if(myWindow.closed){do things}

Uwaga: odpytywanie czegokolwiek na ogół nie jest najlepszym rozwiązaniem. window.onbeforeunloadZdarzenie powinno być stosowane, jeżeli jest to możliwe, tylko zastrzeżenie jest to, iż również pożary, jeśli opuścisz.

dlsso
źródło
4
$(window).unload( function () { alert("Bye now!"); } );
Poonam Bhatt
źródło
9
To nie będzie działać w przeglądarce Firefox lub Chrome. Spróbuj, beforeunloadjeśli chcesz wyświetlić alert. W ten sposób:$(window).on('beforeunload', function(){ alert ('Bye now')});
AdrianoRR,
5
zgodnie z dokumentacją jQuery „Większość przeglądarek zignoruje wywołania alert (), confirm () i prompt ()” api.jquery.com/unload
katzmopolitan
4

Spróbuj użyć:

window.onbeforeunload = function (event) {
    var message = 'Important: Please click on \'Save\' button to leave this page.';
    if (typeof event == 'undefined') {
        event = window.event;
    }
    if (event) {
        event.returnValue = message;
    }
    return message;
};

$(function () {
    $("a").not('#lnkLogOut').click(function () {
        window.onbeforeunload = null;
    });
    $(".btn").click(function () {
        window.onbeforeunload = null;
});
});
Fezal halai
źródło
3

Znalazłem sposób, który działa na wszystkich moich przeglądarkach .

Testowany na następujących wersjach: Firefox 57, Internet Explorer 11, Edge 41, jeden z najnowszych Chrome (nie wyświetla mojej wersji)

Uwaga : onbeforeunload uruchamia się, jeśli opuścisz stronę w jakikolwiek możliwy sposób (odśwież, zamknij przeglądarkę, przekieruj, połącz, prześlij ...). Jeśli chcesz, aby stało się to tylko przy zamknięciu przeglądarki, po prostu powiąż programy obsługi zdarzeń.

  $(document).ready(function(){         

        var validNavigation = false;

        // Attach the event keypress to exclude the F5 refresh (includes normal refresh)
        $(document).bind('keypress', function(e) {
            if (e.keyCode == 116){
                validNavigation = true;
            }
        });

        // Attach the event click for all links in the page
        $("a").bind("click", function() {
            validNavigation = true;
        });

        // Attach the event submit for all forms in the page
        $("form").bind("submit", function() {
          validNavigation = true;
        });

        // Attach the event click for all inputs in the page
        $("input[type=submit]").bind("click", function() {
          validNavigation = true;
        }); 

        window.onbeforeunload = function() {                
            if (!validNavigation) {     
                // ------->  code comes here
            }
        };

  });
Syno
źródło
Jak zostanie dodany osobny moduł obsługi zamykania przeglądarki. Nie sądzę, że mamy do tego osobne zdarzenie.
blazehub
To było bardzo pomocne. Musiałem dostosować kotwicę A, aby uruchamiała tylko rzeczywiste hiperłącza. W przeciwnym razie kliknięcie kart bootstrap pomieszało: $ ("a [href! = '']"). Not ('[href ^ = "#"]'). Bind ("click", function ()
Ken Forslund
3

Ponieważ nikt jeszcze o tym nie wspominał (8+ lat później): WebSocket może być kolejnym skutecznym sposobem na wykrycie zamkniętej karty. Tak długo, jak karta jest otwarta i skierowana na hosta, klient może utrzymywać aktywne połączenie WebSocket z hostem.

Zastrzeżenie: Należy pamiętać, że to rozwiązanie jest naprawdę wykonalne tylko dla projektu, jeśli WebSocket nie wymaga żadnych dodatkowych znaczących kosztów ogólnych z tego, co już robisz.

W rozsądnym czasie (np. 2 minuty) strona serwera może stwierdzić, że klient zniknął po rozłączeniu WebSocket, i wykonać dowolne pożądane działanie, takie jak usunięcie przesłanych plików tymczasowych. (W moim wyjątkowo wyspecjalizowanym przypadku moim celem było zakończenie serwera aplikacji localhost trzy sekundy po zerwaniu połączenia WebSocket i zakończeniu aktywności CGI / FastCGI - żadne inne połączenia podtrzymujące mnie nie dotyczą.)

Miałem problemy z poprawnym działaniem modułu obsługi zdarzeń onunload z sygnalizatorami (zgodnie z zaleceniami tej odpowiedzi ). Wydaje się, że zamknięcie karty nie wyzwalało sygnału nawigacyjnego, a otwarte karty wyzwoliły ją w sposób, który potencjalnie może powodować problemy. WebSocket rozwiązał problem, na który wpadałem bardziej czysto, ponieważ połączenie zamyka się mniej więcej w tym samym czasie, w którym karta zamyka się, a przełączanie stron w aplikacji po prostu otwiera nowe połączenie WebSocket dobrze w oknie opóźnienia.

CubicleSoft
źródło
2
w porządku. Ale czy nie możesz udostępnić żadnego kodu lub procedury do obsługi? Bez tego dla nooba takiego jak ja nie może zrozumieć
P Satish Patro
Właściwie nie było jasne w moim pierwszym komentarzu. Nie znam gniazda sieciowego. Chciałem tylko zobaczyć, jak sobie z tym poradzić
P Satish Patro
1
Link w moim powyższym komentarzu prowadzi do przykładowego kodu JS WebSocket. Część JS klienta jest częścią łatwą. Ten kod jest przeznaczony dla mojego bardzo szczególnego przypadku użycia, w którym muszę terminowo zamknąć cały serwer aplikacji. Sposób pisania serwera WebSocket zależy od Ciebie i wymaga konfiguracji po stronie serwera, aby połączyć wszystko (wiele osób woli backend NodeJS z frontendem Nginx). Pisanie serwera obsługującego protokół TCP / IP jest złożonym tematem, który nie nadaje się do dyskusji w komentarzach, a konfigurowanie go tylko w celu wykrycia tego konkretnego problemu jest przesadą.
CubicleSoft
2
//Detect Browser or Tab Close Events
$(window).on('beforeunload',function(e) {
  e = e || window.event;
  var localStorageTime = localStorage.getItem('storagetime')
  if(localStorageTime!=null && localStorageTime!=undefined){
    var currentTime = new Date().getTime(),
        timeDifference = currentTime - localStorageTime;

    if(timeDifference<25){//Browser Closed
       localStorage.removeItem('storagetime');
    }else{//Browser Tab Closed
       localStorage.setItem('storagetime',new Date().getTime());
    }

  }else{
    localStorage.setItem('storagetime',new Date().getTime());
  }
});

JSFiddle Link

Cześć wszystkim, udało mi się uzyskać kliknięcia „Wykryj zdarzenie przeglądarki i zamknij kartę” za pomocą lokalnej pamięci przeglądarki i znacznika czasu. Mam nadzieję, że wszyscy rozwiążą swoje problemy, korzystając z tego rozwiązania.

Po moich wstępnych badaniach odkryłem, że kiedy zamykamy przeglądarkę, przeglądarka zamyka wszystkie karty jeden po drugim, aby całkowicie zamknąć przeglądarkę. Dlatego zauważyłem, że pomiędzy zamknięciem kart będzie bardzo małe opóźnienie. Tak więc uznałem to opóźnienie za główny punkt sprawdzania poprawności i mogłem osiągnąć wykrycie zdarzenia zamknięcia przeglądarki i karty.

Przetestowałem to na przeglądarce Chrome w wersji 76.0.3809.132 i stwierdziłem, że działa

:) Głosuj, jeśli moja odpowiedź była pomocna ....

ramojuraju
źródło
To dało mi pomysł. Ustawiam znacznik czasu plus 10 sekund w pamięci lokalnej po zalogowaniu i na zdarzeniu przed odciążeniem. Po załadowaniu sprawdzam, czy czas minął, a następnie przekierowuję na stronę logowania. Dzięki :)
G4BB3R
1
window.onbeforeunload = function() {
  console.log('event');
  return false; //here also can be string, that will be shown to the user
}
IvanM
źródło
2
here also can be string, that will be shown to the userw
Firefoxie
Każda zwracana wartość (ciąg) jest wyświetlana tylko w MSIE <= 11. W zasadzie bezużyteczne dla wszystkich innych przeglądarek.
OSWorX
1

Można to sprawdzić za pomocą window.closed w module obsługi zdarzeń na zdarzeniu „rozładuj” w ten sposób, ale wymagane jest przekroczenie limitu czasu (więc wynik nie może być zagwarantowany, jeśli opóźnia się okno lub uniemożliwia zamknięcie okna):

Przykład JSFiddle (testowany na Lates Safari, FF, Chrome, Edge i IE11)

var win = window.open('', '', 'width=200,height=50,left=200,top=50');
win.document.write(`<html>
   <head><title>CHILD WINDOW/TAB</title></head>
   <body><h2>CHILD WINDOW/TAB</h2></body>
</html>`);
win.addEventListener('load',() => {
    document.querySelector('.status').innerHTML += '<p>Child was loaded!</p>';
});
win.addEventListener('unload',() => {
    document.querySelector('.status').innerHTML += '<p>Child was unloaded!</p>';
    setTimeout(()=>{
        document.querySelector('.status').innerHTML +=  getChildWindowStatus();
    },1000);
});
win.document.close()
document.querySelector('.check-child-window').onclick = ()=> {
    alert(getChildWindowStatus());
}
function getChildWindowStatus() {
  if (win.closed) { 
      return 'Child window has been closed!';
  } else {
      return 'Child window has not been closed!';
  }
}
Rvach.Flyver
źródło
1

Wypróbowałem wszystkie powyższe rozwiązania, żadne z nich tak naprawdę nie działało dla mnie, szczególnie dlatego, że w moim projekcie jest kilka komponentów Telerik, które mają przycisk „Zamknij” dla okien wyskakujących i wywołuje zdarzenie „przed załadowaniem”. Ponadto selektor przycisków nie działa poprawnie, jeśli na stronie znajduje się siatka Telerik (mam na myśli przyciski w siatce). Nie mogłem więc użyć żadnej z powyższych sugestii. Wreszcie to rozwiązanie zadziałało dla mnie. Dodałem zdarzenie onUnload do znacznika body _Layout.cshtml. Coś takiego:

<body onUnload="LogOff()">

a następnie dodaj funkcję LogOff, aby przekierować do konta / LogOff, która jest wbudowaną metodą w Asp.Net MVC. Teraz, kiedy zamykam przeglądarkę lub kartę, następuje przekierowanie do metody LogOff, a użytkownik musi się zalogować po powrocie. Przetestowałem to w Chrome i Firefox. I to działa!

  function LogOff() {
        $.ajax({
            url: "/Account/LogOff",
            success: function (result) {

                                        }
               });
       }
Amir978
źródło
0
window.onbeforeunload = function ()
{       

    if (isProcess > 0) 
    {
        return true;       
    }   

    else
    { 
        //do something      
    }
}; 

Ta funkcja wyświetla okno dialogowe potwierdzenia, jeśli zamkniesz okno lub odświeżysz stronę podczas dowolnego procesu w przeglądarce. Ta funkcja działa we wszystkich przeglądarkach. Musisz ustawić zmienną isProcess var w procesie ajax.

Hari
źródło
pełna próbka dla zestawu isProcess?
Kiquenet,
0
window.addEventListener("beforeunload", function (e) {
 var confirmationMessage = "tab close";

 (e || window.event).returnValue = confirmationMessage;     //Gecko + IE
 sendkeylog(confirmationMessage);
 return confirmationMessage;                                //Webkit, Safari, Chrome etc.
}); 
użytkownik3098847
źródło
Właściwie chciałem pokazać komunikat potwierdzający, jeśli użytkownik zamknie kartę, TYLKO. To działa dla mnie. Ale mam do czynienia z problemem, który: jeśli kliknę dowolny link na tej samej stronie, to również pojawi się komunikat potwierdzający. Więcej informacji na ten temat: w3schools.com/code/tryit.asp?filename=FEK2KWUN9R8Z @Tunaki
Mohammed
1
co jest sendkeylog?
Kiquenet,
0

Jak wspomniano @jAndy, nie ma poprawnie kodu javascript do wykrywania zamykanego okna. Zacząłem od tego, co zaproponował @Syno.

Przeszedłem przez taką sytuację i pod warunkiem, że wykonasz te kroki, będziesz w stanie ją wykryć.
Przetestowałem to na Chrome 67+ i Firefox 61+.

var wrapper = function () { //ignore this

var closing_window = false;
$(window).on('focus', function () {
    closing_window = false; 
   //if the user interacts with the window, then the window is not being 
   //closed
});

$(window).on('blur', function () {

    closing_window = true;
    if (!document.hidden) { //when the window is being minimized
        closing_window = false;
    }
    $(window).on('resize', function (e) { //when the window is being maximized
        closing_window = false;
    });
    $(window).off('resize'); //avoid multiple listening
});

$('html').on('mouseleave', function () {
    closing_window = true; 
    //if the user is leaving html, we have more reasons to believe that he's 
    //leaving or thinking about closing the window
});

$('html').on('mouseenter', function () {
    closing_window = false; 
    //if the user's mouse its on the page, it means you don't need to logout 
    //them, didn't it?
});

$(document).on('keydown', function (e) {

    if (e.keyCode == 91 || e.keyCode == 18) {
        closing_window = false; //shortcuts for ALT+TAB and Window key
    }

    if (e.keyCode == 116 || (e.ctrlKey && e.keyCode == 82)) {
        closing_window = false; //shortcuts for F5 and CTRL+F5 and CTRL+R
    }
});

// Prevent logout when clicking in a hiperlink
$(document).on("click", "a", function () {
    closing_window = false;
});

// Prevent logout when clicking in a button (if these buttons rediret to some page)
$(document).on("click", "button", function () {
    closing_window = false;

});
// Prevent logout when submiting
$(document).on("submit", "form", function () {
    closing_window = false;
});
// Prevent logout when submiting
$(document).on("click", "input[type=submit]", function () {
    closing_window = false;
});

var toDoWhenClosing = function() {

    //write a code here likes a user logout, example: 
    //$.ajax({
    //    url: '/MyController/MyLogOutAction',
    //    async: false,
    //    data: {

    //    },
    //    error: function () {
    //    },
    //    success: function (data) {
    //    },
    //});
};


window.onbeforeunload = function () {
    if (closing_window) {
        toDoWhenClosing();
    }
};

};

Bruno Henrique
źródło
1
Masz pewne problemy z kodem javascript. Pierwszą rzeczą, którą zauważyłem, jest ciągłe wiązanie, resizegdy okno jest rozmyte. Jeśli 100 razy się rozmyje, będziesz mieć 100 słuchaczy, co spowoduje spowolnienie przeglądarki.
Kyle
Wstawiam $ (okno) .off ('resize'), czy to wystarczy?
Bruno Henrique
Technicznie, ale usunie także wszelkie inne programy obsługi, które zostały dodane w innym miejscu za pomocą jQuery.
Kyle
-2

spróbuj tego, jestem pewien, że to zadziała dla ciebie.

<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script>
<script type='text/javascript'>
    $(function() {

        try{
            opera.setOverrideHistoryNavigationMode('compatible');
            history.navigationMode = 'compatible';
        }catch(e){}

        function ReturnMessage()
        {
            return "wait";
        }

        function UnBindWindow()
        {
            $(window).unbind('beforeunload', ReturnMessage);
        }

        $(window).bind('beforeunload',ReturnMessage );
    });
</script>
Tejash Raval Prajapati
źródło
-3

Spróbuj tego. To będzie działać. metoda odciążania jquery jest przestarzała.

window.onbeforeunload = function(event) {
    event.returnValue = "Write something clever here..";
};
Arda Ç.
źródło