uupaa-selector.js version 1.1 をリリースしました。

uupaa-cssselector.js を改名し、機能を大幅に強化したものを uupaa-selector.js としてリリースし直しました。

2008-10-11追記: uupaa-selector.js version 1.2 をリリースしました。 - latest log


uupaa.js(ver 0.7)の実装をベースに、

  1. getElementById()
  2. getElementsByTagName()
  3. getElementsByClassName()
  4. getElementsBySelector()

クロスブラウザな実装一式と、

  1. Arrayのイテレータ(forEach, filter, some, every, map)
  2. ブラウザ判別コード

等をギュギュッと詰め込んだ 福袋仕様 です。

サポートブラウザは、Gecko系, WebKit系, Opera9系 と IE6+です。

社内専用ライブラリの開発担当者や、これからJavaScriptを使ったWebサイトを構築する方などには、特にお勧めです。

uupaa-selector.js の 特徴

  • :link, :visited, :hover, :focus が使えます。
  • :before, :after, :first-letter, :first-line は、WebKitの querySelectorAll() 互換です(擬似要素ではなく実在するDOM要素を返す。つまり div>div::after なら div>div を返す)。
  • CSSセレクタよりも高速かつ少ないリソースで動作する専用セレクタ(ID, Tag, Class)も用意しています。
  • コードを圧縮した状態で約15kB, zipの状態で 約4.8kBと、とてもコンパクトです。
    • さらにサイズを絞ったLite版もあるので、iPhone のようなモバイル環境でも、安心してご利用になれます。

CSSセレクタの精度

CSS3.infoのテストケースをベースにした独自のテストにおいて、CSSセレクタは以下のスコアをたたき出します。

IE6 579/582 99.5%
IE7 579/582 99.5%
IE8β2 577/582 99.1%
Firefox2 582/582 100%
Firefox3 582/582 100%
Chrome 582/582 100%
Safari3.1 582/582 100%
Opera9.27 575/582 98.8%
Opera9.6β 582/582 100%
CSSセレクタの制限事項

通常使用ではほとんど問題になりませんが、一部ブラウザのバグ等で回避できない問題がいくつか存在します。

  • :not は簡易実装。CSSセレクタの仕様の一部( ":not(*)", ":not(.class)", ":not(#id)" )のみサポート。
  • Opera9.2xで、E[attribute=value] と E[attribute$=value] に一部問題がある(Opera要因)
<div align='leftorright'></div>
<div align='rightleft'></div>
<div align=' left '></div>
これらdiv要素に、uu.css("div[align=left]") がマッチしてしまう。

<div align='leftright'></div>
<div align='left right'></div>
<div align='left-right'></div>
<div align=' left '></div>
これらdiv要素に uu.css("div[align$=left]") がマッチしてしまう。
  • IEで E[attribute] に一部問題がある(IEにhasAttributeが実装されていないため。IE要因)
<div align></div> や <div align=''></div> に uu.css("div[align]") がマッチしない。
  • IEで :empty に一部問題がある(IEはコメントノードや, 改行だけ/空行だけのテキストノードをDOMツリーに保持しないため。IE要因)
<div> </div> に uu.css("div:empty") がマッチしてしまう。

Lite版

モバイル用途を意識して、機能の限定とダウンサイジングを行ったLite版を同梱しています。

  • 非常にコンパクト。コード圧縮版(uupaa-selector.lite.mini.js)で 10kB, zip圧縮版で 3.5kB。
  • CSSセレクタの検索速度が犠牲になっています(IE6では、jQueryとほぼ同じ速度になります)
  • :visited, :hover, :focus は使えません。:linkは使えますが未訪問/訪問済みを区別しません。
  • 配列のイテレータは、Array.prototype.forEach のみご利用になれます。

使用例 - リストの背景色をゼブラカラー[シマシマ]にする

まず、セレクタを以下から選択します。

// 使用可能なセレクタ一覧
window.IDSelector    = uu.id;    // getElementById()相当
window.TagSelector   = uu.tag;   // getElementsByTagName()相当
window.ClassSelector = uu.klass; // getElementsByClassName()相当
window.CSSSelector   = uu.css;   // getElementsBySelector()相当

リストを交互に着色するようなケースでは CSSセレクタ(uu.css) の :nth-child() が適任です。

このようなHTML + JavaScriptを用意します。

<html>
<head><title>test</title>
<script src="uupaa-selector.mini.js"></script>
</head>
<body>
<div>
 <ul>
  <li>list1</li>
  <li>list2</li>
  <li>list3</li>
  <li>list4</li>
  <li>list5</li>
  <li>list6</li>
 </ul>
</div>
<script>
window.onload = function() {
  uu.css("div ul>li:nth-child(even)").forEach(function(v) { // リスト要素を1つ飛びで選択し
   v.style.backgroundColor = "silver"; // 背景色をシルバーに
  });
}
</script>
</body>
</html>

実行すると、このようになります。

とっても簡単ですね!

上から5つだけを着色したい場合は、:nth-child(even) を :nth-child(-n+5) にしてください。

uu.css("div ul>li:nth-child(-n+5)")

参考リンク

最後に

賛同していただける方は、一言コメントを残していただくか、はてなスターをポチッとしていただけるとうれしいです。

# 「jQueryがあればいいや」的なムードが漂っているので、ニーズが有るのか無いのかいまいち不明です。何か指標が欲しいのです。