DOM 遍历是对 DOM 结构的深度优先遍历,至少允许朝两个方向移动(取决于类型)。遍历以给定节点为根,不能在 DOM 中向上超越这个根节点。以 document 为根节点的遍历,则可以访问到文档中的所有节点,以 document 为根节点的深度优先遍历。
NodeIterator 和 TreeWalker 都以这种方式进行遍历。
NodeIterator
https://developer.mozilla.org/zh-CN/docs/Web/API/Document/createNodeIterator
创建
通过 document.createNodeIterator(root, whatToShow, filter) 方法创建实例
参数
- root 作为遍历根节点的节点
- whatToShow 数值代码,表示应该访问哪些节点
- NodeFilter.SHOW_ALL 所有节点
- NodeFilter.SHOW_ELEMENT,元素节点。
- NodeFilter.SHOW_ATTRIBUTE,属性节点。由于 DOM 的结构,因此实际上用不上。
- NodeFilter.SHOW_TEXT,文本节点。
- NodeFilter.SHOW_CDATA_SECTION,CData 区块节点。不是在 HTML 页面中使用的。
- NodeFilter.SHOW_ENTITY_REFERENCE,实体引用节点。不是在 HTML 页面中使用的。
- NodeFilter.SHOW_ENTITY,实体节点。不是在 HTML 页面中使用的。
- NodeFilter.SHOW_PROCESSING_INSTRUCTION,处理指令节点。不是在 HTML 页面中使用的。
- NodeFilter.SHOW_COMMENT,注释节点。
- NodeFilter.SHOW_DOCUMENT,文档节点。
- NodeFilter.SHOW_DOCUMENT_TYPE,文档类型节点。
- NodeFilter.SHOW_DOCUMENT_FRAGMENT,文档片段节点。不是在 HTML 页面中使用的。
- NodeFilter.SHOW_NOTATION,记号节点。不是在 HTML 页面中使用的。
filter NodeFilter 对象或函数,表示是否接收或路过特定节点
nextNode()
- 以深度优先方式前进一步
- 返回
- 第一次调用返回根节点
- 在最后一个节点返回null
- previousNode()
- 遍历后退一步
- 返回
- 在根节点后返回null
nextNode() 和 previousNode() 方法共同维护 NodeIterator 对 DOM 结构的内部指针,因此修改 DOM 结构也会体现在遍历中。
TreeWalker
https://developer.mozilla.org/zh-CN/docs/Web/API/Document/createTreeWalker
TreeWalker为NodeIterator的高级版。
创建
docuement.createTreeWalker(root, whatToShow, filter)
接收参数与NodeIterator相同
遍历
除了nextNode()、perviousNode()方法,还有在DOM结构中向不同方向遍历的方法。
- parentNode() 遍历到当前节点的父节点
- firstChild() 遍历到当前节点的第一个子节点
- lastChild() 遍历到当前节点的最后一个子节点
- nextSibling() 遍历到当前节点的下一个同胞节点
- previousSibling() 遍历到当前节点的上一个同胞节点