2013-02-18 16 views
8

So supposedly starting at Firefox > 4, wiążąc obiekt okna jQuery z beforeunload nie działa.Wyślij AJAX do serwera beforeunload

Chciałbym wysłać zgłoszenie AJAX, aby usunąć dane memcache mojego serwera.

Kiedy odświeżam jedyną otwartą zakładkę, widzę, że zdarzenie beforeunload jest wywoływane zarówno w firefox, jak i chrome z następującym kodem, o czym świadczy komunikat console.log "firefox/NON-firefox delete". Problem polega na tym, że nigdy nie widzę komunikatu console.log "memcache delete" wskazującego, że mój serwer nigdy nie widział żądania $.ajax.

Zdaję sobie sprawę, że przeglądanie wąchania przeglądarki jest złe i nie ma różnicy między zawartością instrukcji if i else. Po prostu pokazuję kod tego, co próbowałem bezskutecznie w Firefoksie.

Ktoś ma jakieś pomysły?

$(window).bind('beforeunload', function(){ 
    if(/Firefox[\/\s](\d+)/.test(navigator.userAgent) && new Number(RegExp.$1) >= 4) { 
    console.log('firefox delete'); 
    memcacheDelete(); 
    return null; 
    } 
    else { 
    console.log('NON-firefox delete'); 
    memcacheDelete(); 
    return null; 
    } 
}); 

function memcacheDelete() { 
    $.ajax({ 
     url: "/memcache/delete", 
     type: "post", 
     data:{}, 
     success:function(){ 
      console.log('memcache deleted'); 
     }//success 
    }); //ajax 
} 

Odpowiedz

11

Ajax jest asynchroniczne.

Podczas odświeżania (lub zamykania) przeglądarki jest wywoływana beforeunload. Oznacza to, że gdy tylko zostanie zakończone wykonanie beforeunload, strona zostanie odświeżona (lub zamknięta).

Po wykonaniu żądania ajax (ponieważ jego asynchroniczny) interpreter javascript nie czeka na zdarzenie ajax success, które ma zostać wykonane i przechodzi w dół, kończąc wykonanie beforeunload.

success ajax powinien zostać wywołany po kilku sekundach, ale nie widzisz go jako strony odświeżonej/zamkniętej.

Notatka:

.success() metoda jest przestarzała i zostanie zastąpiona metodą .done()

Reference

+0

tak ... droga rozumiem asynchroniczny nazywa to, co myślę ... + 1 – cliffbarnes

+1

@Jashwant, dzięki za explanation.Though Mam dowody na to, że usuwanie memcache powiodło się podczas używania Chrome po zamknięciu/ponownym otwarciu przeglądarki, ale nadal ** nie ** kasuje z firefox. Wydaje się, że coś tu się dzieje. Konwertowanie '$ .ajax' na synchroniczne,' async: false', help? –

+4

Wygląda na to, że zmiana [opcji '$ .ajax' opcji' async' na 'false'] (http://api.jquery.com/jQuery.ajax/#jQuery-ajax-settings) koryguje problem. Czy istnieje jakiś powód, dla którego ktoś by tego nie chciał? –

7

Właśnie przez wzgląd zakończenia, oto co zrobiłem, dzięki @Jashwant dla wskazówek: Zauważyłem, że this other SO Q&A suggested the same solution. klucz jestasync:true(false) w zaproszeniu $.ajax poniżej:

$(window).bind('beforeunload', function(){ 
    if(/Firefox[\/\s](\d+)/.test(navigator.userAgent) && new Number(RegExp.$1) >= 4) { 
    console.log('firefox delete'); 
    var data={async:false}; 
    memcacheDelete(data); 
    return null; 
    } 
    else { 
    console.log('NON-firefox delete'); 
    var data={async:true}; 
    memcacheDelete(data); 
    return null; 
    } 
}); 

function memcacheDelete(data) { 
    $.ajax({ 
    url: "/memcache/delete", 
    type: "post", 
    data:{}, 
    async:data.async, 
    success:function(){ 
     console.log('memcache deleted'); 
    }//success 
    }); //ajax 
} 
+1

Tylko po to, aby zaspokoić moją ciekawość. Jakie jest znaczenie (użycie) '&& new Number (RegExp. $ 1)> = 4' w swojej rutynie wykrywającej Firefoksa (jeśli)? Tylko pewność, że Firefox jest w wersji 4 lub nowszej? – trejder

+0

Tak, zakładam, że tak –

Powiązane problemy