为啥我不能使用 jQuery 从卸载事件处理程序触发 AJAX 请求?
Posted
技术标签:
【中文标题】为啥我不能使用 jQuery 从卸载事件处理程序触发 AJAX 请求?【英文标题】:Why can't I use jQuery to fire an AJAX request from an unload event handler?为什么我不能使用 jQuery 从卸载事件处理程序触发 AJAX 请求? 【发布时间】:2011-01-17 12:17:28 【问题描述】:我有以下代码,用于在用户关闭聊天窗口时记录事件:
$(window).unload( function()
test();
);
function test()
alert("Hi");
$.ajax(
type: "POST",
url: baseUrl + 'Index/test',
data: "user_id=" + "Nisanth" + "& chat_id=" + 2,
success: function(msg)
alert(msg);
);
alert('Success');
“Hi”和“Success”消息都很好,但 AJAX 回调中的警报没有...我打算通过 AJAX 请求触发的操作也没有发生(我正在开发一个聊天应用程序,并打算在用户关闭窗口时在数据库中记录一个条目)。
【问题讨论】:
【参考方案1】:问题在于您的数据格式。它被转换为查询字符串,它必须是键/值对,例如: "user_id:value"
【讨论】:
【参考方案2】:因为 ajax 是异步的,所以在正确发送响应之前页面正在卸载,从而有效地终止了连接。尝试设置async:false;
,虽然这会延迟页面的卸载,直到收到响应后,如果您的服务器运行缓慢,这对用户体验不利。
$(window).unload( function ()
test();
);
function test()
alert("Hi");
$.ajax(
async: false,
type: "POST",
url: baseUrl + 'Index/test',
data: "user_id=" + "Nisanth" + "& chat_id=" + 2,
success: function(msg)
alert(msg);
);
alert('Success');
【讨论】:
我很好奇 - 是否有一个处理程序可以知道何时发送请求?我知道有“成功”和“完成”,但我相信这些只有在处理完响应后才会发生。但是对于卸载不需要等待响应,您可以在发送请求的最后一个字符后立即离开。 @Matt:我认为只有成功/失败回调是由 jQuery 提供的。但是,标准的XMLHttpRequest
具有onreadystatechange
事件,该事件在调用的不同阶段触发。当readyState
属性的值为2
时,表示数据已经发送,headers 可用。所以你可以让它保持异步并使用while (xhr.readyState < 2)
循环。但是,如果您的服务器不返回任何数据,那么无论如何时间差都会很小。以上是关于为啥我不能使用 jQuery 从卸载事件处理程序触发 AJAX 请求?的主要内容,如果未能解决你的问题,请参考以下文章
为啥 jQuery click 事件在我的多步骤表单中不能多次工作?
javascript,jquery,怎么在父窗口触发子窗口(iframe)某按钮的click事件呢?
为啥我不能从我自己的 iOS 应用程序将图片上传到我粘贴的事件?