dataTables“Uncaught TypeError:无法读取未定义的属性'nTr'”

时间:2014-02-13 18:44:54

标签: javascript jquery jquery-datatables

所以,这是我使用ajaxForm从表单提交回调后的代码:

function UpdateFormFinished(response, statusText, xhr, $form) {

    if (response['bResult'] == true) {

        var sTestType = $("#sTestType").val();
        var sTableId = "";

        for (index in response) {

            if (typeof response[index] !== "function" && index != "bResult" && index != "sResult") {

                aRowIdPieces = index.split("_");
                sChar = aRowIdPieces[1];

                iColumn = $("#" + index).prevUntil(index).length;
                sTableId = $("#" + sTestType + "_" + sChar).parent().parent().attr("id");

                oTable = $("#" + sTableId).dataTable();
                oTable.fnUpdate(response[index], $("#ixDataTable").val(), iColumn);
            }
        }
    }

    alert(response['sResult']);

    $("#dialog_test_details").dialog("close");
}

if之后的第一行从表单本身的隐藏输入中检索值。变量“index”的值为“someWord_X”,其中“X”是整数。 iColumn存储我想要更新的列/单元格的索引(我知道编号从零开始,这意味着prevUntil返回我想要更新的列/单元格的索引)。最后,“ixDataTable”是表单上的另一个隐藏输入并返回一个整数(我已经使用console.log验证了这一点,以输出该值)。

所以,从我能看到的一切,我将好的值传递给fnUpdate,但是我收到错误“无法读取未定义的属性'nTr'”。我查看了堆栈跟踪,问题从dataTables(v1.9.4)中的第6188行开始,这就是这一行:

_fnGetTdNodes( oSettings, iRow )[iColumn].innerHTML = sDisplay;

堆栈跟踪进行到第4661行,我在这里复制了第4660到4689行:

            oData = oSettings.aoData[iRow];
            if ( oData.nTr !== null )
            {
                /* get the TD child nodes - taking into account text etc nodes */
                anTds = [];
                nTd = oData.nTr.firstChild;
                while ( nTd )
                {
                    sNodeName = nTd.nodeName.toLowerCase();
                    if ( sNodeName == 'td' || sNodeName == 'th' )
                    {
                        anTds.push( nTd );
                    }
                    nTd = nTd.nextSibling;
                }

                iCorrector = 0;
                for ( iColumn=0, iColumns=oSettings.aoColumns.length ; iColumn<iColumns ; iColumn++ )
                {
                    if ( oSettings.aoColumns[iColumn].bVisible )
                    {
                        anReturn.push( anTds[iColumn-iCorrector] );
                    }
                    else
                    {
                        anReturn.push( oData._anHidden[iColumn] );
                        iCorrector++;
                    }
                }
            }

任何有关如何解决这个问题的建议都将受到高度赞赏,并将进行尝试。我已经验证了表ID是正确的,我也尝试将列索引递增1,这些都没有产生积极的影响。我也试过传递:

ixDataTable = sTestType + "_" + sChar;

作为fnUpdate的第二个参数,但它也不喜欢接收要更新的行的id。

提前感谢您,希望这是一个非常简单的解决方法。

2 个答案:

答案 0 :(得分:11)

由于这个引用的代码似乎已经过时,我有另一个可能的错误修复任何遇到此问题的人。 只要在选项中定义,就会出现此行为:

"pageLength": "30" //bad

而不是

"pageLength": 30 //good

DataTables将其内部计数器解释为030,这会导致此错误。

答案 1 :(得分:1)

我发现了问题,它就在这里:

oTable.fnUpdate(response[index], $("#ixDataTable").val(), iColumn);

具体来说,它的值为$("#ixDataTable").val(),因为它的计算结果为字符串。所以,我实际上必须编写这样的代码:

oTable.fnUpdate(response[index], parseInt($("#ixDataTable").val()), iColumn);

希望这可以帮助那些可能遇到这种情况并且无法理解原因的人。