【问题标题】:Automatically canceling reuest jqGrid on version 4.3.14.3.1版本自动取消reuest jqGrid
【发布时间】:2019-09-18 04:19:46
【问题描述】:

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

我需要解决以下问题,我已经在链接中提出了同样的问题

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

Automatically canceling jqGrid request

【问题讨论】:

    标签: jqgrid free-jqgrid


    【解决方案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) 使用以下代码向 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();
            });
        }
    });
    

    【讨论】:

    • 嗨@oleg,感谢分享,但是我们使用jqgrid的缩小版,我们得到以下错误提示endReq未定义
    • endReq 方法转换为 aa = function() { a.grid.hDiv.loading =false; switch (a.p.loadui) { case "enable": b("#load_" + b.jgrid.jqID(a.p.id)).hide();break; case "block": b("#lui_" + b.jgrid.jqID(a.p.id)).hide(); b("#load_" + b.jgrid.jqID(a.p.id)).hide() } },
    • 我试着像 => this.grid.aa.call(this);但显示错误消息 Uncaught TypeError: Cannot read property 'call' of undefined
    • @karthickeyan:你是对的。在复古版本 4.3.1 中,endReq 未保存在 this.grid 中。对于abortAjaxRequest 的固定代码,请参阅我的更新部分答案。
    • 谢谢@Oleg,你是宝石。现在它工作正常。我已将 $("#load_" + $.jgrid.jqID(this.p.id)).hide(); 中的 'ts.p.id' 更改为 'this.p.id';
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-06
    • 2018-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多