代码之家  ›  专栏  ›  技术社区  ›  kongaraju

insertAdjacentElement不接受文档片段

  •  0
  • kongaraju  · 技术社区  · 5 年前

    我正在尝试执行以下代码片段

    let frag = document.createDocumentFragment();
    let divElement = document.createElement('div');
        divElement.insertAdjacentElement('afterend', frag);

    我遇到了以下错误。

    Uncathed TypeError:未能对“Element”执行“insertAdjacentElement”:参数2不是“Element”类型。

    这里的限制是什么?如能参考错误细节,将不胜感激。 请提出一个有效的替代方案。

    2 回复  |  直到 5 年前
        1
  •  7
  •   Lionel CertainPerformance    2 年前

    碎片可以由以下部分组成 倍数 元素,而不仅仅是单个元素。在这种情况下,如果你问题中的技巧奏效, insertAdjacentElement 将插入 倍数 元素,而不仅仅是单个元素。(它不叫 insertAdjacentElements )

    这是不允许的。不像 appendChild , insert-AdjacentElement 不能将片段作为论据。

    您可以迭代片段的所有子元素并插入它们 afterend :

    // Create fragment, append elements
    const fragment = document.createDocumentFragment();
    fragment.appendChild(document.createElement('span')).textContent = 'span1';
    fragment.appendChild(document.createElement('span')).textContent = 'span2';
    fragment.appendChild(document.createElement('span')).textContent = 'span3';
    
    
    // First cast fragment.children from an HTMLCollection to an Array
    // Since insertAdjacentElement will remove the element from fragment.children
    // It will mutate on each loop causing issue
    const childrenAsArray = Array.from(fragment.children);
    // Iterate through fragment 
    for (const element of childrenAsArray ) {
      divElement.insertAdjacentElement('beforeend', element);
    }
    <div id="divElement"></div>

    或者你可以打电话 insert-AdjacentElement 而不是先将元素放入片段中。

        2
  •  1
  •   brk    5 年前

    createDocumentFragment 它从来不是主dom的一部分。在dom树中 document fragment 被它的孩子所取代。它也不能继承自 element 基地阶级。因此,它也不是一个有效的元素。语法 insertAdjacentElement targetElement.insertAdjacentElement(position, element) 其中元素需要是如上链接所述的有效元素。

    因此,这个错误