浏览器环境

DOM树
DOM树总共有12种节点类型,实践中一般主要操作其中的4种:
- document节点,访问DOM的入口节点
- element节点,HTML元素
- text节点,包含文本内容
- 注释节点,可以读取注释内容
访问DOM树
DOM树的结构如图所示,可以通过图中的那些引用变量访问DOM树节点:

如果仅仅想访问DOM树中的HTML元素,而不想看到其他的乱七八糟的节点,则如下图所示:

其中,childrenNodes和children都是Collection而不是Array,所以可以通过for.。.of迭代访问,而不能使用.filter(…)这种方法。
DOM树是只读的,不能直接用赋值修改DOM树节点。
搜索DOM树
主要有六种方法可以在DOM树中搜索需要的节点:
| Method | Searches by… | Can call on an element? | Live? | 
|---|---|---|---|
| getElementById | id | - | - | 
| getElementsByName | name | - | ✔ | 
| getElementsByTagName | tag or ‘*’ | ✔ | ✔ | 
| getElementsByClassName | class | ✔ | ✔ | 
| querySelector | CSS-selector | ✔ | - | 
| querySelectorAll | CSS-selector | ✔ | - | 
另外,还有
- elem.matches(css)用于检查elem元素是否匹配css这个选择器
- elem.closest(css)用于寻找匹配css选择器的距离elem最近的祖先
- elemA.contains(elemB)用于检查elemA是否包含elemB
DOM节点类
每一种DOM节点都是一个DOM节点类的实例,DOM节点类的继承树如下图所示:

- Node是所有DOM节点的基类,里面提供了诸如parentNode、nextSibling、childNodes这种getter方法
- HTMLElement是所有HTML元素的基类,各种不同种类的HTML元素都继承了这个基类
要获取node的类型,有很多种方法,比如:
- elem.nodeType,返回一个数字,标记了node的类型
- elem.nodeName/elem.tagname,返回字符串
修改DOM树
innerHTML
可以通过对innerHTML进行修改来修改HTML元素的内容,如下例:
| 1 | <body> | 
outerHTML
可以通过对元素的outerHTML进行替换来替换整个HTML元素,如下例:
| 1 | <div>Hello, world!</div> | 
div.outerHTML仍保持了原先HTML元素内容的引用,但这个元素原先所在的HTML文档的位置被替换成了新的HTML元素。
