ユーザースクリプト用に書いた
"use strict"; (function () { function walkDOM(node, callback) { if (node === null) return; callback(node); walkDOM(node.firstChild, callback); walkDOM(node.nextSibling, callback); } function getElementsByText(text) { var set = new Set(); walkDOM(this, function (node) { if (node.nodeType !== 3) return; if (node.nodeValue.indexOf(text) === -1) return; set.add(node.parentNode); }); var ret = []; set.forEach(function (value) { ret.push(value); }); return ret.length === 0 ? null : ret; } document.getElementsByText = getElementsByText; Element.prototype.getElementsByText = getElementsByText; })();
使い方はこのスクリプトを読み込んで、document.getElementsByText(text)を実行するかElement.getElementsByText(text)を実行する。
引数のtextが含まれている親のエレメント達が配列で返ってくる。何もなければnullを返す。
GitHubに例を載せている。
再帰を使っているためスタックオーバーフローする可能性がある。
document.evaluateでXPathを使ったほうが早い。
あくまでもユーザースクリプト用に書いてみた。