[在阅读 OP 的 cmets 后添加的答案对 Andy 的出色回答]
问题是您会看到元素内部的文本节点,其内容通常不会被浏览器呈现 - 例如 STYLE 和 SCRIPT 标签。
当扫描 DOM 树时,我假设使用深度优先搜索,您的扫描应该跳过 此类标签的内容。
例如 - 递归深度优先 DOM 树遍历器可能如下所示:
function walker(domObject, extractorCallback) {
if (domObject == null) return; // fail fast
extractorCallback(domObject);
if (domObject.nodeType != Node.ELEMENT_NODE) return;
var childs = domObject.childNodes;
for (var i = 0; i < childs.length; i++)
walker(childs[i]);
}
var textvalue = "":
walker(document, function(node) {
if (node.nodeType == Node.TEXT_NODE)
textvalue += node.nodeValue;
});
在这种情况下,如果您的 walker 遇到您知道您不希望看到其内容的标签,您应该跳过进入树的那部分。所以walker() 必须这样调整:
var ignore = { "STYLE":0, "SCRIPT":0, "NOSCRIPT":0, "IFRAME":0, "OBJECT":0 }
function walker(domObject, extractorCallback) {
if (domObject == null) return; // fail fast
extractorCallback(domObject);
if (domObject.nodeType != Node.ELEMENT_NODE) return;
if (domObject.tagName in ignore) return; // <--- HERE
var childs = domObject.childNodes;
for (var i = 0; i < childs.length; i++)
walker(childs[i]);
}
这样,如果我们看到您不喜欢的标签,我们会简单地跳过它及其所有子节点,并且您的提取器将永远不会暴露给此类标签内的文本节点。