2011-09-21 19 views
6

Używam szkieletu Prototype JS do wykonywania wywołań Ajax. Tu jest mój kodu:Wywołanie Ajax zostaje anulowane przez przeglądarkę

new Ajax.Request('/myurl.php', {method: 'post', postBody: 'id='+id+'&v='+foo, onSuccess: success, onFailure: failed}); 

function success(ret) { 
console.log("success",ret.readyState, ret.status); 
} 
function failed(ret) { 
console.log("failed",ret.readyState, ret.status); 
} 

Przez większość czasu, to działa prawidłowo, a funkcja sukces jest nazywany kodem statusu 200. około 5% czasu na Safari funkcja sukces jest nazywany kodem statusu 0. W tym przypadku, gdy patrzę na zakładkę Network inspektora sieci, wywołanie ajax jest wyświetlane ze statusem "anulowane". Mogę potwierdzić dziennikami serwera, że ​​żądanie nigdy nie trafiło na serwer. To tak, jakby żądanie ajax zostało natychmiast anulowane, nawet nie próbując połączyć się z serwerem. Nie znalazłem żadnego wiarygodnego sposobu na odtworzenie tego, wydaje się być przypadkowe. Robię to 20 razy i zdarza się to raz.

Czy ktoś wie, co spowodowałoby anulowanie wywołania ajax lub zwrócenie kodu statusu 0?

+0

Którą wersję prototypejs używasz? – jonycheung

Odpowiedz

1

Przyczyna może być być kombinacją serwera http i przeglądarki, której używasz. To nie wygląda na błąd biblioteki PrototypeJS.

Wiele źródeł stwierdza, że ​​parametr utrzymywania aktywności połączenia HTTP wydaje się być uszkodzony w Safari (patrz here, here lub here). W Apache zalecają dodanie tego do konfiguracji:

BrowserMatch "Safari" nokeepalive 

(Proszę sprawdzić odpowiednią składnię w dokumentacji serwera).

Jeśli Safari obsługuje złe połączenia HTTP z serwerem, może wyjaśnić, czego doświadczasz.

Jeśli nie jest to dla ciebie zbyt skomplikowane, spróbuję innego serwera HTTP, na każdym systemie jest wiele dostępnych.

Brakuje nam trochę informacji, aby w pełni odpowiedzieć na twoją odpowiedź. Problem z serwerem jest wiodący, ale mogą istnieć inne. Byłoby miło wiedzieć, czy robi to samo w innych przeglądarkach (Firefox z Firebug będzie wyświetlał tego rodzaju informacje, Chrome, Opera i IE mają wbudowane skrzynki narzędziowe do programowania). Kolejnym ważnym pytaniem jest, jak często wykonujesz to żądanie AJAX na sekundę (jeśli dotyczy).

0

Wiem, że to stary temat, ale chciałem udostępnić rozwiązanie dla Safari, które może zaoszczędzić innym czas. Poniższy wiersz naprawdę rozwiązać wszystkie problemy:

BrowserMatch "^(?=.*Safari)(?=.*Macintosh)(?!.*Chrom).*" nokeepalive gzip-only-text/html 

regex pilnuje jest wykrywany tylko Safari na Mac i nie Mobile Safari i Chrome (ium) i takie. Przeglądarka Safari dla systemu Windows również nie jest zgodna, ale problem z utrzymaniem wydaje się być kombinacją Mac-Safari. Ponadto, niektóre wersje Safari nie obsługują dobrze spakowanych plików css/js.

Wszystkie nasze symptomy awarii witryny lub CSS, które nie zostały całkowicie załadowane w różnych wersjach Safari, które spowodowały, że prawie wyciągnąłem włosy (Safari naprawdę jest nowym IE) zostały rozwiązane dla nas dzięki temu "hackowi konfiguracyjnemu Apache" .

Powiązane problemy