自动取消 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) 将以下回调添加到您的代码或修改现有回调 loadBeforeSendbeforeProcessingloadError 以初始化或清除新的 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();
        });
    }
});