如何在没有取消的情况下在页面卸载时发送AJAX请求?

Dou*_*ell 5 javascript ajax jquery

我正在尝试发送PUT关于该unload事件的请求,但请求始终被取消.

这里的答案说不可能:如何在页面卸载时执行ajax调用?

这里的答案表明它是可能的:如何在页面卸载/离开时发送AJAX请求?

我可以在卸载时发送AJAX请求,如果是这样,我怎么能不被取消.

编辑:我不关心响应,我不需要回复.只需要向服务器发送一些信息,说明页面已经关闭而没有保持活动检查.

leo*_*iyo 9

您需要做的就是使ajax调用同步.这样浏览器将在关闭窗口/选项卡之前等待响应,并且不会被取消.

$(window).unload(function(){
    $.ajax({
        type: 'PUT',
        url: '/your_url.php',
        async:false, //IMPORTANT, the call will be synchronous
        data: {}
    }).done(function(data) {                
        console.log('complete');
    });
});
Run Code Online (Sandbox Code Playgroud)

  • 这将在很长时间内停止工作,浏览器正在积极地杀死它。尽管您无法使用它进行 PUT,但卸载处理程序中同步 ajax 的替代品是 [`sendBeacon`](https://developer.mozilla.org/en-US/docs/Web/API/Navigator/sendBeacon)。 (5认同)
  • @TJCrowder,你可能想让你所说的成为一个答案。我通过谷歌搜索来到这里,尝试了上面的代码,但无法让它工作。sendBeacon 的工作方式就像一个魅力,唯一需要注意的是,即使请求完成,因为浏览器不期望响应,请求仍处于待处理状态。 (3认同)

T.J*_*der 5

在页面卸载处理程序中执行标准 ajax 调用被浏览器主动禁用,因为等待它完成会延迟窗口中发生的下一件事(例如,加载新页面)。虽然你不能用它做 PUT,但是卸载处理程序中同步 ajax 的替代品是sendBeacon. sendBeacon允许您将数据发送到您的服务器,而无需阻止您正在执行的页面:

window.addEventListener("unload", function() {
  navigator.sendBeacon("/log", yourDataHere);
});
Run Code Online (Sandbox Code Playgroud)

浏览器将发送数据而不会阻止/延迟窗口中发生的任何事情(关闭它,移动到新的 paeg 等)。

信标是 POST,而不是 PUT,但除此之外,它正是您要寻找的。