一定文字数以上のテキストノードを取得する
body以下の6文字以上のテキストノードだけ取得したいというケースがあって、XPathでけっこう簡単にできた。
var xpath = '//text()[string-length(normalize-space()) > 5 and not(ancestor::script)]'; var resultType = XPathResult.ORDERED_NODE_SNAPSHOT_TYPE; var nodes = document.evaluate(xpath, document.body, null, resultType, null); var strs = []; for (var i = 0, l = nodes.snapshotLength; i < l; i++) { strs.push(nodes.snapshotItem(i).nodeValue); }
- text()でテキストノードの取得
- normalize-space()で空白を取り除く
- string-length() > 5 で6文字以上のテキスト(日本語も正常に動いた)
- script要素内も含まれるのでnot(ancestor::script)でscript要素を除外
とかしてる。ちなみにresultTypeは4〜7でベンチとってみたけど大差なかった。イテレータよりスナップショットのほうがやや早い程度。