2008年12月13日土曜日

jquery + jquery-sizzle.js のセレクタの違い(1)

sizzle については 「高速な CSS セレクタエンジン「Sizzle」「Peppy」を試す 」 を参考にさせてもらいjquery用に作成。


一部のプラグインがどうしても動かないので、セレクタ内部を調査してみた。

jQuery の 標準のセレクタの attribute 部分の正規表現

1441行目 /^(\[) *@?([\w-]+) *([!*$^~=]*) *('?"?)(.*?)\4 *\]/

sizzle の attribute 部分の正規表現

267行目 ATTR: /\[((?:[\w\u0128-\uFFFF_-]|\\.)+)\s*(?:(\S{0,1}=)\s*(['"]*)(.*?)\3|)\]/

見た目からして違っているが、最初に気づく違いは @? の部分

jquery の場合 $('a[@href]') のようにかけるけど
sizzle で同じように書くと例外が発生する。sizzle の場合 $('a[href]')であれば問題ない。

と言うわけで、 対象プラグインの @href を href に変更し動くようになった。
sizzle側の正規表現の「 \[ 」の直後に 「 @? 」 と追加しても動くようになるが、sizzle のバージョンアップ時に問題が出るのでお勧めできない。

と言うか、これは仕様なのかバグなのか・・・。

次回は jglycy が動かないのでその対応を考えようと思う。
そもそも html に存在しない属性は取れなくなってるような気がするけど。


追記

@ を使う書き方どこかでできたよなぁとなやんだけど、たぶんXPathかなという結論に
CSSで @はimportとかそのあたりくらいしか見つからなかった。