Не удалось выполнить «insertBefore» для «Node»: параметр 1 не относится к типу «Node» - PullRequest
0 голосов
/ 05 октября 2018

Как мне устранить эту ошибку?Что я сделал не так, что могло вызвать это?

В консоли 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 голосов
/ 05 октября 2018

Отредактированный ответ:

Нет rows[i+1], когда вы i - это индекс последнего элемента строки.Ваша проблема в том, что в приведенной выше части кода i - это значение, которое i имело после цикла for, которое является первым значением, при котором проверка цикла i < (rows.length-1) не прошла.Поэтому в этой точке кода у вас всегда должен быть i === (rows.length-1), а это не то, что вам нужно.

Способ избежать этой проблемы - использовать переменную цикла вне цикла (который редкоцель, которую всегда трудно читать / понимать / отлаживать и т. д.), состоит в том, чтобы написать свои циклы с let вместо var, если вы не возражаете против поддержки старых браузеров:

for (let i = 1; i < (rows.length-1); i++) {

Таким образом,i не будет определен вне вашего цикла, и у вас будет легкая для понимания ошибка, сообщающая вам об этом, если вы попытаетесь использовать i далее в своем коде в месте, где он не работает.ничего не значит.


Однако в коде есть и другие ошибки.В частности, вы никогда не выходите из цикла while.Надеюсь, вы сами сможете это понять, теперь, когда знаете, как исправить возникшую ошибку.Но если бы мне пришлось сортировать таблицу с использованием простого JavaScript, я бы, вероятно:

  • получил список всех строк в моей таблице,
  • отсортировал их, используя сборку-в функции сортировки с хорошо выбранной функцией сравнения,
  • Удалите все строки из DOM с помощью remove ,
  • Добавьте их обратно в правильном порядкеиспользование appendChild в цикле for над отсортированным массивом.

Это было бы намного легче читать и отлаживать.Написание собственной функции сортировки - хорошее упражнение, но если ваша цель - это веб-функциональность, а не практиковать алгоритмику, не делайте этого.

...