読者です 読者をやめる 読者になる 読者になる

素人がプログラミングを勉強していたブログ

プログラミング、セキュリティ、英語、Webなどのブログ since 2008

連絡先: すかいぷ:javascripter_  か javascripter あっと tsukkun.net skypeのほうがいいです

NodeItearatorを使う

javascript

NodeIteratorは、TreeWalkerのショボい版のような物で、Nodeを辿っていける。ただ、絞り込む条件として、要素や属性、テキストノードなどしか指定できないので、関数呼び出しが増えて、XPathと組み併せる場合と比べると総合的な速度が落ちる事が多い。

下のスクリプトは、入力した文字をハイライトするもの。
createNodeIteratorの第一引数に、基準となるノード、第二引数に条件、第三引数に関数もしくはnullで、第四引数は、あとで調べる。

function getElementsByText(parent, text){
  var nl = document.createNodeIterator(
    parent,
    NodeFilter.SHOW_ELEMENT,
    function(elem)
      !elem.childElementCount && ~elem.textContent.indexOf(text)
        ? NodeFilter.FILTER_ACCEPT
        : NodeFilter.FILTER_REJECT,
    false),
  ret = [];
  while(nl.nextNode())
    ret.push(nl.referenceNode);
  nl.detach();
  return ret;
}

getElementsByText(document.body, prompt())
  .forEach(function(elem){
    elem.style.backgroundColor = "yellow";
  });

参考:132824 – Implement NodeIterator object of Traversal API
Document Object Model Traversal