2012-02-10 19 views
30

Czy istnieje sposób radzenia sobie z błędem z żądania ajax w JQuery, tak, że gdy użytkownik nawiguje z dala od strony, wynikowy błąd jest ignorowany?Jak radzić sobie z błędem postu jQuery ajax podczas nawigacji z dala od strony

$(document).ready(function() { 
$.ajax({ 
    url:'/server/url/', 
    type: 'POST', 
    data: {some..data}, 
    success:function(response) { do stuff with response }, 
    error: function(xhr, textStatus, errorThrown) { 
      // Don't raise this alert if user has navigated away from the page 
      alert('error'); 
    } 
}); 

Jestem ciekawy, czy ktoś wie o tym w czysty sposób? Wiem, że możesz stworzyć pewną logikę w metodzie $(window).bind("beforeunload", function(){}), ale wolałbym, jeśli byłby sposób poradzenia sobie z sytuacją bez robienia tego, ponieważ Chrome wydaje się nie obsługiwać tego. Czy jest na przykład konkretny błąd, który jest zwracany w tym przypadku?

Dzięki.

+0

Ponieważ połączenie jest z serwerem, nie sądzę, że byłoby wystarczająco dużo wiedzy, aby zwrócić odpowiedź w różny sposób w zależności od tego, czy użytkownik nawigował poza tą stroną, czy nie. Czy jest jakiś przykład tego zachowania? Wydaje się dziwne, że skrypt z innej strony będzie nadal działał po przejściu poza tę stronę. –

+0

I * think * skrypt faktycznie przestaje działać i pojawia się błąd, ponieważ został on przedwcześnie zakończony. –

+0

Gdy odejdziesz, twoje wywołanie AJAX przechodzi w bit-bucket. Na kliencie nie ma już programu nasłuchującego, który otrzyma wiadomość z tego żądania. –

Odpowiedz

16

Wygląda na to, że odpowiedź na to jest zbadanie jqXHR.status. XMLHttpRequest spec przedstawia kroki, aby ustawić status:

The status attribute must return the result of running these steps:

  1. If the state is UNSENT or OPENED, return 0 and terminate these steps.

  2. If the error flag is set, return 0 and terminate these steps.

  3. Return the HTTP status code.1

UWAGA także: Flaga błędu wskazuje jakiś rodzaj błędu sieci lub żądanie aborcji. Jest on początkowo nieustawiony i jest używany w stanie DONE.

Z tego co rozumiem zatem to sprawdzić kod powinien rozwiązać ten problem:

if (xhr.status == 0) 
     alert('error'); 

https://web.archive.org/web/20120204040047/http://www.w3.org/TR/XMLHttpRequest/#the-status-attribute

+0

Dokładnie odpowiedź, której szukałem. Wiązanie nowych wydarzeń jest nadprzemysłowe. – eighteyes

+5

Czy istnieje sposób na rozróżnienie między przypadkiem, gdy ktoś nawiguje z dala od strony, a innymi problemami z siecią (limit czasu, host nie został znaleziony itp.)? –

+1

[To] (https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/Synchronous_and_Asynchronous_Requests) artykuł mówi, że _do czasu powrotu odpowiedzi, strona została wyładowana, a funkcja oddzwonienia wygrała ' t już istnieje_, więc w jaki sposób funkcja callback błędu działa niezawodnie? – winterlight

2

Musiałem poradzić sobie z tym problemem zbyt często.

Zalecam powiązanie ze zdarzeniem $(window).unload, ustawienie gdzieś zmiennej, na przykład w przestrzeni nazw (App.unloading = true), a następnie przetestowanie jej w wywołaniach błędów błędu ajax.

Zobacz http://api.jquery.com/unload/

+0

Wygląda na to, że nie działa we wszystkich przeglądarkach: http: //code.google.com/p/chromium/issues/detail? id = 4422 –

+2

Zobacz http: // stackoverflow .com/questions/1370322/jquery-ajax-fires-error-callback-on-window-unload dla alternatywnych podejść. Być może połączenie zdarzenia rozładowania i flagi z sprawdzaniem statusu może okazać się wystarczające. – ori

11

Sprawdzanie stanu nie działa dla mnie, ale

// Ignore incomplete requests, likely due to navigating away from the page 
if (jqXHR.readyState < 4) { 
    return true; 
} 

w obsłudze błędu (4 było ZROBIONE).

+1

Zgadzam się z tym. readyState to właściwa droga. – Sebastien

+0

Jeśli proces serwera istnieje, wartość jqXHR.readyState będzie wynosić 0. To powinno w rzeczywistości przejść do obsługi błędów, ponieważ nie jest tak, że użytkownik nawiguje. – Lorenz03Tx

+0

Nie mogę się zgodzić. Używam bieżącego FireFox i jQuery v2.0.0. Kiedy podążam za odnośnikiem podczas żądania ajax, żądanie ajax kończy się na jqXHR.readyState = 4 i jqXHR.status = 404. – Simon

Powiązane problemy