JavaScript | nodeType、nodeValue与nodeName

918 阅读2分钟

前言:在看别人写的文章的时候看到了下面这段代码:

/*
  获取第一个子元素节点
  firstChild,lastChild都会将空格或者换行当做节点处理
  firstElementChild,lastElementChild 直接返回元素节点
  这里只列举第一个孩子
*/
function getFirstElementChild(ele) {    
  if(ele.firstElementChild) {    
    return ele.firstElementChild;    
  } else {    
      do {     
          ele=getNextElementSibling(ele) ;     
      } while ( ele && ele.nodeType !== 1 );    
      return ele;    
  }   
}

对于上面的代码,我不太清楚nodeType是什么,然后我就顺便查阅了下有关nodeTypenodeValue以及nodeName相关的资料,用这篇博客简单总结一下。

nodeType

Node.nodeType(只读):表示当前节点对应的类型。

返回值:返回一个整数,代表的是节点的类型。

所以有了这个属性就可以区分不同类型的节点了,比如元素节点、文本节点、注释节点。

下面我列举几个常见的返回值,见如下表格:

常量描述
Node.ELEMENT_NODE1元素节点
Node.ATTRIBUTE_NODE2属性节点
Node.TEXT_NODE3文本节点
Node.COMMENT_NODE8注释节点
Node.DOCUMENT_NODE9document节点
Node.DOCUMENT_TYPE_NODE10DTD节点,描述文档类型的 DocumentType 节点。例如 <!DOCTYPE html> 就是用于 HTML5 的。

完整的返回值列表见——(MDN-nodeType

nodeName

Node.nodeName(只读):返回当前节点的名称。

不同类型的节点返回的值不同,依旧列举一个常见的节点对应的值。

节点类型
元素节点大写的元素名称
属性节点属性名称
文本节点返回字符串'#text'
注释节点返回字符串'#comment'

nodeValue

Node.nodeValue:返回但钱节点的值的字符串(如果有的话)。

  • 对于文档节点,nodeValue返回null

  • 对于文本、注释节点,nodeValue返回该节点的文本内容

  • 对于属性节点,nodeValue返回该属性的值

节点类型
元素节点null
属性节点该属性的值
文本节点文本节点的内容
注释节点注释的文本内容

测试

<div id="father">
  beast 
  <div id="son1">son1</div>
  <div id="son2" name="son1">son2</div>
  <a href="https://www.baidu.com"></a>
  <!-- <div name="son3">son3</div> -->
</div>
<script>
  let father = document.getElementById('father');
  let sons = document.querySelectorAll('div[id^=son]');
  let a = document.querySelector('a');
  let divs = document.querySelectorAll('div');
  // 1. 元素节点 测试
  // 输出: 1 'DIV' null
  console.log(father.nodeType, father.nodeName, father.nodeValue);
  // 输出: 1 'A' null
  console.log(a.nodeType, a.nodeName, a.nodeValue);
  
  // 2. 属性节点测试
  // 获取属性集合 使用attributes
  let aAttr = a.attributes;
  // 输出: 2 'href' 'https://www.baidu.com'
  console.log(aAttr[0].nodeType, aAttr[0].nodeName, aAttr[0].nodeValue);

  // 3. 注释节点测试
  let commentNode = father.lastChild.previousSibling;
  // 输出: 8 '#comment' ' <div name="son3">son3</div> '
  console.log(commentNode.nodeType, commentNode.nodeName, commentNode.nodeValue);

  // 4. 文本节点 测试
  let text = father.firstChild;
  // 输出: 3 '#text' '\n    beast \n    '
  console.log(text.nodeType, text.nodeName, text.nodeValue);
</script>

参考文献

原文:# JavaScript | nodeType、nodeValue与nodeName