Hatena::Groupweb

vantguarde

 | 

11.14

querySelectorAllがliveじゃないNodeList返すのはなんで?

23:36

タイトルの通りなので、知ってたら誰か解説してください。

というわけで以下は蛇足。

Editor’s DraftをあさってたらSelectors APIのLCをみつけました。フライング。

で、前から気になってたことがあるんですよね。

StaticNodeListは、「新しいインターフェース作るより『ただしnot liveに限る』って書いたほうがいいよね」→「ってかNodeListがliveなものを返すってDOM3 Coreのバグじゃね?」みたいな流れでなくなりました[要出典]

Selectors APIがLast Callへ

これこれ。自分で要出典にしておきながらその後調べてなかったのでちょっと調べてみました。

>> Regarding the returning a StaticNodeList, the implementation in Safari  
>> returns an object that implements the StaticNodeList interface, though  
>> that happens to be the same as the NodeList interface.  One potential  
>> issue here is that we don't expose a StaticNodeList constructor on the  
>> window (window.StaticNodeList) but instead use the NodeList's  
>> constructor.
>
> Given that, I believe it would be better if the spec was more honest  
> about this issue by simply stating that an object implementing the  
> NodeList interface is returned, but that the list is not live.  I will  
> consider making that change soon.
 
Yeah, we should drop StaticNodeList and add a note that DOM Level 3 Core  
saying NodeList is "live" is a bug.
Re: [selectors-api

これが「バグじゃね」発言のソースですね。読んでみるとなんとなく、Safariの内部実装がcNodeListでもStaticNodeListでも変わらないので、liveじゃないNodeListにしたという風にも読めますね。ただ、それがDOM3 Coreのバグなのかどうかに繋がらないです。

で、もっというとそもそもなんでStaticNodeListなんでしょうか。たとえばgetElementsByClassNameなんかはliveなNodeListを返すと定義されてます。引数がclassとセレクタじゃまあ違うでしょうが、でもそれがliveかstaticかを決めるほど大きなものなのかなあと。

過去のドラフトも見てみたんですが、最初のドラフトからStaticNodeListなんですね。ということはそういう想定だったんでしょうか。

まあ、今のドラフトでは件のコメントが反映され、「liveじゃないNodeList」とされています*1。むー、しかし解せません。

と思ったら、なんだかユースケースの問題?

The use cases for applying the selector apis to NodeLists aren't yet 
clear.  I have not added the feature to this version of the spec, but it 
could be something worth considering in the future.
Re: getElementsBySelectoron all NodeLists

ふむふむ。level 2では入るかもしれないって事ですね。そうなるとNodeListを(liveではなくても)返す定義の方が拡張しやすいかも。

ここら辺のAPIは足並みを合わせて欲しいので、liveがいいなあとなんとなく思ってます。

しかし、となるとDOM3 Coreのバグ発言がよくわからなくなります。うーん。。

まあstaticなことは変わりないので、liveなNodeListが欲しい方はliveなquerySelectorAll - 素人がプログラミングを勉強するブログあたりを利用するといいのかもしれません。

cnrdcnrd2008/11/19 03:55> querySelectorAllがliveじゃないNodeList返すのはなんで?
:hoverなんかの扱いでliveにするのが難しい、というようなことを誰か(…http://annevankesteren.nl/2006/04/selectors-api#comment-5267のanneでした)が言っていたのを昔見て納得した記憶があります。。

uupaauupaa2008/11/20 22:31こんにちは。
liveはDOMツリーをキョロキョロしますが、not liveはしません。
DOMアクセス回数を減らすための方策だと思います。

vantguardevantguarde2008/11/21 22:37わー、ちょっと見ない間にコメントが。ありがとうございます。

> :hoverなんかの扱いでliveにするのが難しい
> DOMアクセス回数を減らすための方策

やっぱりここら辺なんですかね。もうすこし技術的に不可能とかそういうのかなと思いこんでたので、少し拍子抜けな感じもしてます。

しかしやっぱりDOM3 Coreのバグっていう意味は不明なまま。。あまり気にしないことにしよう。。

 | 
Contact: @vant / lepetitcroissant@gmail.com.