javascript - 在 Javascript 中在同级之前添加节点

标签 javascript dom nodes

所以我正在学习如何操作 Dom 元素和添加节点。

我使用这个js代码:

var parent = document.getElementById('div2');
var newNode = document.createElement('p');
var text = document.createTextNode('Text Node!');
newNode.appendChild(text);
parent.insertBefore(newNode, parent.childNodes[4]);

这是我在通常的 Vanilla 设置中的 html:

<div id="div2">    
    <p> abc </p>
    <p> cde </p>
    <p> efg </p>
    <p> ghi </p>    
</div>

输出是这样的:

abc
cde
Text Node!
efg
ghi

这不是走错地方了吗?这不是插入之前的insertBefore childNode[2]吗?由于某种原因,当我更改 childNode 之后的数字时,文本没有显示在我期望的位置?这是为什么?节点不是还是像数组一样从 0 开始吗​​?另一个例子,使用 childNode[6] 将其放在 efg 之后。我认为应该是 insertBefore childNode[3]。

我知道这个问题可能很基本,但我不明白为什么。谢谢!

最佳答案

childNodes 包括 Text 节点(以及注释节点等,但您没有这些节点)。在 HTML 中,元素之间的空白是 Text 节点,因此 div2 具有:

  • 索引 0:带有换行符和一些空格或制表符的 Text 节点
  • 索引 1:第一段的 Element 节点(其中包含带有 “abc”Text 节点)
  • 索引 2:带有换行符和一些空格或制表符的 Text 节点
  • 索引 3:第二段的 Element 节点(其中包含带有 “cde”Text 节点)
  • 索引 4:带有换行符和一些空格或制表符的 Text 节点
  • 索引 5:第三段的 Element 节点(其中包含带有 “efg”Text 节点)
  • 索引 6:带有换行符和一些空格或制表符的 Text 节点
  • 索引 7:第四段的 Element 节点(其中包含带有 “ghi”Text 节点)
  • 索引 8:带有换行符和一些空格或制表符的 Text 节点

实例:

var div2 = document.getElementById("div2");
var index, child;
snippet.log("div2's child node types:");
for (index = 0; index < div2.childNodes.length; ++index) {
  child = div2.childNodes[index];
  snippet.log(index + ": " + nodeTypeName(child.nodeType));
}

// Type values from http://www.w3.org/TR/DOM-Level-3-Core/core.html#ID-111237558
function nodeTypeName(type) {
  switch (type) {
    case 1:  return "ELEMENT_NODE";
    case 2:  return "ATTRIBUTE_NODE";
    case 3:  return "TEXT_NODE";
    case 4:  return "CDATA_SECTION_NODE";
    case 5:  return "ENTITY_REFERENCE_NODE";
    case 6:  return "ENTITY_NODE";
    case 7:  return "PROCESSING_INSTRUCTION_NODE";
    case 8:  return "COMMENT_NODE";
    case 9:  return "DOCUMENT_NODE";
    case 10: return "DOCUMENT_TYPE_NODE";
    case 11: return "DOCUMENT_FRAGMENT_NODE";
    case 12: return "NOTATION_NODE";
    default:
      return "Unknown node type";
  }
}
<div id="div2">    
    <p> abc </p>
    <p> cde </p>
    <p> efg </p>
    <p> ghi </p>    
</div>
<!-- Script provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 -->
<script src="http://tjcrowder.github.io/simple-snippets-console/snippet.js"></script>

在现代浏览器上,您可以使用 children 来代替,它只包含元素,而不包含其他类型的节点。

关于javascript - 在 Javascript 中在同级之前添加节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28927011/

相关文章:

javascript - 我如何使用 javascript 文件夹对象

javascript - underscore.js 模板函数引用错误

java - 使用 stax 和 dom 读取一个大的 XML 文件

javascript - 为什么要引入window.scrollY和window.scrollX?

javascript - 阻止 Google 为 AngularJS 路由建立索引

javascript - 将 HTML 输入值作为 JavaScript 函数参数传递

javascript - 高效查找出现在指定 DOM 元素上的 DOM 元素

java - LinkedList打印和删除问题

sprite-kit - 如何在 sprite kit/SKphysics 关节中创建多个节点角色?

c++ - 使用 vector 返回类型遍历二叉树