代码之家  ›  专栏  ›  技术社区  ›  YakovL Naresh Kumar Nakka

jspef:未捕获的hierarchyRequestError:未能在“node”上执行“appendChild”:此节点类型不支持此方法

  •  0
  • YakovL Naresh Kumar Nakka  · 技术社区  · 6 年前

    我正在努力 use jsperf to check 是否暂时从 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);
    }
    

    我得到的错误是:

    未捕获的HierarchyRequestError:未能对执行“AppendChild” “node”:此节点类型不支持此方法。

    如果我对这句话发表评论,它就会消失。 listElement.appendChild(newListItem);

    通过添加断点 debugger; 行显示了这一点 listElement 不知何故是文本节点..

    1 回复  |  直到 6 年前
        1
  •  1
  •   YakovL Naresh Kumar Nakka    6 年前

    好的,我在发布此消息时已经了解到:使用

    var listElement = container.firstElementChild;
    

    而不是

    var listElement = container.firstChild;
    

    解决了问题。问题的来源是HTML中的空白

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

    这使得 container.firstChild 带有文本的文本节点 '\n ' . 在没有JSPerf的情况下测试时,可能忽略了空白。

    希望这对其他搜索此错误的人有所帮助。