2012-05-14 6 views
36

Tôi có một vấn đề nhỏ khi hiểu các trình xử lý của XMLHttpRequest. The specification says this about the onerror handler:Khi nào cần xử lý sự cố onbound của XMLHttpRequest lửa

error [Đã gửi ...] Khi yêu cầu không thành công.

load [Đã gửi đi ...] Khi yêu cầu đã hoàn tất thành công.

Vấn đề là, "yêu cầu không thành công" có nghĩa là gì. Đó có thể là

  • yêu cầu không thể được ban hành ở tất cả (ví dụ. Kết nối từ chối và các lỗi như vậy), hoặc
  • ở trên cộng với máy chủ trả lại một mã lỗi (ví dụ. 404)

Ngoài ra, tôi muốn biết liệu điều đó có nghĩa là onerroronload sẽ không bao giờ được kích hoạt cùng một lúc hay không.

This reference chỉ xử lý onerror nên được thực hiện tùy thuộc vào status mã và onload tùy thuộc vào readyState. Điều đó cho thấy họ không loại trừ lẫn nhau, tuy nhiên, tôi không nghĩ đây là thông tin có thẩm quyền.

Tôi hỏi vì sử dụng ảnh chụp nhanh Opera mới nhất, tôi thấy onload được kích hoạt ngay cả trên mã trạng thái 404. Tôi biết thử nghiệm status là một sự chắc chắn đặt cược, nhưng tôi muốn biết cho dù đó là một cái gì đó tôi phải làm cho mỗi đặc điểm kỹ thuật hoặc chỉ là một workaround cho một lỗi trong Opera.

+4

Tôi lấy 'đã hoàn tất thành công' có nghĩa là bạn nhận được mã trạng thái, cho dù đó là 200 OK hoặc mã lỗi như 404. Chrome cũng kích hoạt ngay cả khi mã trạng thái là mã trạng thái lỗi. – Snuffleupagus

+1

onerror và onload không bao giờ kích hoạt cùng một lúc. Nó là cái này hay cái kia. Tuy nhiên onloadend cháy trong cả hai trường hợp và là sự kiện cuối cùng trong hàng. – jayarjo

Trả lời

57

Như đã đề cập trong nhận xét, onerror kích hoạt khi có sự cố trên mức mạng . Nếu lỗi chỉ tồn tại ở cấp ứng dụng, ví dụ: mã lỗi HTTP được gửi, sau đó onload vẫn đang kích hoạt. Bạn cần kiểm tra mã trạng thái trả về một cách rõ ràng trong trình xử lý onreadystatechange của mình.

Lưu ý rằng yêu cầu miền chéo bị từ chối cũng sẽ kích hoạt trình xử lý onerror.

+0

Hmm, lạ. Bạn có thể (hoặc bất kỳ ai) giải thích rằng hành vi của máy chủ google không? – jpalecek

+0

Tôi đã kiểm tra hoàn chỉnh hơn và phát hiện ra rằng encrypted.google.com không gửi 404 cho yêu cầu đó - thành viên 'status' của yêu cầu XHR thực sự là' 0', nơi các máy chủ khác gửi 404.Rõ ràng là máy chủ đột nhiên giả vờ rằng nó không tồn tại ở tất cả khi nó thấy một yêu cầu cho một trang không tồn tại. Lạ lùng, nhưng đó là quyết định của Google. – apsillers

+6

Hoặc ... có thể là do nhấn vào 'https: // encrypted.google.com/foobar' chuyển hướng đến 'http: // www.google.com/foobar' và trình duyệt từ chối tham gia chéo chuyển hướng tên miền trong một yêu cầu Ajax. – apsillers

1

Ngoài câu trả lời của apsillers, lưu ý rằng XMLHttpRequest xử lý chuyển hướng tự động trong nền, vì vậy bạn không phải kiểm tra mã trả lời này trong sự kiện onload (sự kiện này sẽ chỉ được gọi một lần)). Cũng lưu ý, trong trường hợp bạn gửi dữ liệu tải trọng bằng phương thức POST và nếu các yêu cầu được chuyển hướng, XMLHttpRequest thay đổi phương thức từ POST thành GET và loại bỏ bất kỳ dữ liệu tải trọng nào vì lý do bảo mật. Sự kiện onload sẽ vẫn được gọi nhưng bạn sẽ cần phải gửi lại yêu cầu của mình theo cách thủ công đến đích mới.