javascript - run - window.onbeforeun在Chrome中加載ajax請求




jquery cdn google (3)

嘗試創建變量(最好是布爾值)並在從Ajax調用獲得響應後進行更改。 並將bas_disconnect_only()函數放在while循環中。 我曾經遇到過這樣的問題。 我認為這是因為Chrome不等待Ajax調用。 我不知道我是如何修復它的,我沒有嘗試過這個代碼,所以我不知道它是否有效。 這是一個例子:

var has_disconnected = false;
window.onbeforeunload = function () {
    while (!has_disconnected) {
        bas_disconnect_only();
        // This doesn't have to be here but it doesn't hurt to add it:
        return true;
    }
}

bas_send_request()函數內部( xmlhttp是HTTP請求):

xmlhttp.onreadystatechange = function() {
    if (xmlhttp.readyState == 4 && xmlhttp.status == 200)
        has_disconnected = true;
}

祝你好運,我希望這會有所幫助。

我有一個網頁,通過Ajax處理機器的遠程控制。 當用戶離開頁面時,我想自動斷開與機器的連接。 所以這是代碼:

window.onbeforeunload = function () {
  bas_disconnect_only();
}

斷開連接函數只是向PHP服務器端腳本發送HTTP GET請求,該腳本執行斷開連接的實際工作:

function bas_disconnect_only () {
   var xhr = bas_send_request("req=10", function () {
   });
}

這在FireFox中運行良好。 但是使用Chrome時,根本不會發送ajax請求。 有一種不可接受的解決方法:向回調函數添加警報:

function bas_disconnect_only () {
   var xhr = bas_send_request("req=10", function () {
     alert("You're been automatically disconnected.");
   });
}

添加警報調用後,將成功發送請求。 但正如你所看到的,它根本不是一個真正的解決方案。

有人可以告訴我這是否可以通過Chrome實現? 我正在做的事情看起來完全合法。

謝謝,


我知道這個問題剛才問過,我要說的是與新版Chrome有關,但我認為這可能對很多開發人員有所幫助。

就像@Garry English said ,在頁面onunload期間發送異步請求是行不通的,因為瀏覽器會在發送請求之前終止線程。 發送同步請求應該可以工作。

這是直到Chrome的第29版,但在Chrome V 30上它突然停止工作,如此處所述

看來今天這樣做的唯一方法是使用此處建議onbeforeunload事件。

但是注意:其他瀏覽器根本不允許您在onbeforeunload事件中發送Ajax請求。 所以你需要做的是在卸載和beforeunload中執行操作,並檢查它是否已經發生。

像這樣的東西:

var _wasPageCleanedUp = false;
function pageCleanup()
{
    if (!_wasPageCleanedUp)
    {
        $.ajax({
            type: 'GET',
            async: false,
            url: 'SomeUrl.com/PageCleanup?id=123',
            success: function ()
            {
                _wasPageCleanedUp = true;
            }
        });
    }
}


$(window).on('beforeunload', function ()
{
    //this will work only for Chrome
    pageCleanup();
});

$(window).on("unload", function ()
{
    //this will work for other browsers
    pageCleanup();
});

希望這對任何人都有幫助。


簽出為此目的而構建的Navigator.sendBeacon()方法。

MDN頁面說:

navigator.sendBeacon()方法可用於將小型HTTP數據從用戶代理異步傳輸到Web服務器。

此方法滿足分析和診斷代碼的需求,這些代碼通常在卸載文檔之前嘗試將數據發送到Web服務器。 更快地發送數據可能會導致錯過收集數據的機會。 但是,確保在卸載文檔期間已經發送數據對於開發人員來說傳統上是困難的。

這是一個相對較新的API,似乎IE尚未支持。







google-chrome