一、节点属性
    (1)nodeName
    用的不多
    除了元素节点的nodeName返回标签大写,其他都是返回 ‘# + 节点’

    1. console.log(document.nodeName) // '#document'
    2. console.log(document.children[0].nodeName) // 'HTML'

    (2)nodeValue
    很少用到
    (3)nodeType
    重要,可以用来封装查找元素节点的兼容性方法。
    用childNodes来封装方法,children获取元素文本节点:

    1. let domObj = document.getElementsByTagName('div')[0];
    2. function getElementChildren(dom){
    3. let childrenArr = [],
    4. childrenLength = dom.childNodes.length,
    5. childNodes = dom.childNodes;
    6. for(i = 0; i < childrenLength ; i++){
    7. var currentChild = childNodes[i];
    8. if(currentChild.nodeType === 1) childrenArr.push(currentChild)
    9. }
    10. return childrenArr
    11. }
    1. 4)类数组<br />类数组是一种集合,属性为下标,但没有继承Array.prototype的方法,没有pushsplice等方法。但是可以给其增加splice方法来模拟数组,给类数组添加Array.prototype.push后,可以正常使用,且length属性为跟着变化。
    1. let obj = {
    2. 0:1,
    3. 1:2,
    4. 2:3,
    5. push : Array.prototype.push,
    6. splice : Array.prototype.splice
    7. }
    8. //对象有无length属性,影响着后来添加的push方法,如果对象本身没有length属性,
    9. //调用push方法后,对象会增加一个0属性,且对了一个length属性,值为1
    10. obj.push = Array.prototype.push
    1. 5hasChildNodes
    1. <div>
    2. </div>
    1. document.getElementsByTagName('div')[0].hasChildNodes() // true ,因为有空格,属于文本节点

    二、DOM结构
    image.png
    (1)DOM结构(可以操作html和xml)的顶点是NodeDocument有两个分支(HTMLDocument和XMLDocument),HTMLDocument的实例为document对象,document对象继承于HTMLDocument和Document。
    (2)Element构造函数,有两个分支(HTMLElement和XMLElement),HTMLElement有不同实例构造函数用来创建各自的dom元素实例。

    1. <div>123</div>
    2. <p>paragragh</p>
    1. Element.prototype.aaa = 'aaa';
    2. HTMLElement.prototype.bbb = 'bbb';
    3. HTMLDivElement.prototype.ccc = 'ccc';
    4. let divDom = document.getElementsByTagName('div')[0],
    5. pDom = document.getElementsByTagName('div')[0];
    6. console.log(divDom.aaa,divDom.bbb,divDom.ccc) // 'aaa','bbb','ccc'
    7. console.log(pDom.aaa,pDom.bbb,pDom.ccc) // 'aaa','bbb',undefined ,
    8. // 因为p元素不是HTMLDivElement构造的,不能继承HTMLDiv.prototype
    9. console.log(Object.getPrototypeOf(divDom) === HTMLDivElement.prototype) // true
    1. 3Document.prototypeElement.prototype上查找元素的方法对比<br />(1getElementByIdgetElementByName只在Document.prototype上有(选择范围为整个文档)<br />(2getElementsByTagNamegetElementsByClassNamequerySelectorquerySelectorAllDocument.prototypeElement.prototype上都有,但是返回不一样。<br />Document.prototype上的方法查找范围为整个文档,Element.prototype上元素的方法**查找范围**为当前dom元素节点内<br />(3DOMdocument实例上保存了两个属性能快速访问到bodyhead:documenct.bodydocument.head,不用再调用getElementsByTagName了。**document.title**是直接文本字符串。通过**document.documentElement**可以快速访问**html**节点