TreeWalker与NodeIterator之间存在哪些差异?
哈哈,这个问题问到点子上了!JavaScript里确实不乏看起来重复的API,这俩货绝对算典型,但它们真不是毫无区别的“孪生兄弟”,咱们好好掰扯掰扯:
遍历灵活度天差地别:
NodeIterator就像个认死理的路痴,只能在DOM树里做简单的前后直线遍历——靠nextNode()往前挪,previousNode()往后退,仅此而已;但TreeWalker就像个DOM树里的“自由行者”,能让你在树里各种穿梭:直接跳父节点、第一个子节点、下一个兄弟节点都不在话下,对应的方法有parentNode()、firstChild()、nextSibling()等等,复杂遍历场景下它能省超多事。节点过滤的精细度不同:虽然两者都能通过过滤器筛选要处理的节点,但
TreeWalker的过滤权限更高。它的过滤器不仅能决定要不要返回某个节点,还能控制要不要遍历这个节点的子树——比如你可以直接跳过某个节点的所有后代,不用白费力气去遍历;而NodeIterator做不到这一点,只要节点符合过滤条件就会返回,而且一定会继续遍历该节点的子树。当前节点的可控性不一样:
TreeWalker会明明白白记录你当前在DOM树里的位置,而且你还能通过currentNode属性直接修改这个位置——相当于你可以直接“瞬移”到树里的任意节点继续遍历;但NodeIterator的当前节点是隐式的,你没法直接改动,只能靠遍历方法一步步挪动。
至于为啥这俩API会同时存在?还真有历史缘由:它们是DOM Level 2规范里同期被加入的,当时就是为了覆盖不同的遍历需求——NodeIterator给简单遍历场景提供轻量、易上手的方案,TreeWalker给复杂遍历场景提供强大的工具支持。这么多年没被废弃,说明各自都有不可替代的受众,也就一直保留到现在啦!
备注:内容来源于stack exchange,提问作者dumbass

