提问人:Eli 提问时间:3/2/2009 更新时间:4/16/2016 访问量:16606
jQuery:在页面卸载时自动中止 AjaxRequests?
jQuery: Automatically abort AjaxRequests on Page Unload?
问:
感谢您的阅读。
我注意到,如果我有一个页面打开了一个或多个 ajax 请求,并且我单击链接离开页面或刷新它,它将等待 ajax 请求完成,然后再卸载。
这通常不是问题,但如果请求需要一段时间,则可以解决。
我正在寻找类似的东西:
$(window).bind("beforeunload", function() {AjaxRequest.abort();});
在卸载之前自动中止请求,但不太确定如何找到 AJAX 请求。他们会在某个地方的窗户下吗?
答:
认为每个请求都需要 window.onunload 事件加上 AjaxRequestX = $.get(...),也许将对象保留在数组中并在卸载时遍历它们。
$.ajax() jQuery 方法返回 XMLHttpRequest 对象。这意味着您可以在对象上应用标准方法,例如 abort()。
若要卸载,请使用内置的 unload jQuery 事件方法。
var myajax = $.ajax(...);
$(window).unload( function () { myajax.abort(); } );
评论
unload
方法已在 Jquery 中删除 :/
我只是遇到了这个问题,我正在 PHP 中执行一个长循环,它是从 $.ajax 调用的。我的解决方案是添加 session_write_close();在长循环之前。
我的理论是,Chrome 在取消任何后台 ajax 请求之前会请求下一页。如果你的 ajax 请求与你要离开的页面相同_SESSION AND TO,那么你甚至在命中第一行 PHP 代码之前就陷入了僵局。
您必须保留所有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 弹出已完成的请求,但这取决于您
以下代码经过测试,并在 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);
};
评论
error
textStatus!='abort'
下一个:jQuery:从数组循环设置点击
评论