感谢阅读。
我注意到如果我有一个打开了一个或多个ajax请求的页面,并且我单击一个链接离开页面或刷新它,它将等待ajax请求在卸载之前完成。
这通常不是问题,但如果请求需要一段时间,则可以是。
我正在寻找类似的东西:
$(window).bind("beforeunload", function() {AjaxRequest.abort();});
在卸载之前自动中止请求,但不太确定如何查找ajax请求。他们会在某个窗口下吗?
答案 0 :(得分:10)
$.ajax() jQuery方法返回XMLHttpRequest对象。这意味着您可以在对象上应用标准方法,例如abort()。
卸载使用内置的unload jQuery事件方法。
var myajax = $.ajax(...);
$(window).unload( function () { myajax.abort(); } );
答案 1 :(得分:7)
以下代码经过测试并在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);
};
答案 2 :(得分:4)
我刚刚遇到这个问题,我在PHP中进行了一个长循环,它是从$ .ajax调用的。我的解决方案是添加session_write_close();在长循环之前。
我的理论是,Chrome在取消任何后台ajax请求之前请求下一页。如果您的ajax请求与您从AND TO导航的页面的_SESSION相同,那么即使您的第一行PHP代码被命中,您也会遇到死锁。
答案 3 :(得分:2)
你必须坚持你所有的ajax请求,当页面正在重新加载时中止所有请求。样品
var _requests = [];
var _abortAllRequests = function () {
$(_requests).each(function (i, xhr) { xhr.abort(); });
_requests = [];
}
$(window).on("beforeunload", function () {
_abortAllRequests();
});
代码中的某个地方
_requests.push($.ajax(...))
此外,你可以使用带有事件ajaxStart ajaxStop的$ .ajaxSetup来弹出已完成的请求,但它取决于你
答案 4 :(得分:1)
认为您需要 window.onunload 事件以及每个请求的 AjaxRequestX = $ .get(...),可能会将对象保留在数组中并在卸载时通过它们