为了能够取消将由 jqGrid 发送的底层 Ajax 请求,需要访问jqXHR 对象,它是XMLHTTPRequest 对象的超集。该对象具有abort() 方法,可用于取消挂起的Ajax 请求。
9 年前我发布了the answer,在那里我描述了即使在非常旧的 jqGrid 版本中也可以访问jqXHR 对象。如果您使用 jqGrid 4.3.1,那么您可以执行以下操作:
1) 将以下回调添加到您的代码或修改现有回调 loadBeforeSend、beforeProcessing 和 loadError 以初始化或清除新的 jqXhr 参数:
loadBeforeSend: function (jqXhr) {
this.p.jqXhr = jqXhr;
return true;
},
beforeProcessing: function () {
this.p.jqXhr = null;
return true;
},
loadError: function () {
this.p.jqXhr = null;
}
2) 使用以下代码向 jqGrid 添加新方法 abortAjaxRequest
$.jgrid.extend({
abortAjaxRequest: function () {
return this.each(function () {
if (this.p.jqXhr != null) {
this.p.jqXhr.abort();
}
this.grid.endReq.call(this);
});
}
});
之后,您可以使用$("#list").jqGrid("abortAjaxRequest"); 之类的代码来取消挂起的 Ajax 请求。如果需要测试是否存在未决的Ajax请求,可以测试$("#list").jqGrid("getGridParam", "jqXhr");是否不是null。
更新:方法endReq 未保存在this.grid 中。 abortAjaxRequest 的正确代码如下:
$.jgrid.extend({
abortAjaxRequest: function () {
return this.each(function () {
if (this.p.jqXhr != null) {
this.p.jqXhr.abort();
}
this.grid.hDiv.loading = false;
$("#lui_" + $.jgrid.jqID(this.p.id)).hide();
$("#load_" + $.jgrid.jqID(this.p.id)).hide();
});
}
});