Javascript window.onbefore在Chrome中卸载ajax请求

Javascript window.onbefore在Chrome中卸载ajax请求,javascript,ajax,google-chrome,Javascript,Ajax,Google Chrome,我有一个网页,可以通过Ajax远程控制机器。当用户离开页面时,我想自动断开与机器的连接。下面是代码: window.onbeforeunload = function () { bas_disconnect_only(); } 断开连接函数只向PHP服务器端脚本发送HTTP GET请求,该脚本执行断开连接的实际工作: function bas_disconnect_only () { var xhr = bas_send_request("req=10", function () {

我有一个网页,可以通过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实现吗?我所做的看起来完全合法

谢谢,

尝试创建一个变量(最好是布尔值),并在收到Ajax调用的响应后对其进行更改。然后将
bas\u disconnect\u 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请求):

祝你好运,我希望这会有所帮助。

尝试创建一个变量(最好是布尔变量),并在收到Ajax调用的响应后对其进行更改。然后将
bas\u disconnect\u 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请求):


祝你好运,我希望这会有所帮助。

我也遇到了同样的问题,Chrome没有在window.unload事件中向服务器发送AJAX请求

只有在请求是同步的情况下,我才能让它工作。我可以通过Jquery实现这一点,并将async属性设置为false

$(window).unload(function () {
   $.ajax({
     type: 'GET',
     async: false,
     url: 'SomeUrl.com?id=123'
   });
});
    $(window).on("beforeunload", function () {
        $.ajax({
             type: 'POST',
             url: 'Cierre_unload.php',
             success: function () {
             }
        })
    })

上面的代码在IE9、Chrome 19.0.1084.52 m和Firefox 12中对我有效。

我遇到了同样的问题,Chrome没有在window.unload事件中向服务器发送AJAX请求

只有在请求是同步的情况下,我才能让它工作。我可以通过Jquery实现这一点,并将async属性设置为false

$(window).unload(function () {
   $.ajax({
     type: 'GET',
     async: false,
     url: 'SomeUrl.com?id=123'
   });
});
    $(window).on("beforeunload", function () {
        $.ajax({
             type: 'POST',
             url: 'Cierre_unload.php',
             success: function () {
             }
        })
    })

以上代码在IE9、Chrome 19.0.1084.52 m和Firefox 12中对我有效。

这与Chrome的新版本相关

与@Garry English类似,在页面
onunload
期间发送
async
请求将不起作用,因为浏览器将在发送请求之前终止线程。不过,发送
sync
请求应该可以

这是正确的,直到29版的Chrome,但在ChromeV30上它突然停止工作

现在看来,实现这一点的唯一方法是使用
onbeforeunload
事件

但是请注意:其他浏览器根本不允许在onbeforeunload事件中发送Ajax请求。因此,您需要做的是在unload和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();
});

这与较新版本的Chrome相关

与@Garry English类似,在页面
onunload
期间发送
async
请求将不起作用,因为浏览器将在发送请求之前终止线程。不过,发送
sync
请求应该可以

这是正确的,直到29版的Chrome,但在ChromeV30上它突然停止工作

现在看来,实现这一点的唯一方法是使用
onbeforeunload
事件

但是请注意:其他浏览器根本不允许在onbeforeunload事件中发送Ajax请求。因此,您需要做的是在unload和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();
});
签出为此目的而构建的方法

MDN页面显示:

可以使用navigator.sendBeacon()方法异步 将小型HTTP数据从用户代理传输到web服务器

此方法解决了以下分析和诊断代码的需求: 通常在卸载之前尝试将数据发送到web服务器 该文件的附件。提前发送数据可能会导致数据丢失 收集数据的机会。但是,要确保数据已经 在文件卸载过程中发送的是 传统上,开发人员很难做到这一点

这是一个相对较新的API,IE似乎还不支持它。

检查为此目的而构建的方法

MDN页面显示:

可以使用navigator.sendBeacon()方法异步 将小型HTTP数据从用户代理传输到web服务器

此方法解决了以下分析和诊断代码的需求: 通常在卸载之前尝试将数据发送到web服务器 该文件的附件。提前发送数据可能会导致数据丢失 收集数据的机会。但是,要确保数据已经 在文件卸载过程中发送的是 传统上,开发人员很难做到这一点


这是一个相对较新的API,IE似乎还不支持它。

当用户离开页面并向后端发送ajax请求时,我必须跟踪任何情况

var onLeavePage = function() {
    $.ajax({
        type: 'GET',
        async: false,
        data: {val1: 11, val2: 22},
        url: backend_url
    });
};

/**
 * Track user action: click url on page; close browser tab; click back/forward buttons in browser
 */
var is_mobile_or_tablet_device = some_function_to_detect();
var event_name_leave_page = (is_mobile_or_tablet_device) ? 'pagehide' : 'beforeunload';
window.addEventListener(event_name_leave_page, onLeavePage);

/**
 * Track user action when browser tab leave focus: click url on page with target="_blank"; user open new tab in browser; blur browser window etc.
 */
(/*@cc_on!@*/false) ?  // check for Internet Explorer
    document.onfocusout = onLeavePage :
    window.onblur = onLeavePage;

请注意,事件“pagehide”会在桌面浏览器中触发,但在用户单击浏览器中的后退/前进按钮时不会触发(在最新版本的Mozilla Firefox中进行测试)。

我必须跟踪用户离开页面并向后端发送ajax请求的任何情况。