document.getElementsByText()

ユーザースクリプト用に書いた

"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を使ったほうが早い。

あくまでもユーザースクリプト用に書いてみた。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です