Tarayıcı veya sekme kapanışını algılama


306

Tarayıcının veya tarayıcı sekmesinin kapatılıp kapatılmadığını, ancak bir bağlantının tıklanmasından kaynaklanmadığını tespit etmek için tarayıcılar arası JavaScript / jQuery kodu var mı?


1
Bu soruya cevabımı görün: stackoverflow.com/questions/3735198/…
Nivas


Özellik'i kullanın sessionStorage , tarayıcı kapatıldığında süresi dolar. w3schools.com/jsref/prop_win_sessionstorage.asp
csandreas1

Bu cevabı kontrol edin! Son derece kullanışlı buldum ve vakaların çoğunu kapsıyorum. stackoverflow.com/a/26275621/7192927
SukanyaPai

Yanıtlar:


273

Sizi doğru şekilde alırsam, bir sekmenin / pencerenin ne zaman etkin bir şekilde kapatıldığını bilmek istersiniz. AFAIK, Javascriptbu tür şeyleri onunloadve onbeforeunloadolayları tespit etmenin tek yolu .

Maalesef (veya neyse ki?), Bir siteyi bir linkveya tarayıcılarınızın geri düğmesi üzerinde bıraktığınızda bu etkinlikler de tetiklenir . Bu yüzden verebileceğim en iyi cevap close, Javascript'te doğal olarak bir saf tespit edebileceğinizi sanmıyorum . Burada yanılıyorsam düzelt.


39
Doğru. Pencere kapatıldığında değil, yalnızca sayfa kaldırıldığında tespit edebilirsiniz. Ayrıca, onbeforeunload standart değildir, bu nedenle tüm tarayıcılar tarafından desteklenmez.
Guffa

7
'Kapanış' özelliğini de kullanmak istedim, ancak kullanıcılarımın F5 tuşuna basarak zaman zaman ekranı yenileyeceğini fark ettim. 'Kapat' işleyicilerim böyle bir yenileme için çağrıldığından, bu onu ihtiyacım olan şekilde kullanamadığım anlamına geliyor (gerçek bir 'kapat sekmesi veya penceresi') ... lanet olsun, yeni bir etkinlik modeline ihtiyacımız var bütün bunlar için!
Jeach

1
Artık krom / opera üzerinde çalışmıyor
Samir Seetal

2
Tabii ki bu hala işe yarayacak, sadece özel bir Stringdönüş değerini kaldırdılar onbeforeunload. Böylece artık yüklemeden önce özel bir mesaj görüntüleyemezsiniz.
jAndy

@jAndy @Guffa Hangi pencerenin açıldığını nasıl öğrenebilirim unload?
Egor Dudyak

125

Gönderen Firefox Belgeler

Bazı nedenlerden dolayı, Webkit tabanlı tarayıcılar iletişim kutusunun teknik özelliklerine uymaz. Neredeyse çapraz çalışan bir örnek aşağıdaki örnekten daha yakın olacaktır.

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

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

Tüm tarayıcıları işlemek için bu örnek.


2
Chrome tarayıcım için çalışan tek çözüm bu. Başka birini denemedim.
Chase Roberts

4
evet, ben bir çok çözüm denemek ve ben sonunda bu, en iyi cevaplar için kombinasyon ile geliyor, ve ben tüm tarayıcılarda test.
mohamed-ibrahim

1
Bu yöntem, yalnızca sekme açıkken firefox (> = ver. 44) kullanılırken sekme kapanışında mükemmel çalışmıyor.
Rajkishore

Bugün itibariyle, tarayıcıların en son sürümlerini kullanarak, sekmeyi kapatırken, Chrome, Firefox, Opera, IE11 ve Edge için tarayıcıyı kapatırken veya kapatırken komut istemi çalışıyor ve Chrome'un tüm sekmeleri kapattığı Chrome dışında birden çok sekmeniz açıldığında da çalışıyor sormadan, en azından makinemde iyi.
Thierry

söz konusu şekilde tanımlandığı gibi uygun bir sonuç vermemek. Bu aynı zamanda sayfa terk olayını sadece tarayıcı kapat veya sekme kapatmayı tetiklemedi
Sunil Acharya

48

Basit Çözüm

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

7
Bu ne tür bir büyü? (y) tüm tarayıcılarda çalışıyor mu? krom üzerinde harika çalışıyor
Ziv Weissman

5
sayfayı yenilediğinizde tetiklenir. bu benim tek sorunum.
Leo Leoncio

6
Bu çözüm artık Firefox ve Chrome'da değil
Mehdi Dehghani

Bu aynı zamanda sayfa terk olayını sadece tarayıcı kapat veya sekme kapatmayı tetiklemedi
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') ;
    }   
}

// Sekmeyi veya tarayıcıyı yalnızca bir sekmeyle kapatıyorsanız, IE7'de çalışır


2
ya. ancak ie8, firefox gibi çoklu sekme tarayıcıları için. bunu kullanırken sorun var mı?
kuyruklu yıldız

IE9'da bu kodu kullanmanın, kullanıcı fareleriyle geri, ileri veya yenileme düğmelerini tıklattığında bu iletinin açılmasına neden olacağı ortaya çıkıyor.
Steve Wortham

Sadece benzer bir çözümü 2007'de uyguladığımız bir kafa. Bu çözüm yaklaşık bir hafta önce IE9'da artık çalışmıyor. Uzun süre önce sekmeli tarayıcılarda çalışmayı durdurdu (veya muhtemelen hiç çalışmadı).
tjfo

Konsolu Chromium / Ubuntu'ya enjekte ettim window.onunload = "alert('wait')"ve window.onbeforeunload = "alert('wait... chrome!')"kullandım, ancak sekmeyi kapattığımda hiçbiri ateşlemedi.
icedwater

window.onunload = "alert('wait')"ve böyle bir şey gerçekten çalışmamalı. "İşlev, Event nesnesinin returnValue özelliğine bir dize değeri atamalı ve aynı dizeyi döndürmelidir". Lütfen MDN makalesine
Dmitry Vyprichenko

8

Tarayıcı veya sekme kapandığında kullanıcının oturumunu otomatik olarak kapatmam gerekiyordu, ancak kullanıcı diğer bağlantılara gittiğinde değil. Ayrıca bu olduğunda bir onay isteminin gösterilmesini istemedim. Bir süre bununla, özellikle IE ve Edge ile mücadele ettikten sonra, bu cevabın yaklaşımını temel aldıktan sonra (IE 11, Edge, Chrome ve Firefox ile çalışmayı kontrol ettim) işimi bitirdim .

İlk olarak, JS'deki beforeunloadolay işleyicisinde sunucuda bir geri sayım sayacı başlatın . IE ve Edge'in düzgün çalışması için ajax çağrılarının senkronize olması gerekir. return;Onay iletişim kutusunun aşağıdaki gibi görünmesini önlemek için de kullanmanız gerekir :

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

Zamanlayıcının başlatılması cancelLogoutbayrağı false olarak ayarlar . Kullanıcı sayfayı yeniler veya başka bir dahili bağlantıya cancelLogoutgiderse, sunucudaki bayrak true olarak ayarlanır . Timer olayı sona erdiğinde, cancelLogoutoturum kapatma olayının iptal edilip edilmediğini görmek için bayrağı kontrol eder . Zamanlayıcı iptal edilmişse zamanlayıcı durur. Tarayıcı veya sekme kapatıldıysa, cancelLogoutbayrak yanlış kalır ve olay işleyicisi kullanıcının oturumunu kapatır .

Uygulama notu: ASP.NET MVC 5 kullanıyorum ve geçersiz kılınmış bir Controller.OnActionExecuted()yöntemde oturumu kapatma işlemini iptal ediyorum .


Bu harika çalıştı. "Async: false" yapmanın bir nedeni var mı? Bu, eşzamanlı AJAX çağrılarının kullanımdan kaldırıldığına dair uyarılar oluşturur. Teşekkürler!
cat_in_hat

1
@FoundWaldoException, yanıtta belirtildiği gibi, bunun IE ve Edge'de çalışması için zaman uyumsuzluğunun false olarak ayarlanması gerektiğini buldum.
Ionian316

Çıkış nasıl iptal edilir OnActionExecuted?
Kiquenet

@Kiquenet Sadece kodunuzda başlayan zamanlayıcıyı durdurun.
Ionian316

6

Maalesef, mevcut yanıtlardan birine yorum ekleyemedim, ancak bir tür uyarı iletişim kutusu uygulamak istemeniz durumunda, herhangi bir olay işleyicisi işlevinin bir argüman - olayı olduğunu belirtmek istedim. Sizin durumunuzda, sayfadan otomatik olarak ayrılmasına izin vermemek için event.preventDefault () yöntemini çağırabilir, ardından kendi iletişim kutunuzu düzenleyebilirsiniz. Bunu standart çirkin ve güvensiz uyarı () kullanmaktan daha iyi bir seçenek olarak görüyorum. KendoWindow nesnesine (kendimKrid ve kendoEditor dışında neredeyse tamamen açık kaynaklı olan Telerik'in Kendo Kullanıcı Arayüzü) dayalı kendi iletişim kutuları setimi kişisel olarak uyguladım. JQuery kullanıcı arayüzünden iletişim kutularını da kullanabilirsiniz. Bununla birlikte, bu tür şeylerin eşzamansız olduğunu ve her düğmenin onclick olayına bir işleyici bağlamanız gerekeceğini lütfen unutmayın, ancak bunların uygulanması oldukça kolaydır.

Ancak, gerçek kapatma etkinliğinin eksikliğinin korkunç olduğunu kabul ediyorum: Örneğin, oturum durumunuzu arka uçta yalnızca gerçek kapatma durumunda sıfırlamak istiyorsanız, bu bir sorundur.


6

Benzer görevler sessionStorageiçin tarayıcı sekmesi kapatılana kadar yerel olarak veri depolamak için kullanabilirsiniz .

sessionStorageSadece bir oturumda (tarayıcı sekmesi kapatıldığında verileri silinir) için nesne verileri saklar. ( W3Schools )

Bu benim kalemim .

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

5

Hiçbir etkinlik yoktur, ancak window.closedbu yazının yazıldığı tarih itibariyle tüm büyük tarayıcılarda desteklenen bir özellik vardır. Eğer gerçekten bilmek gerekiyorsa Böylece bu özelliği kontrol etmek için pencereyi anket olabilir.

if(myWindow.closed){do things}

Not: Herhangi bir şeyi sorgulamak genellikle en iyi çözüm değildir. window.onbeforeunloadMümkünse olay Sayfadan çıkarsanız sadece ikaz da patlar olmak kullanılmalıdır.


4
$(window).unload( function () { alert("Bye now!"); } );

9
Bu, Firefox veya Chrome'da çalışmaz. beforeunloadBir uyarı görüntülemek isteyip istemediğinizi deneyin . $(window).on('beforeunload', function(){ alert ('Bye now')});
Şunun

5
jQuery dokümanlarına göre "Çoğu tarayıcı uyarı (), onayla () ve komut istemi () çağrılarını yok sayar
katzmopolitan

4

Kullanmaya çalışın:

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;
});
});

3

Tüm tarayıcılarımda çalışan bir yol buldum .

Aşağıdaki sürümlerde test edilmiştir: Firefox 57, Internet Explorer 11, Edge 41, en son Chrome'dan biri (sürümümü göstermeyecek)

Not : sayfayı mümkün olan herhangi bir şekilde bırakırsanız onbeforeunload tetiklenir (yenile, tarayıcıyı kapat, yönlendirme, bağlantı, gönderme ..). Yalnızca tarayıcı kapatıldığında olmasını istiyorsanız, olay işleyicilerini bağlamanız yeterlidir.

  $(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
            }
        };

  });

Tarayıcı kapatmak için nasıl ayrı bir işleyici eklenir .. Bunun için ayrı bir olay olduğunu sanmıyorum.
blazehub

Bu çok yardımcı oldu. A çapasını sadece gerçek köprüler için ateşlenecek şekilde ayarlamam gerekiyordu. Aksi takdirde, önyükleme sekmelerini tıklattıktan sonra dağıttım: $ ("a [href! = '']"). Değil ('[href ^ = "#"]'). Bind ("klik", işlev ()
Ken Forslund

3

Henüz kimseden bahsetmediği için (8+ yıl sonra): WebSocket, kapalı bir sekmeyi tespit etmenin başka etkili bir yolu olabilir. Sekme açık ve ana bilgisayara işaret ettiği sürece, istemci ana bilgisayara etkin bir WebSocket bağlantısı kurabilir.

Dikkat: Bu çözümün yalnızca bir WebSocket zaten yaptığınız işten ek olarak önemli bir ek yük gerektirmediği takdirde bir proje için geçerli olduğunu lütfen unutmayın.

Makul bir zaman aşımı süresi içinde (örn. 2 dakika), sunucu tarafı WebSocket bağlantısı kesildikten sonra istemcinin gittiğini belirleyebilir ve yüklenen geçici dosyaları kaldırmak gibi herhangi bir eylemi gerçekleştirebilir. (Son derece özel kullanım durumumda hedefim, WebSocket bağlantısı kesildikten ve tüm CGI / FastCGI etkinliği sona erdikten üç saniye sonra bir localhost uygulama sunucusunu sonlandırmaktı - diğer canlı tutma bağlantıları beni etkilemez.)

Onunload olay işleyicisi ( bu cevap tarafından tavsiye edildiği gibi) ile düzgün çalışması için alma sorunları vardı . Sekmenin kapatılması, işaret ışığını tetiklemiş gibi görünmüyordu ve açık sekmeler, potansiyel olarak sorunlara neden olabilecek şekilde tetikledi. Bir WebSocket daha temiz bir şekilde karşılaştığım sorunu çözdü, çünkü bağlantı kabaca kapanırken kabaca kapanıyor ve uygulama içindeki sayfaları değiştirmek gecikme penceresinde yeni bir WebSocket bağlantısı açıyor.


2
sorun yok. Ancak, işlemek için herhangi bir kod veya prosedür paylaşamazsınız? O olmadan benim gibi bir çaylak anlayamıyorum
P Satish Patro

Aslında ilk yorumumda net değildim. Web soketi bilmiyorum. Yani, ben sadece nasıl ele görmek istedim
P Satish Patro

1
Yukarıdaki yorumumdaki bağlantı bazı örnek WebSocket JS koduna gidiyor. İstemci JS kısmı kolay kısımdır. Tüm uygulama sunucusunu zamanında sonlandırmam gerektiğinde bu kod benim çok özel kullanım durumum için. Nasıl bir WebSocket sunucusu yazmak size bağlıdır ve her şeyi bağlamak için sunucu tarafı yapılandırması gerektirir (birçok kişi Nginx ön ucuyla bir NodeJS arka ucunu tercih eder). TCP / IP özellikli bir sunucu yazmak, yorumlarda tartışmak için uygun olmayan karmaşık bir konudur ve yalnızca bu sorunu tespit etmek için bir tane ayarlamak aşırı bir iştir.
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 Bağlantısı

Merhabalar, tarayıcı yerel depolama ve zaman damgasını kullanarak 'Tarayıcı Algıla ve Sekme Kapat Olayı' tıklamalarını elde edebildim. Umarım hepiniz bu çözümü kullanarak sorunlarınızı çözeceksiniz.

İlk araştırmamdan sonra, bir tarayıcıyı kapattığımızda, tarayıcının tarayıcıyı tamamen kapatmak için tüm sekmeleri tek tek kapatacağını buldum. Bu nedenle, tırnakların kapatılması arasında çok az zaman gecikmesi olacağını gözlemledim. Bu yüzden bu zaman gecikmesini ana doğrulama noktam olarak aldım ve tarayıcı ve sekme kapat olayı tespitini başarabildim.

Chrome Tarayıcı Sürüm 76.0.3809.132'de test ettim ve çalıştığını buldum

:) Cevabımı yararlı bulduysan oy ver ....


Bu bana bir fikir verdi. Oturum açtıktan sonra ve yükleme öncesi olayda localstorage'da bir zaman damgası artı 10 saniye ayarlıyorum. Yüklemede zamanın geçip geçmediğini doğrularım, ardından giriş sayfasına yönlendiririm. Thanks :)
G4BB3R

1
window.onbeforeunload = function() {
  console.log('event');
  return false; //here also can be string, that will be shown to the user
}

2
here also can be string, that will be shown to the userAncak, firefox'ta,
kromda değil

Herhangi bir dönüş değeri (dize) yalnızca MSIE <= 11'de görüntülenir. Diğer tüm tarayıcılar için temelde işe yaramaz.
OSWorX

1

Bunun gibi 'boşaltma' olayında bir olay işleyicisinde kapatılan window.c yardımıyla kontrol edilebilir, ancak zaman aşımı kullanımı gereklidir (bu nedenle, eğer gecikme olursa veya pencerenin kapanmasını önlerse sonuç garanti edilemez):

JSFiddle örneği (Safari, FF, Chrome, Edge ve IE11 lates'te test edilmiştir)

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!';
  }
}

1

Yukarıdaki tüm çözümleri denedim, hiçbiri benim için gerçekten işe yaramadı, çünkü projemde açılır pencereler için 'Kapat' düğmesine sahip bazı Telerik bileşenleri olduğu için 'yüksüz' olayı çağırıyor. Ayrıca, sayfanızda Telerik ızgarası olduğunda düğme seçici düzgün çalışmıyor (yani ızgara içindeki düğmeler anlamına gelir) Yani, yukarıdaki önerilerin hiçbirini kullanamadım. Sonunda benim için çalışılan çözüm bu. _Layout.cshtml gövde etiketine bir onUnload olayı ekledim. Bunun gibi bir şey:

<body onUnload="LogOff()">

ve ardından Asp.Net MVC'de yerleşik bir yöntem olan Account / LogOff'a yönlendirmek için LogOff işlevini ekleyin. Şimdi, tarayıcıyı veya sekmeyi kapattığımda, LogOff yöntemine yönlendiriyor ve geri döndüğünde kullanıcının oturum açması gerekiyor. Hem Chrome hem de Firefox'ta test ettim. Ve çalışıyor!

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

                                        }
               });
       }

0
window.onbeforeunload = function ()
{       

    if (isProcess > 0) 
    {
        return true;       
    }   

    else
    { 
        //do something      
    }
}; 

Tarayıcıdaki herhangi bir işlem sırasında pencereyi kapatır veya sayfayı yenilerseniz bu işlev bir onay iletişim kutusu gösterir. Bu işlev tüm tarayıcılarda çalışır. Ajax işleminizde isProcess var ayarlamanız gerekir.


set isProcess için tam örnek?
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.
}); 

Aslında kullanıcı Sekmeyi kapatıp SADECE onay mesajını göstermek istedim. Bu benim için çalışıyor. Ama aynı zamanda daha sonra aynı sayfanın herhangi bir bağlantıyı onun gösteren onay tıklayarak am mı message.For moe bakın, bu bir sorunla karşı karşıya am: w3schools.com/code/tryit.asp?filename=FEK2KWUN9R8Z @Tunaki
Mohammed

1
nedir sendkeylog?
Kiquenet

0

@JAndy'nin belirttiği gibi, kapatılmakta olan bir pencereyi algılamak için uygun bir javascript kodu yoktur. @Syno'nun önerdiği şeyden başladım.

Böyle bir durumdan geçtim ve bu adımları izlemeniz koşuluyla, bunu tespit edebileceksiniz.
Chrome 67+ ve Firefox 61+ üzerinde test ettim.

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();
    }
};

};


1
Javascript kodunuzda bazı sorunlar var. Fark ettiğim ilk şey resize, pencere bulanık olduğunda sürekli olarak bağlanacağınız . 100x bulanıklaşırsa, tarayıcıyı yavaşlatan 100 dinleyiciniz olur.
Kyle

Bir $ (window) .off ('resize') koydum, bu yeterli olur mu?
Bruno Henrique

Teknik olarak, ancak jQuery aracılığıyla başka bir yere eklenen diğer işleyicileri de kaldıracaktır.
Kyle

-2

Bunu deneyin, bunun sizin için çalışacağından eminim.

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

-3

Bunu dene. Çalışacak. jquery unload yöntemi kullanımdan kaldırıldı.

window.onbeforeunload = function(event) {
    event.returnValue = "Write something clever here..";
};
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.