自动取消 reuest jqGrid 版本 4.3.1
Automatically canceling reuest jqGrid on version 4.3.1
我查看了下面link,但是给出的解决方案只支持4.3.2版本之后
目前我使用的是 4.3.1 版本,它不支持触发器处理程序。有没有其他方法可以在 4.3.1 版中解决此问题。因为目前我无法升级到更新的版本。更改jqgrid核心js文件也可以。
我需要解决以下问题,我已经在 link
中给出了同样的问题
如果用户在响应返回之前再次选择过滤器,网格不会取消现有请求,也不会提交新请求,因此在用户做出第二次选择后的某个时刻,网格会更新显示第一个选择的响应。此外,当您更改过滤器选择时网格会自动更新,因此要让它显示您想要的数据,您必须将您的选择更改为其他内容,等待它加载,然后再将其更改回来。
Automatically canceling jqGrid request
为了能够取消将由 jqGrid 发送的底层 Ajax 请求,需要访问 jqXHR object, which is a superset of the XMLHTTPRequest object. The object has 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 请求。如果需要测试是否存在pending 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();
});
}
});
我查看了下面link,但是给出的解决方案只支持4.3.2版本之后 目前我使用的是 4.3.1 版本,它不支持触发器处理程序。有没有其他方法可以在 4.3.1 版中解决此问题。因为目前我无法升级到更新的版本。更改jqgrid核心js文件也可以。
我需要解决以下问题,我已经在 link
中给出了同样的问题如果用户在响应返回之前再次选择过滤器,网格不会取消现有请求,也不会提交新请求,因此在用户做出第二次选择后的某个时刻,网格会更新显示第一个选择的响应。此外,当您更改过滤器选择时网格会自动更新,因此要让它显示您想要的数据,您必须将您的选择更改为其他内容,等待它加载,然后再将其更改回来。
Automatically canceling jqGrid request
为了能够取消将由 jqGrid 发送的底层 Ajax 请求,需要访问 jqXHR object, which is a superset of the XMLHTTPRequest object. The object has 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 请求。如果需要测试是否存在pending 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();
});
}
});