如何解决此错误?我可能做错了什么错?
在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>
答案 0 :(得分:2)
修改后的答案:
当rows[i+1]
是该行的最后一个元素的索引时,没有i
。您的问题是,在代码的上面部分中,i
是i
在for
循环之后的值,这是循环测试{{1} }失败。因此,在代码的这一点上,您应该始终拥有i < (rows.length-1)
,这不是您想要的。
一种避免在循环外使用循环变量(这很少是目标,并且总是很难读取/理解/调试等)的方法是用i === (rows.length-1)
而不是{{ 1}},如果您不介意不支持旧版浏览器:
let
这样,var
不会在循环之外定义,并且如果您碰巧尝试进一步使用for (let i = 1; i < (rows.length-1); i++) {
,则会遇到一个容易理解的错误,告诉您有关错误的信息。将代码放在毫无意义的地方。
但是,代码中还有其他错误。特别是,您实际上从未真正退出i
循环。希望您现在可以自己解决此问题,因为您知道如何解决所遇到的错误。但是,如果必须使用纯JavaScript对表进行排序,我可能会:
i
循环中以正确的顺序将它们重新添加。那将更容易阅读和调试。编写自己的排序函数是一个很好的练习,但是如果您的目标是Web功能并且不练习算法,则不要这样做。