无法在“节点”上执行“ insertBefore”:参数1不是“节点”类型

时间:2018-10-05 17:59:45

标签: javascript error-handling split tablesorter

如何解决此错误?我可能做错了什么错?

在Chrome控制台中,我无法在“节点”上执行“ insertBefore”:参数1的类型不是“节点”。对于这一行代码

rows[i].parentNode.insertBefore(rows[i + 1], rows[i]);

可以在结尾处找到。我不知道如何解决此错误,或者是什么错误。

console.log("CONNECTED");
var n = 1;
tester(n);

function tester(n){
var switchcount = 0;
var  table = document.getElementById("myTable2");
var monthsArray= ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];//0-11    

var switching = true;
// Set the sorting direction to ascending:
var dir = "asc";
// Check the status of each data cell in a table. 
while(switching){
    switching = false;
    var rows = table.rows;      
    var shouldSwitch;

    for (var i = 1; i < (rows.length-1); i++) { 
        var cellsX = rows[i].getElementsByTagName("TD")[n];
        var cellsY = rows[i + 1].getElementsByTagName("TD")[n];
        var dateX = cellsX.textContent.split(" ");
        var dateY = cellsY.textContent.split(" ");
        var mnthX = dateX[0];
        var mnthY = dateY[0];
        var yearX = dateX[1];
        var yearY = dateY[1];
        var totalX = parseInt(monthsArray.indexOf(mnthX)) + parseInt(yearX);
        var totalY = parseInt(monthsArray.indexOf(mnthY)) + parseInt(yearY);

        if(dir === "asc"){
            if(totalX < totalY) {
                //if so, mark as a switch and break the loop:
                shouldSwitch = true;
                break;
            }
        }else if(dir === "desc"){
            if(totalX > totalY){
                shouldSwitch = true;
                break;
            }
        }
    }
    if(shouldSwitch){
        rows[i].parentNode.insertBefore(rows[i + 1], rows[i]);
        switching = true;
        switchcount++;
    }else{
        if (switchcount === 0 && dir === "asc") {
            dir = "desc";
            switching = true;
        }

    }
}

}

我要按月份和年份排序的表格。

<table id ="myTable2">
    <thead>
        <tr>
            <th>Client</th>
            <th>Due Date</th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td>Smith</td>
            <td>Apr 18</td>
        </tr>
        <tr>
            <td>Kelly</td>
            <td>Jan 18</td>
        </tr>
        <tr>
            <td>Park</td>
            <td>Nov 18</td>
        </tr>
        <tr>
            <td>Mark</td>
            <td>July 19</td>
        </tr>
    </tbody>
</table>

1 个答案:

答案 0 :(得分:2)

修改后的答案:

rows[i+1]是该行的最后一个元素的索引时,没有i。您的问题是,在代码的上面部分中,iifor循环之后的值,这是循环测试{{1} }失败。因此,在代码的这一点上,您应该始终拥有i < (rows.length-1),这不是您想要的。

一种避免在循环外使用循环变量(这很少是目标,并且总是很难读取/理解/调试等)的方法是用i === (rows.length-1)而不是{{ 1}},如果您不介意不支持旧版浏览器:

let

这样,var不会在循环之外定义,并且如果您碰巧尝试进一步使用for (let i = 1; i < (rows.length-1); i++) { ,则会遇到一个容易理解的错误,告诉您有关错误的信息。将代码放在毫无意义的地方。


但是,代码中还有其他错误。特别是,您实际上从未真正退出i循环。希望您现在可以自己解决此问题,因为您知道如何解决所遇到的错误。但是,如果必须使用纯JavaScript对表进行排序,我可能会:

  • 获取表中所有行的列表,
  • 使用the build-in sort function通过精心选择的比较功能对它们进行排序,
  • 使用remove从DOM中删除所有行,
  • 使用appendChild在已排序数组的i循环中以正确的顺序将它们重新添加。

那将更容易阅读和调试。编写自己的排序函数是一个很好的练习,但是如果您的目标是Web功能并且不练习算法,则不要这样做。