Javascript window.onbefore在Chrome中卸载ajax请求
我有一个网页,可以通过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 () {
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请求的任何情况。