CSSセレクタの最大の欠点(Contextual Selector)はサポート可能か
id:vantguarde さんと、id:amachang さんが半年ぐらい前に
http://web.g.hatena.ne.jp/vantguarde/20081030/1225341506
さてさて、ひとつ残念なのが“Contextual Selector”という擬似クラスが結局導入されなかったこと。
今のSelectors APIでは、「コンテキストの子要素であるdiv」みたいなクエリをかけることができません。どういうことかは、「CSS Selector の最大の欠点」を読むとわかるかなと。
これについてはJohn Resigも“Thoughs on querySelectorAll”で書いていて、WebApps WG(当時はWebAPI WG)にコメントを投げたりしています。
WGもそれは認識していたようで、その結果提案されたのがContextual Selectorでした。これを使うと「querySelectorAll(":scope > div")」みたく書けるわけで、その後一部の人*1の気を引いていたんですが、このたび却下になりました。
http://d.hatena.ne.jp/amachang/20080602/1212384078
// 以下のようなことができない
elm.querySelectorAll('> div');
elm.querySelectorAll('+ div');
elm.querySelectorAll('~ div');
って書かれてたのを、ふと思い出しました。
:scope pseudo-class は実装してないけど、uu.css.querySelectorAll を一行入れ替えると、amachangさんのやりたい構文を理解するように調教できたりもする。
uu.css.querySelectorAll = function(expr, context, really) { var _contentType, _tags, _ie = uu.ua.ie, // alias // --- double registration guard --- uuid, // unique-id guard = {}, // global guard unq = {}, // local guard mixed = 0, // 1: mixed // --- result and context elements --- rv = [], ri, r, - ctx = [context], + ctx = context.length ? context : [context],
<html><head><script src="uupaa.debug.js"></script></head><body> <div>--div-- <ul> <li>The background of this list item should be green</li> <li>The background of this list item should be green</li> </ul> </div> <div>--div-- <ul> <li>The background of this list item should be green</li> <li>The background of this list item should be green</li> </ul> </div> <script> function boot() { uu.css(">ul>li", uu.tag("div")).forEach(function(v) { v.style.backgroundColor = "lime"; }); } </script></body></html>
Contextual Selector って、こういうイメージでいいのかな?
# 仕様はこれから読みます
vantguarde さんにブクマでコメントいただきました
querySelector系にはvalidなselectorを渡さないといけないので、「> element」とか構文的に不正なものは書けないんですよね。そのための疑似クラスだったりします。
なるほど。なるほど。この擬似クラスが仕様落ちしたのは、ちょっともったいないですね。