[アンディの優れた回答に対する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()
、次のように適応する必要があります。
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]);
}
そうすれば、気に入らないタグが見つかった場合、そのタグとそのすべての子をスキップするだけで、エクストラクタがそのようなタグ内のテキスト ノードに公開されることはありません。