Opera と Firefox3.1で DOM Element Traversal Module が使える

指摘を受けて、記事を修正しています。
document.implementation.hasFeature("Traversal", "2.0"); が true を返す環境なら Element Traversalが使えるhasFeature("Traversal") では Element Traversal が実装されていることは確認できない。

DOM Element Traversal Module ってなーに?
これ。
http://www.w3.org/TR/2008/CR-ElementTraversal-20080813/

document.implementation.hasFeature("Traversal", "2.0"); が true を返す環境(Opera9+, Firefox3.1)なら、Nodeに以下の属性が追加されています。
document.implementation.hasFeature("Traversal")は、Document Object Model Traversalについて調べる方法であり、名前が似ているだけで、 Element Traversal とは無関係。
hasFeatureではElement Traversalが利用可能かを調べられない。
Opera9+, Firefox3.1には、Nodeに以下の属性が追加されています。

  • Node.firstElementChild - nodeType == 1 の最初の子要素。無ければnull
  • Node.lastElementChild - nodeType == 1 の最後の子要素。無ければnull
  • Node.previousElementSibling - nodeType == 1 の兄貴。無ければnull
  • Node.nextElementSibling - nodeType == 1 の弟。無ければnull
  • Node.childElementCount - nodeType == 1 の子供の数。無ければ0

これらを使うと、ノードの探索(CSSセレクタ)が早くなります(たぶんね)。
早くなる理由は、コメントノードとかテキストノードを読み飛ばすループが簡略化するからです。

たとえば、div:first-child を求める処理が

// 現在のノードより上方(兄貴たち)を検索し、ELEMENT_NODE(1) が一つもなければ e が first-child
function firstChild(e) {
  var f = 0, c;
  for(c = e.previousSibling; c; c = c.previousSibling) {
    if (c.nodeType === 1) { // ELEMENT_NODEがあればループを中断しフラグを立てる
      ++f;
      break;
    }
  }
  return !f; // 兄貴が一人もいなければ条件成立
}

previousElementSibling を使うとこう書けるようになるってことらしいです。

function firstChild(e) {
  return !e.previousElementSibling; // 兄貴が一人もいなければ条件成立
}

ちょっとワクワクしますね。

さっそく実装してみた

uupaa-selector.js を ちょこっといじって実装完了。
さぁ速度を測って…… ってあれ?

Apache 入ってないのを忘れてた。
Vista Home って Apache 使う上でなんか問題があって、入れるの止めてた気がする。
何が問題だったのかは、思い出せないけど。

んじゃ、いつものところにUPして……ぁぁぁぁぁ?
SourceForge.jpSSH秘密鍵ごと、工場に逝っちゃってる。
鍵は作り直してもいいけど、VistaPutty とか FileZilla とかすんなり入るのか?

あきらめた

開発用のノートPCが修理から戻ってきたら、速度を測って、速くなっているようだったら、uupaa-selector.js の ver 1.5 をリリースすることにします。

やれやれ。