我在以下示例中有关于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;
自: https://www.w3schools.com/jsref/tryit.asp?filename=tryjsref_document_createdocfrag
为什么childNodes[0].childNodes[0]
而不只是childNodes[0]
?
答案 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;)。由于这些元素位于文档层次结构中的同一级别,因此它们必须彼此分离。