IE用にTreeWalker.js書いた

まずは、ぺたり。http://github.com/TakiTake/js/tree/master

使うと、何が嬉しいの?

IEでDOM Traversal関数が使えるので、DOMツリーの探索が容易になります。

XPathとどう違う?

XPathは、条件に合うノードをガッと一気に取ってきます。
TreeWalkerは、DOMツリーを移動しながらノードを取得するので必要なノードだけ取得するのに向いている。


ある要素に子ノードが100個あって、子ノードの50番から60番の間にある特定の子孫ノード取ってきたい!なんてときに使えるのではないかと。

使用例

// FILTER_ACCEPTされたノードがnextNodeととして返る
filter = {
  acceptNode: function (node) {
    // tという文字を含むテキストノードなら取得
    if (node.nodeValue.match(/t/))
      return NodeFilter.FILTER_ACCEPT;
    else
      return NodeFilter.FILTER_SKIP;
  }
};

treeWalker = document.createTreeWalker(
  document.body,        // 探索対象とする部分ノードの頂点
  NodeFilter.SHOW_TEXT, // テキストノードだけを探索する
  filter,               // ノード探索用フィルター(上記)
  false                 // 実体参照を展開しない
);

// bodyの50番目の子ノードから探索開始
treeWalker.currentNode = document.body.childNodes.item(50);

// nextNode関数を呼ぶ度にツリーを移動する。
// 移動先は、フィルターの条件に合うノードまで。
while (treeWalker.nextNode() != null) {
  // 現在のノードの親がbodyの61番目の子ノードなら探索終了
  if (treeWalker.currentNode.parentNode == document.body.childNodes.item(61))
    breake;

  console.log(treeWalker.currentNode);
}