2013-10-09 13 views
5

W mojej aplikacji istnieje obiekt, który musi być ajaxed z powrotem do serwera, zanim użytkownik przełączy się na inną stronę lub zamyka swoją przeglądarkę.Wykonywanie wywołania ajax na window.unload

W tej chwili używam coś takiego:

$(window).on('unload', function() { 
    $.ajax(....);  
}); 

Czy są tam sytuacje, w których to nie będzie działać, a gdzie sytuacja tego potrzebuje być traktowane inaczej ogień wywołanie ajax we wszystkich przeglądarkach lub? Nie muszę zajmować się czymkolwiek, jeśli chodzi o funkcję sukcesu, martwię się tylko o informacje, które trafiają na serwer.

Dzięki.

+1

Nie można polegać na zdarzeniu "rozładuj", zanim strona zniknie. Będzie to robione przez przeglądarkę w * normalnych * okolicznościach, ale nie wtedy, gdy przeglądarka nie może nic z tym zrobić (na przykład nagłe zamknięcie systemu). – Pointy

+0

Nie można polegać na niczym przy tym logi ... * ciągnie cięciwę mocy * –

Odpowiedz

3

Jeśli używasz jQuery, możesz ustawić asynchronizację na false w wywołaniu ajax. Może to zadziałać, ale Twoje wyniki mogą się różnić w zależności od przeglądarki. Oto przykład jsFiddle. http://jsfiddle.net/jtaylor/wRkZr/4/

// Note: I came across a couple articles saying we may should to use window.onbeforeunload instead of or in addition to jQuery's unload. Keep an eye on this. 
//  http://vidasp.net/jQuery-unload.html 
//  https://stackoverflow.com/questions/1802930/setting-onbeforeunload-on-body-element-in-chrome-and-ie-using-jquery 

var doAjaxBeforeUnloadEnabled = true; // We hook into window.onbeforeunload and bind some jQuery events to confirmBeforeUnload. This variable is used to prevent us from showing both messages during a single event. 


var doAjaxBeforeUnload = function (evt) { 
    if (!doAjaxBeforeUnloadEnabled) { 
     return; 
    } 
    doAjaxBeforeUnloadEnabled = false; 
    jQuery.ajax({ 
     url: "/", 
     success: function (a) { 
      console.debug("Ajax call finished"); 
     }, 
     async: false /* Not recommended. This is the dangerous part. Your mileage may vary. */ 
    }); 
} 

$(document).ready(function() { 
    window.onbeforeunload = doAjaxBeforeUnload; 
    $(window).unload(doAjaxBeforeUnload); 
}); 

W Google Chrome, wywołanie ajax zawsze kończy zanim opuścisz strony.

Jednak BARDZO NIE POLECAM, idąc tą trasą. "A" w ajax jest dla "asynchronicznego", a jeśli spróbujesz zmusić do działania jak połączenie synchroniczne, prosisz o kłopoty. Ten problem zwykle manifestuje się jako zamrożenie przeglądarki - co może się zdarzyć, jeśli wywołanie ajaxa zajęło dużo czasu.

Jeśli jest to możliwe, rozważ monitowanie użytkownika przed przejściem od strony, jeśli strona zawiera dane, które należy opublikować za pośrednictwem ajax. Dla przykładu, patrz na to pytanie: jquery prompt to save data onbeforeunload

1

Nie, niestety, twoje połączenie Ajax nie zostanie zakończone, ponieważ dokument zostanie rozładowany podczas połączenia asynchronicznego. Nie można zrobić wielu rzeczy, gdy użytkownik zamyka okno.

0

Musisz użyć zdarzenia onbeforeunload i wykonać synchroniczne wywołanie AJAX.

$.ajax({ 
    ... 
    "url": "http://www.example.com", 
    "async": false, 
    ... 
}); 
0

Zamiast robić wywołanie ajax synchronizacji (niezalecane na najnowszych przeglądarek i może się wyjątek), można otworzyć okienko:

$(window).on('unload', function() { 
    window.open("myscript.php"); 
}); 

można dodać oczywiście parametry do link i możesz automatycznie zamknąć popup, jeśli chcesz. Blokowanie wyskakujących okienek musi być wyłączone dla Twojej domeny w opcjach przeglądarki.

Powiązane problemy