Javascript createDocumentFragment()

时间:2017-06-15 21:54:09

标签: javascript

我在以下示例中有关于createDocumentFragment()的问题:



<p>Click the button to make changes to a list item, using the createDocumentFragment method, then appending the list item as the last child of the list.</p>

<ul>
  <li>Coffee</li>
  <li>Tea</li>
</ul>

<button onclick="myFunction()">Try it</button>

<script>
  function myFunction() {
    var d = document.createDocumentFragment();
    d.appendChild(document.getElementsByTagName("LI")[0]);
    d.childNodes[0].childNodes[0].nodeValue = "Milk";
    document.getElementsByTagName("UL")[0].appendChild(d);
  }
</script>
&#13;
&#13;
&#13;

自: https://www.w3schools.com/jsref/tryit.asp?filename=tryjsref_document_createdocfrag

为什么childNodes[0].childNodes[0]而不只是childNodes[0]

1 个答案:

答案 0 :(得分:3)

childNodes是一个NodeList(表现得非常像一个数组),包含特定节点的所有直接后代。

想象一下这样的结构:

<div id="a">
    <div id="a_0">
        <div id="a_0_0"></div>
        <div id="a_0_1"></div>
    </div>
    <div id="a_1"></div>
</div>

现在,对document.getElementById("a")的调用将返回最外层节点。

var a = document.getElementById("a");

console.log(a.childNodes[0].id); // would show "a_0"       
console.log(a.childNodes[1].id); // would show "a_1"     
console.log(a.childNodes[0].childNodes[0].id); // would show "a_0_0"

此外,节点内的文本也是一个单独的节点(Text node)。

想象一下像这样的结构:

<div id="a">This is some text</div>

然后,再次使用上面的示例,您需要访问如下文本:

var a = document.getElementById("a");
console.log(a.data) // Will log "undefined"
console.log(a.childNodes[0].data) // Will log "This is some text"

您可以使用快捷方式childNodes[0]代替firstChild,这会返回相同的结果。

由于以下情况,将文本节点视为单独节点的这种行为是必要的:

<div id="a">This text contains <strong>strong</strong> text</div>

此处,节点a有三个子节点:文本节点(&#34;此文本包含&#34;),strong - 节点和附加文本节点(& #34;文本&#34)。 strong - 节点包含一个文本节点(&#34; strong&#34;)。由于这些元素位于文档层次结构中的同一级别,因此它们必须彼此分离。