2013-10-09 26 views
5

在我的應用程序中,有一個對象需要在用戶切換到另一個頁面或關閉瀏覽器之前先被ajaxed回服務器。在window.unload上做一個ajax調用

就目前而言,我使用的是這樣的:

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

將Ajax調用火在所有瀏覽器還是有這個地方將無法正常工作並在這種情況下,需要進行不同處理的情況呢?我不需要根據成功功能來處理任何事情,我只關心將信息傳遞給服務器。

謝謝。

+1

在頁面消失之前,不能依賴正在生成的「卸載」事件。它將在正常情況下由瀏覽器完成,但當瀏覽器無法執行任何操作時(例如突然關閉系統),不會執行此操作。 – Pointy

+0

你不能依靠任何的邏輯...... *拉動力量和絃* –

回答

3

如果您使用的是jQuery,可以在ajax調用中將async設置爲false。它可能工作,但您的結果可能因瀏覽器而異。這是一個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); 
}); 

在谷歌瀏覽器,之前我導航離開該頁面的Ajax調用總是完成。

但是,我會非常不推薦去那條路線。 ajax中的「a」用於「異步」,如果您試圖強制以類似於同步的方式進行操作,那麼您就會遇到麻煩。這種麻煩通常表現爲凍結瀏覽器 - 如果ajax調用需要很長時間,可能會發生這種情況。

如果可行,在頁面有數據需要通過ajax發佈之前,請在離開頁面之前考慮提示用戶。舉一個例子,看到了這個問題:jquery prompt to save data onbeforeunload

1

不,不幸的是,您的Ajax調用將無法完成,因爲文檔將在異步調用期間卸載。 用戶關閉窗口時無法做很多事情。

0

您必須使用onbeforeunload事件並進行同步AJAX調用。

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

而不是做一個AJAX同步調用(不建議使用的最新的瀏覽器,並能得到除外),你可以打開一個彈出:

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

可以很明顯的參數添加到鏈接,你可以自動關閉彈出窗口,如果你喜歡。 必須在瀏覽器選項中禁用您的域的彈出窗口阻止程序。