Treewalker的NodeFilter.SHOW_TEXT文本提取及DOM解析范围的技术问询
问题解答
问题1:执行let allTextNodes = document.createTreeWalker(document.body, NodeFilter.SHOW_TEXT);无法获取这类自定义标签内文本的原因
- 核心原因是这类自定义元素的文本内容大概率存在于Shadow DOM中。
document.createTreeWalker默认只会遍历常规的主DOM树,而Shadow DOM是浏览器提供的DOM封装机制,内部节点默认对外不可见,外部的TreeWalker无法穿透访问。 - 以你提到的Crunchbase页面为例,
<field-formatter>是网站封装的自定义组件,会把要渲染的文本放在组件的Shadow Root内部,这部分不属于主DOM树的范畴,所以你的TreeWalker代码自然抓取不到这些文本。
问题2:document.createTreeWalker是否仅解析合法的DOM元素?
- 不是。
createTreeWalker可以遍历所有符合DOM规范的节点,包括:- 标准HTML元素(如
<div>、<p>) - 未注册的自定义标签(即便没通过
customElements.define注册,浏览器也会将其视为普通元素节点处理) - 已注册的自定义元素(只要它们的节点存在于主DOM树中)
- 标准HTML元素(如
- 需要注意:如果自定义元素使用了Shadow DOM,其内部节点不在主DOM树里,
createTreeWalker默认不会遍历这部分内容。如果要访问Shadow DOM内的节点,你需要先获取元素的shadowRoot(前提是Shadow DOM为开放模式),再针对shadowRoot创建TreeWalker进行遍历。
内容的提问来源于stack exchange,提问作者anjanesh
相关产品推荐
相关产品推荐

