jQuery:在页面卸载时自动中止AjaxRequests?

谢谢阅读。

我注意到如果我有一个打开了一个或多个ajax请求的页面,并且我单击一个链接离开页面或刷新它,它将等待ajax请求在卸载之前完成。

这通常不是问题,但如果请求需要一段时间,则可以。

我正在寻找类似的东西:

$(window).bind("beforeunload", function() {AjaxRequest.abort();}); 

在卸载之前自动中止请求,但不太确定如何查找ajax请求。 他们会在某个窗口下吗?

$ .ajax() jQuery方法返回XMLHttpRequest对象。 这意味着您可以在对象上应用标准方法,例如abort()。

卸载使用内置的卸载 jQuery事件方法。

 var myajax = $.ajax(...); $(window).unload( function () { myajax.abort(); } ); 

以下代码经过测试并在Chrome中卸载页面卸载时所有未完成的jQuery ajax请求,但Edge和IE使用客户端也没有错误地使用它。

将以下内容作为第一个jQuery ready处理程序:

 $(onPageLoaded) 

把它放在可以访问的地方:

 function onPageLoaded() { var jqxhrs = []; $(window).bind("beforeunload", function (event) { $.each(jqxhrs, function (idx, jqxhr) { if (jqxhr) jqxhr.abort(); }); }); function registerJqxhr(event, jqxhr, settings) { jqxhrs.push(jqxhr); } function unregisterJqxhr(event, jqxhr, settings) { var idx = $.inArray(jqxhr, jqxhrs); jqxhrs.splice(idx, 1); } $(document).ajaxSend(registerJqxhr); $(document).ajaxComplete(unregisterJqxhr); }; 

我刚刚遇到这个问题,我在PHP中进行了一个长循环,它是从$ .ajax调用的。 我的解决方案是添加session_write_close(); 在长循环之前。

我的理论是,Chrome 取消任何后台ajax请求之前请求下一页。 如果您的ajax请求与您从AND TO导航的页面的_SESSION相同,那么即使您的第一行PHP代码被命中,您也会遇到死锁。

认为你需要window.onunload事件加上每个请求的AjaxRequestX = $ .get(…) ,可能会将对象保存在数组中并在卸载时通过它们。

你必须坚持你所有的ajax请求,当页面正在重新加载时中止所有请求。 样品

 var _requests = []; var _abortAllRequests = function () { $(_requests).each(function (i, xhr) { xhr.abort(); }); _requests = []; } $(window).on("beforeunload", function () { _abortAllRequests(); }); 

你代码中的某个地方

  _requests.push($.ajax(...)) 

此外,您可以使用$ .ajaxSetup和事件ajaxStart ajaxStop弹出已完成的请求,但它取决于您