【问题标题】:"Uncaught TypeError: Cannot call method 'indexOf' of undefined" when selected jqgrid row选择 jqgrid 行时,“未捕获的 TypeError:无法调用未定义的方法 'indexOf'”
【发布时间】:2012-06-01 15:01:52
【问题描述】:

我已经使用 jqgrid 有一段时间了。选择行时出现错误:

> Uncaught TypeError: Cannot call method 'indexOf' of undefined
> jquery.jqGrid.src.js:2465 $.jgrid.extend.setSelection
> jquery.jqGrid.src.js:2465 jQuery.extend.each jquery-1.7.1.js:658
> jQuery.fn.jQuery.each jquery-1.7.1.js:271 $.jgrid.extend.setSelection
> jquery.jqGrid.src.js:2460 $.fn.jqGrid jquery.jqGrid.src.js:587
> $.fn.jqGrid.each.$.before.click.bind.ts.p.datatype
> jquery.jqGrid.src.js:2235 jQuery.event.dispatch jquery-1.7.1.js:3256
> jQuery.event.add.elemData.handle.eventHandle

我的网格定义在这里:

var sql4 = 'select id_num, est_number, customer, product, rev, w, l, fw, fl, expr1009, status, comments from schema.table where customer = "' + customer + '" and est_number = "' + est_num + '"';
$("#the_table").jqGrid({
    url:'thescript.php?sql=' + sql4,
    height: 300,
    shrinkToFit: true,
    width: 650,
    datatype: 'xml',
    mtype: 'POST',
    colNames:["ID","Estimate","Customer","Product","Rev","W","L","FW","FL","Expr1009","Status","Comments"],
    colModel:[
        {name:"id_num",index:"id_num",width:"10"},
        {name:"est_number",index:"est_number",width:"10"},
        {name:"customer",index:"customer",width:"10"},
        {name:"product",index:"product",width:"10"},
        {name:"rev",index:"rev",width:"10"},
        {name:"w",index:"w",width:"10"},
        {name:"l",index:"l",width:"10"},
        {name:"fw",index:"fw",width:"10"},
        {name:"fl",index:"fl",width:"10"},
        {name:"expr1009",index:"expr1009",width:"10"},
        {name:"status",index:"status",width:"10"},
        {name:"comments",index:"comments",width:"10"}
    ],
    rowNum:10000,
    sortname: 'id_num',
    sortorder: 'asc',
    viewrecords: true,
    gridview: true,
    caption: '',
    ondblClickRow: function(id){
        //do some stuff here
    }
})
.jqGrid('filterToolbar')
.trigger('reloadGrid');

}

我无法弄清楚问题出在哪里,因为网格似乎可以正常工作。

我注意到在下面的 jqgrid 函数中,id = 1 for ever 行(此信息包含在变量 pt 中。

setSelection : function(selection,onsr) {
    return this.each(function(){
        var $t = this, stat,pt, ner, ia, tpsr;
        if(selection === undefined) { return; }
        onsr = onsr === false ? false : true;
        pt=$t.rows.namedItem(selection+"");

下一行是发生错误的地方。变量 pt 有 4 个节点,它们的 id 都为:1。

if(!pt || pt.className.indexOf( 'ui-state-disabled' ) > -1 ) { return; }

** Amswer **

我在ColModel 中的id_num 字段中添加了key:true 选项。网格的每一行都有相同的 ID,因此会导致问题。我认为当您没有唯一 ID 时,最常发生错误。在您的网格中。

【问题讨论】:

  • 了解您使用的jqGrid 版本很重要。

标签: javascript jquery xml jqgrid indexof


【解决方案1】:

我认为你应该以任何方式使用encodeURIComponent

url: 'thescript.php?sql=' + encodeURIComponent(sql4)

而不是

url: 'thescript.php?sql=' + sql4

您可能应该发送sql 参数,而不是作为 URL 的一部分,而是在 POST 数据中。在这种情况下你应该使用

url: 'thescript.php',
postData: {
    sql: function () {
        return 'select id_num, est_number, customer, product, rev, w, l, fw, fl,' +
            ' expr1009, status, comments from schema.table where customer = "' +
            customer + '" and est_number = "' + est_num + '"';
    }
}

已更新:错误将出现在setSelection 代码的the lines 中。所以pt.classNameundefined。这很奇怪,但您可以验证网格中没有id 重复。

【讨论】:

  • 感谢您的建议,但似乎无法解决问题。
  • @jeffery_the_wind:你没有回答我关于你使用的 jqGrid 的 version 的问题。
  • 哦,对不起,是jqgrid 4.1.1
  • @jeffery_the_wind:您可以将key: true 添加为“id_num”列的附加属性。重要的是要理解,ID 不仅在网格内部必须是唯一的,而且在整个页面 上都必须是唯一的。很多情况下你可以使用idPrefix: "someText"来解决问题。
  • @jeffery_the_wind:顺便说一句,idPrefix 选项的引入是我前段时间的建议,但我认为它是在 4.1.1 版之后实现的。在第一个实现中存在一些小错误,这在使用 addRowData 的情况下很重要。所以我建议你至少试试最新的 jqGrid 4.3.3。
猜你喜欢
  • 2012-01-20
  • 2012-02-23
  • 2012-08-27
  • 1970-01-01
  • 1970-01-01
  • 2013-01-27
  • 1970-01-01
  • 2013-03-05
  • 1970-01-01
相关资源
最近更新 更多