Hatena::ブログ(Diary)

cnrdの日記

2008-11-24

「NodeListがliveなものを返すってDOM3 Coreのバグじゃね?」と言われているのはなんで?

| 23:47

querySelectorAllがliveじゃないNodeList返すのはなんで? - vantguarde - web:gからの話なのですが、気になったので調べています。

今のところ「NodeListがliveなものを返すってDOM3 Coreのバグじゃね?」と言われている理由の予想としてはこんな感じかな、と思います。

  • liveで嬉しいことがあまりないこと*1
  • 実装にかかる時間(実装者の問題)
  • 処理速度(実装者、スクリプト作成者、ユーザーの問題)
  • 繰り返し構文+インデックスアクセスでのDOM木への追加または削除のケース等で混乱を招きやすい(スクリプト作成者の問題)
  • 仕様に使いにくい(策定者の問題)

仕様に使いにくいというのは、今のNodeListは「DOM木の変更によって自動更新されるNodeの文書順リスト」*2なので単に「Nodeの(文書順)リスト」として使いたい仕様の場合(例えば高度な検索条件を指定して結果をリストとして返すような仕様の場合、主に軽量機器向けの仕様の場合)、NodeListを敬遠せざるを得ないということです。もし単に「Nodeの(文書順)リスト」というだけであればDOM XPathはもう少し不細工でないように出来たんじゃないかと思います(Element Traversalなんかも?)。

Selectors APIquerySelectorAll()のNodeListをliveにする場合は、擬似クラス(特に:hover:active)のことを考えると最悪「DOM木の変更とユーザーアクション(ポインティングデバイスの移動等)によって自動更新されるNodeの文書順リスト」になってしまって、スクリプト作成者にさらなる混乱を与えることになるかもしれません。また、CSS3セレクタXPathには及びませんが、さまざまなセレクタやグループ化によって十分に複雑な検索が可能ですから速度的な面も心配です。

このままだと今後NodeListを嫌った高レイヤーの仕様が軒並み不細工になっていくおそれがあるので、今後のことを考えるとNodeList自体をデフォルトをstaticにしてオプションでliveにした方が良いような感じがします。

メモ*3

バグ発言関連
Element Traversal, SVG Tiny 1.2

*1:liveで嬉しいことをどなたかいろいろ教えていただけると嬉しいです。自分としては「過去の慣習」、「getElementsByTagName()等の呼び出しが一回ですむ」、「childNodesを親Nodeから切り離しても切り離さなくても同じように扱える」くらいのものしか思いつきませんでした

*2http://www.w3.org/TR/DOM-Level-3-Core/core.html#td-live等。あれ、ordered listsとはあるけどdocument order云々とは書いてないんですね。文書順じゃない順序つきのNodeListって何かあったかな…

*3:偏向有

TT 2009/01/18 03:25 巨大なデータを想定した場合、リストを作るよりもイテレータで回した方が時間も資源も節約できるからではないですか。NodeList の実態が(DOM2Traveral で言うところの)NodeIterator であるならば、必然的に live になります。だからこそ、子の有無を調べるのに childNodes.length を見るな hasChildNodes() を使え、と言われてきたわけで。

実際、Selectors API を NodeIterator として実装するのは難しくありません(疑似要素を除く)。逆に、XPath のようにコンテキストサイズが必要ならリスト処理しなければなりません。

互換性を考えれば、StaticNodeList は良い案だと私は思っていたんですけどね。そのまま Array に言語束縛させれば良かったのに。

cnrdcnrd 2009/01/26 08:09 お返事遅れてごめんなさい。あんまりコメント貰えることがないので嬉しいです。

「巨大なデータを想定した場合、リストを作るよりもイテレータで回した方が時間も資源も節約できる」のは一般的にそうだと思いますが、それとNodeListの関連性、また「NodeListの実態がNodeIteratorとする(ならば)〜」とする理由がわかりませんでした。hasChildNodes()もNodeの持ち物ですし。もう少し詳しく教えて頂けると嬉しいです。

StaticNodeListは前方互換性を考えたとき、私も良い案だと思います。あとはJavaScriptだとNodeListに「liveでない」かを判別できる属性を持たせるのもありかなーなんて思いました(未対応の実装はその属性にアクセスしてもundefindになるので)。

トラックバック - http://d.hatena.ne.jp/cnrd/20081124/1227538035
プロフィール
Connection: close