2013-10-09 26 views
5

Trong ứng dụng của tôi, có một đối tượng cần được trả lại cho máy chủ trước khi người dùng chuyển sang trang khác hoặc đóng trình duyệt của mình.thực hiện cuộc gọi ajax trên window.unload

Đối với thời điểm hiện tại, tôi đang sử dụng một cái gì đó như thế này:

$(window).on('unload', function() { 
    $.ajax(....);  
}); 

lửa gọi ajax trong tất cả các trình duyệt hoặc sẽ là có những tình huống mà điều này sẽ không làm việc và nơi tình trạng này cần phải được xử lý khác nhau? Tôi không cần phải đối phó với bất cứ điều gì về chức năng thành công, tôi chỉ quan tâm đến thông tin đưa nó vào máy chủ.

Cảm ơn.

+1

Bạn không thể dựa vào sự kiện "dỡ hàng" được tạo trước khi trang biến mất. Nó sẽ được thực hiện bởi trình duyệt trong trường hợp * bình thường *, nhưng không phải khi trình duyệt không thể làm bất cứ điều gì về nó (ví dụ như tắt hệ thống đột ngột). – Pointy

+0

Bạn không thể dựa vào bất cứ điều gì bởi logi đó ... * kéo dây điện * –

Trả lời

3

Nếu bạn đang sử dụng jQuery, bạn có thể đặt async thành false trong cuộc gọi ajax. Và nó có thể hoạt động, nhưng kết quả của bạn có thể khác nhau tùy theo trình duyệt. Đây là một ví dụ jsFiddle. http://jsfiddle.net/jtaylor/wRkZr/4/

// Note: I came across a couple articles saying we may should to use window.onbeforeunload instead of or in addition to jQuery's unload. Keep an eye on this. 
//  http://vidasp.net/jQuery-unload.html 
//  https://stackoverflow.com/questions/1802930/setting-onbeforeunload-on-body-element-in-chrome-and-ie-using-jquery 

var doAjaxBeforeUnloadEnabled = true; // We hook into window.onbeforeunload and bind some jQuery events to confirmBeforeUnload. This variable is used to prevent us from showing both messages during a single event. 


var doAjaxBeforeUnload = function (evt) { 
    if (!doAjaxBeforeUnloadEnabled) { 
     return; 
    } 
    doAjaxBeforeUnloadEnabled = false; 
    jQuery.ajax({ 
     url: "/", 
     success: function (a) { 
      console.debug("Ajax call finished"); 
     }, 
     async: false /* Not recommended. This is the dangerous part. Your mileage may vary. */ 
    }); 
} 

$(document).ready(function() { 
    window.onbeforeunload = doAjaxBeforeUnload; 
    $(window).unload(doAjaxBeforeUnload); 
}); 

Trong Google Chrome, cuộc gọi ajax luôn hoàn tất trước khi tôi điều hướng khỏi trang.

Tuy nhiên, tôi rất PHẢI KHÔNG BẮT ĐẦU đi tuyến đường đó. "A" trong ajax là "không đồng bộ" và nếu bạn cố gắng thực hiện như một cuộc gọi đồng bộ, bạn đang yêu cầu sự cố. Rắc rối đó thường biểu hiện khi đóng băng trình duyệt - điều này có thể xảy ra nếu cuộc gọi ajax mất một thời gian dài.

Nếu có thể, hãy xem xét nhắc người dùng trước khi điều hướng khỏi trang nếu trang có dữ liệu cần được đăng qua ajax. Đối với một ví dụ, xem câu hỏi này: jquery prompt to save data onbeforeunload

1

Không, không hài lòng khi cuộc gọi Ajax của bạn sẽ không được hoàn thành vì tài liệu sẽ bị hủy trong khi gọi async. Bạn không thể làm nhiều việc khi người dùng đóng cửa sổ.

0

Bạn phải sử dụng sự kiện onbeforeunload và thực hiện cuộc gọi AJAX đồng bộ.

$.ajax({ 
    ... 
    "url": "http://www.example.com", 
    "async": false, 
    ... 
}); 
0

Thay vì làm một cuộc gọi ajax đồng bộ (bị phản đối trên các trình duyệt mới nhất và có thể nhận được ngoại lệ), bạn có thể mở một cửa sổ bật lên:

$(window).on('unload', function() { 
    window.open("myscript.php"); 
}); 

Bạn có thể thêm rõ ràng là thông số để liên kết và bạn có thể tự động đóng cửa sổ bật lên nếu muốn. Trình chặn cửa sổ bật lên phải được hủy kích hoạt cho miền của bạn trong các tùy chọn trình duyệt.

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