2010-11-25 16 views
24

Próbuję uzyskać dostęp do zdarzenia 404, które widzę wracając jako 404 z firebugem, ale funkcja błędu nie kopie, Z moim poniższym kodem zawsze pojawia się błąd: sukces?jQuery Ajax 404 Operowanie

tj.

$.ajax({ 
    type: 'get', 
    url: 'url: 'https://admin.instantservice.com/resources/smartbutton/5702/10945/available.gif?' + Math.floor(Math.random()*10001), 
    success: function(data, textStatus, XMLHttpRequest){ 
     console.log('Error: ' + textStatus); 
    }, 
    error:function (xhr, ajaxOptions, thrownError){ 
     alert(xhr.status); 
     alert(xhr.statusText); 
     alert(xhr.responseText); 
    } 
}); 

Jeszcze raz wiem, że 1000%, że otrzymuję 404 nie znaleziono w firebug nigdy nie powoduje błędu.

Czy brakuje mi czegoś?

+0

Przetestowałem, że dokładnie tego samego kodu i otrzymałem 3 ostrzeżenia o błędach poprawnie (najpierw "404") .. – cambraca

+0

Czy jesteś pewien, że otrzymujesz odpowiedź z kodem statusu 404, a nie zwykłą odpowiedzią z kodem statusu 200 i stroną zawierającą tekst, który mówi, że to 404? – Guffa

+0

@cambraca To samo tutaj. Testowane w Firefoksie 3.6.12 i Firebug. – aefxx

Odpowiedz

24

Żądania dotyczące strony krzyżowej, JSONP, nie będą powodować wywoływania błędów. Po prostu miał ten sam problem sobie: http://forum.jquery.com/topic/jquery-ajax-with-datatype-jsonp-will-not-use-error-callback-if-request-fails

+0

Zrobiłem to, ale TY. – Lee

+2

A co z prośbą inną niż jsonp, która nie została zidentyfikowana w pytaniu? –

+1

Należy pamiętać, że po określeniu limitu czasu (w milisekundach) zostanie wywołany błąd. –

13

Co możesz zrobić, to użyć funkcji $ .ajaxError, tak jak

$("#message").ajaxError(function(event, request, settings){ 
     $(this).show(); 
     $(this).append("<li>Error requesting page " + settings.url + "</li>"); 
    }); 
+3

Nie wiem, dlaczego to nie ma więcej upvotes, działa idealnie, zobacz: http://api.jquery.com/ajaxError/ – systematical

+0

Dzięki @systematical - nie jestem pewien, działa doskonale dla mnie, mam go w zestawie dla wszystkich moje strony. –

+7

Przyczyną, dla której nie było to pomocne, było to, że nadal nie jest wywoływany w przypadku JSONP. From http://api.jquery.com/ajaxError/: "Uwaga: Ten moduł obsługi nie jest wymagany w przypadku skryptów między domenami i żądań JSONP między domenami." – iX3

1

miałem bardzo podobny wynik/problemu. Najważniejsze jest to, że nie udało mi się upewnić się, że mój adres URL nie zawierał takich samych nazw parametrów w sekcji danych funkcji ajax.


Powodem dla mnie było to, że wygenerowany adres URL z kodu php, aby uzyskać url

pines_url('com_referral', 'sendhttprequest') 

które wysyła sygnał do adresu URL z parametrem

option=com_referral 

i parametr

action=sendhttprequest 

My BIG Problem polegał na tym, że próbowałem również wysłać "czynność" paramu w sekcji danych funkcji AJAX.

data: {"action": "getpoints"} 

Więc druga akcja została ona nadrzędne „getpoints” nie istnieje, ale trudne jest to, że Firebug nie będzie oczywiście powiedzieć mi link z getpoints, to powiedz mi adres URL jako sendhttprequest.

Mam nadzieję, że to nie było mylące, ale mam też nadzieję, że pomoże to komuś z podobnym problemem!

1

Dodanie wartości limitu czasu spowoduje uruchomienie wywołania zwrotnego błędu w przypadku braku odpowiedzi w określonym czasie. Jeśli wywołanie zwrotne wynosi 5000, jeśli żądanie jsonp nie odpowie w ciągu 5 sekund (to jest 404), uruchomi się wywołanie zwrotne błędu.

$.ajax({ 
    type: 'get', 
    timeout: 5000, 
    url: 'url: 'https://admin.instantservice.com/resources/smartbutton/5702/10945/available.gif?' + Math.floor(Math.random()*10001), 
    success: function(data, textStatus, XMLHttpRequest){ 
     console.log('Error: ' + textStatus); 
    }, 
    error:function (xhr, ajaxOptions, thrownError){ 
     alert(xhr.status); 
     alert(xhr.statusText); 
     alert(xhr.responseText); 
    } 
}); 
+0

Zakłada się, że 404 zajmuje co najmniej 5 sekund, aby zostać obsłużonym? – ficuscr

+0

Tak, 5 sekund to dość agresywna wartość domyślna. Jeśli łączysz się z wolnym serwerem, możesz przejść do 30 sekund, ale ze szkodą dla wygody użytkownika. – uberweb

+0

Nie działa. Błąd nigdy nie zostanie wywołany. – AndroidDev

0

Nie wiem dokładnie dlaczego, ale jeśli używasz łańcuchowy .fail metodę, błąd jest poprawnie zrobione, nawet jeśli jest to inna strona:

$.ajax({ 
    type: 'get', 
    url: 'http://example.com', 
    success: function(data, textStatus, XMLHttpRequest){ 
     console.log('Error: ' + textStatus); 
     } 
    }).fail(function (xhr, ajaxOptions, thrownError) { 
     alert(xhr.status); 
     alert(xhr.statusText); 
     alert(xhr.responseText); 
    });