2012-02-10 37 views
30

Có cách nào xử lý lỗi từ yêu cầu ajax trong JQuery sao cho khi người dùng điều hướng khỏi trang, lỗi kết quả bị bỏ qua không?Cách xử lý lỗi bài đăng jQuery ajax khi điều hướng khỏi trang

$(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'); 
    } 
}); 

Tôi tò mò nếu có ai biết cách sạch sẽ để xử lý việc này? Tôi biết bạn có thể tạo ra một số logic trong một phương pháp $(window).bind("beforeunload", function(){}) nhưng tôi muốn nếu có một cách để xử lý tình hình mà không làm điều này kể từ khi Chrome dường như không còn hỗ trợ nó. Có ví dụ như một lỗi cụ thể được trả lại trong trường hợp này?

Cảm ơn.

+0

Vì cuộc gọi đến máy chủ, tôi không nghĩ rằng nó sẽ có đủ kiến ​​thức để trả về một phản hồi khác nhau tùy thuộc vào việc người dùng có điều hướng khỏi trang đó hay không. Có nơi nào bạn có thể cung cấp một ví dụ về hành vi này không? Có vẻ kỳ quặc rằng một tập lệnh từ một trang khác sẽ tiếp tục chạy sau khi bạn đã điều hướng khỏi trang đó. –

+0

Tôi * nghĩ * tập lệnh thực sự ngừng chạy và lỗi được ném vì nó bị chấm dứt sớm. –

+0

Khi bạn điều hướng đi, cuộc gọi AJAX của bạn sẽ hoạt động trong nhóm bit. Không còn người nghe trên máy khách nhận bất kỳ tin nhắn nào từ yêu cầu đó nữa. –

Trả lời

16

Dường như câu trả lời cho điều này là để kiểm tra jqXHR.status. Các XMLHttpRequest spec phác thảo các bước sau để thiết lập trạng thái:

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

Chú ý thêm: Lá cờ báo lỗi chỉ ra một số loại lỗi mạng hoặc yêu cầu phá thai. Ban đầu nó không được đặt và được sử dụng trong trạng thái DONE.

Từ những gì tôi do đó hiểu, kiểm tra mã này nên khắc phục vấn đề:

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

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

+0

Chính xác là câu trả lời tôi đang tìm kiếm. Ràng buộc các sự kiện mới là quá kỹ thuật. – eighteyes

+5

Có cách nào khác biệt giữa trường hợp khi ai đó điều hướng khỏi trang và các sự cố mạng khác (thời gian chờ, máy chủ không tìm thấy, v.v ...) không? –

+1

[This] (https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/Synchronous_and_Asynchronous_Requests) bài viết nói rằng _by thời gian phản hồi trở lại, trang đã được tải xuống và chức năng gọi lại đã thắng ' t tồn tại nữa, do đó, làm thế nào để gọi lại lỗi thậm chí đáng tin cậy làm việc? – winterlight

2

Tôi đã phải xử lý vấn đề này quá một vài lần.

Tôi khuyên bạn nên ràng buộc với sự kiện $(window).unload, đặt một số biến ở đâu đó, chẳng hạn như trong không gian tên của bạn (App.unloading = true) và sau đó kiểm tra nó trong callback lỗi ajax.

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

+0

Điều này có vẻ không hoạt động đối với tất cả các trình duyệt: http: //code.google.com/p/chromium/issues/detail? id = 4422 –

+2

Xem http: // stackoverflow .com/questions/1370322/jquery-ajax-fire-error-callback-on-window-unload cho các phương pháp thay thế. Có thể kết hợp sự kiện dỡ bỏ & cờ với kiểm tra trạng thái có thể chứng minh là đủ. – ori

11

Kiểm tra tình trạng không làm việc cho tôi, nhưng

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

trong trình xử lý lỗi đã làm (4 là XONG).

+1

Tôi đồng ý với điều này. readyState là đúng cách để đi. – Sebastien

+0

Nếu quá trình máy chủ tồn tại, giá trị jqXHR.readyState sẽ bằng 0. Điều này thực tế nên chuyển sang xử lý lỗi vì không phải trường hợp người dùng đang điều hướng. – Lorenz03Tx

+0

Tôi không thể đồng ý. Tôi đang sử dụng FireFox và jQuery v2.0.0 hiện tại. Khi tôi theo một liên kết trong một yêu cầu ajax, sau đó yêu cầu ajax kết thúc bằng jqXHR.readyState = 4 và jqXHR.status = 404. – Simon

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