【问题标题】:Event not firing within a function when using jqGrid and jQuery使用 jqGrid 和 jQuery 时事件未在函数内触发
【发布时间】:2011-03-31 18:02:34
【问题描述】:

我是 javascript、jQuery 和 jqGrid 的新手,所以这可能是一个非常基本的问题。

为什么事件在这里正确触发,触发警报:

        $("#list").jqGrid({loadComplete: alert('load complete')
            });

但当警报在函数内部时不在这里?

        $("#list").jqGrid({loadComplete:
                               function() {
                                    alert('load complete');
                               }
            });

我猜有些基本的东西我(还)不明白。

谢谢。 --杰夫

【问题讨论】:

    标签: javascript jquery jqgrid


    【解决方案1】:

    在您发布链接http://ccclients.com/TEST/TEST.php 后,我明白您犯了什么错误。您不应该在 两个 调用中分隔 jqGrid 定义:

    jQuery("#list").jqGrid({
        datatype: 'xml',
        mtype: 'GET',
        loadonce: true,
        // other parameters
        caption: 'My first grid', 
        xmlReader: { 
            root: "export", 
            row: "row",
            repeatitems: false
        }
     });
    

    和

    $("#list").jqGrid({loadComplete: 
                function() {
                    alert('load complete')
                }
    });
    

    但将loadComplete 定义为$("#list").jqGrid({ ... }); 的一个调用的一部分,如下所示:

    jQuery("#list").jqGrid({
        datatype: 'xml',
        mtype: 'GET',
        loadonce: true,
        // other parameters
        caption: 'My first grid', 
        xmlReader: { 
            root: "export", 
            row: "row",
            repeatitems: false
        },
        loadComplete: function(data) {
            alert('load complete');
        }
     });
    

    如果您稍后必须设置事件处理程序,您应该使用setGridParam 方法(参见Add an event handler to jqGrid after instantiation)

    此外,我完全不同意 Groxx 的回答。将为所有数据类型(包括“xml”、“json”、“local”等)调用函数loadComplete。如何在http://www.trirand.com/jqgridwiki/doku.php?id=wiki:events#execution_order 下的文档中看到函数loadComplete 是在数据加载(或刷新)后在网格中进行一些修改的理想场所。我永久使用此功能。如果您需要加载非常奇特的数据(既不是 xml 也不是 json 等),则使用数据类型函数是最后一种方法。对于 xml 和 json 数据的加载,jqGrid 中有很多自定义功能(例如,参见 Setting the content-type of requests performed by jQuery jqGrid)。因此,您可以自定义jQurey.ajax 调用,并将用作jQurey.ajax 的输入和输出的数据转换为您想要的。

    【讨论】:

    • 谢谢。这非常有帮助并回答了我的具体问题,但仍然给我留下了一个更一般的问题:如何在绘制网格之前“预处理”xml 或 json 服务器响应,因为 loadComplete 似乎没有这样做。例如,如果来自服务器的 ajax 响应包含自定义错误消息,我想显示错误消息而不是网格
    • 我在这里为此设置了一个单独的问题:stackoverflow.com/questions/3522165/…
    【解决方案2】:

    它需要一个函数,当您将警报本身传递给它时,您会立即调用警报并尝试将结果分配给处理程序。相反,您需要一个实际的处理程序(在您第二次调用的情况下是一个匿名函数)。

    并不是第一个在事件上正确触发,它实际上是在该行代码运行时立即触发,听起来您的代码根本没有触发 loadComplete 处理程序,这是一个单独的问题jqGrid。

    【讨论】:

    • 那么,第二个版本实际上是正确的形式,并且事件存在jqGrid问题?
    • @jalperin - 看起来那个事件没有触发,是的,你有示例页面吗?
    • 我会在几分钟内设置一个。
    【解决方案3】:

    我最近尝试做同样的事情(和你一样的职位,基本上对一切都是新的), loadComplete 从来没有为我工作过。现在调查一下,现在我明白了一点:

    查看源代码,似乎 loadComplete 仅在您的数据类型为“script”或“xmlstring”时才会触发,这使得它非常无用。而且很奇怪。

    如果您想在 数据输入到网格之前使用它来做某事,我建议您将数据类型设为函数,并在其中执行您自己的 ajax / 任何操作。当数据返回时,只需执行 grid.addData(data),它就会填充网格。

    如果您在输入数据后尝试执行某些操作,请改用 gridComplete,它会可靠地触发。

    【讨论】:

    • 对不起,我完全不同意你的观点。我在回答中包含了对您的回答的详细评论。用于加载标准数据类型的数据类型函数的使用来自于 jqGrid 3.6 发布之前的时间。像serializeGridData这样的事件可以让你只解决数据转换的问题,而无需改变请求数据过程中所有操作的标准方式。
    • @Oleg:我会记住这一点,谢谢!然而,尽管 gridComplete 始终可靠地工作,但我也从来没有遇到过 loadComplete 火灾——你对此有什么解释吗?
    • 如果您发布了不起作用的代码示例或发布了一个网址,我可以在其中看到一个不起作用的示例,我会尝试找出原因和解决问题的方法。跨度>
    猜你喜欢
    • 1970-01-01
    • 2023-04-09
    • 1970-01-01
    • 1970-01-01
    • 2020-01-28
    • 2023-03-19
    • 2013-11-15
    • 2018-03-17
    • 1970-01-01
    相关资源
    最近更新 更多