2011-09-21 129 views
6

Tôi đang sử dụng khung công tác Prototype JS để thực hiện các cuộc gọi Ajax. Đây là mã của tôi:Cuộc gọi Ajax bị hủy bởi trình duyệt

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); 
} 

Hầu hết thời gian, điều này hoạt động tốt và các chức năng thành công được gọi với một mã trạng thái của 200. Khoảng 5% thời gian trên Safari chức năng thành công được gọi với một mã trạng thái 0. Trong trường hợp này, khi tôi nhìn vào tab Mạng của thanh tra web, cuộc gọi ajax được liệt kê với trạng thái "đã hủy". Tôi có thể xác nhận với nhật ký máy chủ, rằng yêu cầu không bao giờ nhấn vào máy chủ. Như thể yêu cầu ajax đã bị hủy ngay lập tức mà không cần kết nối với máy chủ. Tôi đã không tìm thấy bất kỳ cách đáng tin cậy để tái sản xuất này, nó có vẻ là ngẫu nhiên. Tôi làm điều đó 20 lần và nó xảy ra một lần.

Có ai biết điều gì sẽ khiến cuộc gọi ajax bị hủy hoặc trả lại mã trạng thái là 0 không?

+0

Bạn đang sử dụng phiên bản prototypej nào? – jonycheung

Trả lời

1

Nguyên nhân có thể là kết hợp của máy chủ http và trình duyệt bạn đang sử dụng. Nó không có vẻ giống như một lỗi của thư viện PrototypeJS.

Nhiều nguồn cho biết thông số giữ lại của kết nối HTTP có vẻ bị hỏng trong Safari (xem here, here hoặc here). Trên Apache, họ khuyên bạn nên thêm cấu hình này vào cấu hình:

BrowserMatch "Safari" nokeepalive 

(Vui lòng kiểm tra cú pháp thích hợp trong tài liệu máy chủ của bạn).

Nếu Safari xử lý các kết nối HTTP liên tục kém với máy chủ của bạn, nó có thể giải thích những gì bạn gặp phải.

Nếu nó không quá phức tạp đối với bạn, tôi sẽ thử một máy chủ HTTP khác, có sẵn rất nhiều trên mọi hệ điều hành.

Chúng tôi thiếu một chút thông tin để trả lời đầy đủ câu trả lời của bạn. Vấn đề máy chủ là một dẫn, nhưng có thể có những người khác. Nó sẽ được tốt đẹp để biết nếu nó làm điều tương tự trong các trình duyệt khác (Firefox với Firebug sẽ hiển thị loại thông tin, Chrome, Opera và IE đã phát triển các hộp công cụ xây dựng). Một câu hỏi hợp lệ khác là mức độ thường xuyên bạn thực hiện yêu cầu AJAX này mỗi giây (nếu có).

0

Tôi biết đây là chủ đề cũ nhưng tôi muốn chia sẻ giải pháp cho Safari có thể tiết kiệm cho người khác một thời gian. Dòng sau thực sự giải quyết tất cả các sự cố:

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

Regex đảm bảo chỉ phát hiện Safari trên máy Mac chứ không phải Safari trên thiết bị di động và Chrome. Safari cho Windows cũng không phù hợp, nhưng vấn đề keepalive có vẻ là một sự kết hợp Mac-Safari. Ngoài ra, một số phiên bản Safari không xử lý tốt gss/css/js.

Tất cả các triệu chứng của trang web của chúng tôi bị lỗi hoặc CSS không hoàn thành tải trong các phiên bản Safari khác nhau khiến tôi gần như kéo tóc ra (Safari thực sự là IE mới) đã được giải quyết cho chúng tôi. .

Các vấn đề liên quan