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

时间:2016-03-28 23:43:14

标签: javascript jquery ajax

我正在尝试在PUT事件上发送unload请求,但请求始终被取消。

这里的答案说不可能:How to perform an ajax call on page unload?

这里的答案表明它有可能:How do I send an AJAX request upon page unload / leaving?

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

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

2 个答案:

答案 0 :(得分:7)

您需要做的就是让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');
    });
});

答案 1 :(得分:3)

浏览器正在积极禁止在页面卸载处理程序中执行标准ajax调用,因为等待它完成操作会延迟窗口中发生的下一件事(例如,加载新页面)。尽管您无法使用它进行PUT,但在卸载处理程序中替换同步ajax的方法是sendBeaconsendBeacon使您可以将数据发送到服务器 ,而无需保留正在执行操作的页面:

window.addEventListener("unload", function() {
  navigator.sendBeacon("/log", yourDataHere);
});

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

信标是POST,而不是PUT,但除此之外,这正是您所需要的。