我检查了下面的链接,但是仅在4.3.2版之后才提供解决方案支持 目前,我正在使用版本4.3.1,它不支持触发器处理程序。还有什么其他方法可以解决4.3.1版中的此问题。因为目前我无法升级到较新版本。更改jqgrid核心js文件也可以。
我需要解决以下问题,链接中也已经给出了相同的问题
如果用户在响应返回之前做出了另一个过滤器选择,则网格不会取消现有请求,也不会提交新的请求,因此在用户做出第二个选择后的某个时刻,网格会更新以显示第一次选择的响应。此外,当您更改过滤器选择时,网格会自动更新,因此要使其显示所需的数据,您必须将选择内容更改为其他内容,等待加载,然后再将其更改回。
答案 0 :(得分:1)
要能够取消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)使用以下代码将新方法abortAjaxRequest
添加到jqGrid
$.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();
});
}
});