DOM

135 阅读2分钟

DOM是什么?

DOM -> Document Object Model (文档对象模型),DOM其实就是一个对象,而且是一个宿主对象,不再是由ECMAScript提供的,而是由浏览器提供的一种方法表示或者操作HTML或XML

JavaScript 有三种对象:

  1. 本地对象(Native Object):Object、Function 、Array、String、Number、Boolean、Error、EvalError、SyntaxError、RangeError、ReferenceError、TypeError、 URIError、Date、RegExp
  2. 内置对象(Built-in Objecy): Global、Math
  3. 宿主对象(Host Object):执行JS脚本的环境提供的对象,又称浏览器对象

注: 本地对象和内置对象都是ECMAScript的内部对象,宿主对象因为浏览器的不同,所以就出现了兼容性的问题。

document对象

获取元素的方法都继承与Document的原型上

  • document.getElementById() 获取的是单个元素
  • document.getElementsByTagName() 获取的是一个集合(类数组)
  • document.getElementsByClassName() 获取的是一个集合(类数组)兼容性:IE8及以下没有该方法
  • querySelector() 如果有相同的元素,获取的是第一个元素
  • querySelectorAll() 获取的是一个集合(类数组)

注: querySelector 与 querySelectorAll 有性能方面的问题且不实时。性能方面的问题不好展示,下面我用代码来演示这个方法不实时的问题。

index.html

<div>1</div>
<div>2</div>
<div>3</div>

index.js

var divs = document.querySelectorAll('div');
console.log(divs);
divs[0].remove();
console.log(divs);

     第二次打印还是会打印出三个div。

节点树

         节点                           节点号(nodeType)

  • 元素节点                     -> 1
  • 属性节点                     -> 2
  • 文本节点                     -> 3
  • 注释节点                     -> 8
  • document                  -> 9
  • DocumentFragment  -> 11

parentNode         获取父节点

childNodes          获取子节点集合

firstChild              获取第一个子节点

lastChild               获取最后一个子节点

nextSibling           获取下一个同级节点

previousSibling    获取上一个同级节点

hasChildNodes()   返回一个布尔值,判断是否有子节点

元素树

parentElement                 获取父元素                      IE9及以下不支持

children                            获取子元素集合               IE7及以下不支持

firstElementChild             获取第一个子元素            IE9及以下不支持

lastElementChild              获取最后一个子元素        IE9及以下不支持

nextElementSibling          获取下一个同级元素        IE9及以下不支持

previousElementSibling    获取上一个同级元素       IE9及以下不支持 

我们发现childNodes兼容性要比children好,但是childNodes会获取到所有的子节点,而children只会获取所有的子元素。我们可以通过nodeType属性来封装一个children功能的方法。

function elemChildren (node) {
  var arr = [],
      children = node.childNodes; // 类数组 所有的子节点集合

  for (var i = 0; i < children.length; i++) {
    var item = children[i];
    if (item.nodeType === 1) { //nodeType === 1 的为元素节点 
      arr.push(item); // 将元素节点push到数组中
    }
  }
  return arr; 
}