[在阅读了 OP 对安迪出色答案的评论后添加了答案]
问题是您会看到元素内部的文本节点,其内容通常不会由浏览器呈现 - 例如 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]);
}
这样,如果我们看到您不喜欢的标签,我们只需跳过它及其所有子节点,您的提取器将永远不会暴露于此类标签内的文本节点。