在版本4.3.1上自动取消请求jqGrid

时间:2019-09-18 04:19:46

标签: jqgrid free-jqgrid

我检查了下面的链接,但是仅在4.3.2版之后才提供解决方案支持 目前,我正在使用版本4.3.1,它不支持触发器处理程序。还有什么其他方法可以解决4.3.1版中的此问题。因为目前我无法升级到较新版本。更改jqgrid核心js文件也可以。

我需要解决以下问题,链接中也已经给出了相同的问题

如果用户在响应返回之前做出了另一个过滤器选择,则网格不会取消现有请求,也不会提交新的请求,因此在用户做出第二个选择后的某个时刻,网格会更新以显示第一次选择的响应。此外,当您更改过滤器选择时,网格会自动更新,因此要使其显示所需的数据,您必须将选择内容更改为其他内容,等待加载,然后再将其更改回。

Automatically canceling jqGrid request

1 个答案:

答案 0 :(得分:1)

要能够取消jqGrid发送的基础Ajax请求,需要访问jqXHR对象,该对象是XMLHTTPRequest对象的超集。该对象具有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)使用以下代码将新方法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();
        });
    }
});