为啥我不能使用 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 应用程序将图片上传到我粘贴的事件?

为啥我应用jquery框架,对按钮绑定了一个监听事件后,按钮不能执行这个事件

onTouch 与多点触控和 SoundPool 运动事件

如果我每次都从不同的线程调用事件,为啥会从同一个线程触发事件处理程序的多次执行?