jsperf: Uncaught HierarchyRequestError: Не удалось выполнить 'appendChild' на 'узле': этот тип узла не поддерживает этот метод - PullRequest
0 голосов
/ 25 декабря 2018

Я пытаюсь использовать jsperf, чтобы проверить , может ли временное отсоединение контейнера от document ускорить изменение его содержимого (удаление / добавление нескольких элементов).Но код, который работает для меня в консоли, выдает мне ошибку в jsperf.

Подготовка:

<div id="container">
    <ul></ul>
</div>

// fill the list
var container = document.querySelector('#container');
var listElement = container.firstChild;
var initialContent = "";
for(var i = 0; i < 100; i++)
    initialContent += `<li>${i+1}</li>`;
listElement.innerHTML = initialContent;

разрыв (важно не использовать listElement.innerHTML = ''):

while(listElement.firstChild)
    listElement.removeChild(listElement.firstChild);

основной код для профиля:

listElement = container.removeChild(listElement);
while(listElement.firstChild)
    listElement.removeChild(listElement.firstChild);
var newListItem;
for(var j = 100; j < 200; j++) {
    newListItem = document.createElement('li');
    newListItem.appendChild(document.createTextNode(j));
    listElement.appendChild(newListItem);
}
container.appendChild(listElement);

код для сравнения:

while(listElement.firstChild)
    listElement.removeChild(listElement.firstChild);
var newListItem;
for(var j = 100; j < 200; j++) {
    newListItem = document.createElement('li');
    newListItem.appendChild(document.createTextNode(j));
    listElement.appendChild(newListItem);
}

Я получаю ошибку:

Uncaught HierarchyRequestError:Не удалось выполнить appendChild на узле. Этот тип узла не поддерживает этот метод.

Он исчезнет, ​​если я закомментирую строку listElement.appendChild(newListItem);

Добавление точки останова через строку debugger; показывает, что listElement является каким-то текстовым узлом ..

1 Ответ

0 голосов
/ 25 декабря 2018

Хорошо, я понял это при публикации: использование

var listElement = container.firstElementChild;

вместо

var listElement = container.firstChild;

решило проблему.Источником проблемы является пробел в html

<div id="container">
    <ul></ul>
</div>

, который делает container.firstChild текстовым узлом с текстом '\n '.Возможно, я пропустил пробел, когда тестировал это без jsperf.

Надеюсь, это может быть полезно для других, ищущих эту ошибку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...