2013-02-18 29 views
8

So supposedly starting at Firefox > 4, ràng buộc cửa sổ Đối tượng jQuery đến beforeunload không hoạt động nữa.Gửi AJAX đến máy chủ trước khi tải

Điều tôi muốn làm là gửi một bài đăng AJAX để xóa dữ liệu memcache của máy chủ của tôi.

Khi tôi làm mới tab chỉ mở, tôi có thể thấy rằng sự kiện beforeunload được gọi trong cả firefox và chrome bằng mã sau được minh chứng bằng thông báo console.log, "firefox/NON-firefox delete". Vấn đề là tôi không bao giờ thấy thông báo console.log "memcache delete" chỉ ra rằng máy chủ của tôi không bao giờ thấy yêu cầu $.ajax.

Tôi nhận thấy việc đánh hơi trình duyệt là rất tệ và không có sự khác biệt giữa những gì được bao gồm trong câu lệnh if và else. Tôi chỉ đang hiển thị mã cho những gì tôi đã thử không thành công trong Firefox.

Bất kỳ ai có ý tưởng nào?

$(window).bind('beforeunload', function(){ 
    if(/Firefox[\/\s](\d+)/.test(navigator.userAgent) && new Number(RegExp.$1) >= 4) { 
    console.log('firefox delete'); 
    memcacheDelete(); 
    return null; 
    } 
    else { 
    console.log('NON-firefox delete'); 
    memcacheDelete(); 
    return null; 
    } 
}); 

function memcacheDelete() { 
    $.ajax({ 
     url: "/memcache/delete", 
     type: "post", 
     data:{}, 
     success:function(){ 
      console.log('memcache deleted'); 
     }//success 
    }); //ajax 
} 

Trả lời

11

Ajax không đồng bộ.

Khi bạn làm mới (hoặc đóng) trình duyệt của mình, beforeunload đang được gọi. Và nó có nghĩa là ngay sau khi beforeunload hoàn tất việc thực thi, trang sẽ làm mới (hoặc đóng).

Khi bạn thực hiện yêu cầu ajax, (vì trình thông dịch javascript không đồng bộ) của nó không chờ sự kiện ajax success được thực hiện và di chuyển xuống hoàn thành việc thực thi beforeunload.

success của ajax được cho là sẽ được gọi sau vài giây, nhưng bạn không thấy nó khi trang đã được làm mới/đóng.

Side lưu ý:

.success() phương pháp được chấp nhận và được thay thế bằng phương pháp .done()

Reference

+0

có ... cách tôi hiểu asynch gọi đây là những gì tôi nghĩ ... + 1 – cliffbarnes

+1

@Jashwant, cảm ơn cho explanation.Though , Tôi có bằng chứng cho thấy xóa memcache đã thành công khi sử dụng Chrome sau khi đóng/mở lại trình duyệt, nhưng vẫn không ** xóa ** bằng firefox. Có vẻ như có một cái gì đó khác đang diễn ra ở đây .. sẽ chuyển đổi '$ .ajax' thành đồng bộ, 'async: false', trợ giúp? –

+4

Dường như thay đổi [tùy chọn '$ .ajax' 'async' thành' false'] (http://api.jquery.com/jQuery.ajax/#jQuery-ajax-settings) sửa lỗi. Có lý do nào không muốn làm điều đó? –

7

Chỉ vì hoàn thành, đây là những gì tôi đã làm, nhờ @Jashwant để được hướng dẫn: Tôi nhận thấy rằng this other SO Q&A suggested the same solution. Điều quan trọng là các async:true(false) trong $.ajax cuộc gọi dưới đây:

$(window).bind('beforeunload', function(){ 
    if(/Firefox[\/\s](\d+)/.test(navigator.userAgent) && new Number(RegExp.$1) >= 4) { 
    console.log('firefox delete'); 
    var data={async:false}; 
    memcacheDelete(data); 
    return null; 
    } 
    else { 
    console.log('NON-firefox delete'); 
    var data={async:true}; 
    memcacheDelete(data); 
    return null; 
    } 
}); 

function memcacheDelete(data) { 
    $.ajax({ 
    url: "/memcache/delete", 
    type: "post", 
    data:{}, 
    async:data.async, 
    success:function(){ 
     console.log('memcache deleted'); 
    }//success 
    }); //ajax 
} 
+1

Chỉ để nuôi dưỡng sự tò mò của tôi. Ý nghĩa (sử dụng) của '&& new Number (RegExp. $ 1)> = 4' trong thói quen phát hiện Firefox của bạn (nếu) là gì? Chỉ cần đảm bảo rằng Firefox đang ở phiên bản 4 trở lên? – trejder

+0

vâng tôi sẽ giả sử như vậy –

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