jQuery1.3 リリース
2009年1月14日に、jQuery 1.3がリリースされました。
主な変更点を、以下に挙げます。
概要
セレクターエンジンをSizzleに変更
jQueryのCSSセレクターエンジンが、Sizzleと呼ばれる新たなものに変更されました。このエンジンはjQueryの生みの親であるJohn Resig氏が別に進めていたプロジェクトで、他のJavascriptライブラリでも利用されるように汎用的な設計がされています。以前よりjQueryのエンジンをこれに差し替えるモジュールは公開されていましたが、今回ついに正式に差し換わることになったようです。
Sizzleの目指す姿が、次のように端的に語られています。
- 最速
- 拡張可能
- スタンドアロン
ベンチマークの結果、SizzleはjQuery1.2.6のものと比べても倍以上の性能を示しています。("Selector Testst"参照)
これ以外に挙げられている「拡張性」や「独立性」についても、Dojo、prototype.js、Yahoo UI、MochiKit、TinyMCEなど他のエンジンとの互換、共同開発、搭載が進んでいる現在、その優位性は証明されてきています。
最近ではJames Donaghue氏のPeppyが「Sizzleよりも速い」と豪語していますが、現在の影響力で言えばSizzleがデファクトになっていきそうです。
Live Events 実装
"live events"と呼ばれる、新たなイベントハンドリング処理が実装されました。(具体的には live および die 参照)
従来のイベントは、リスナー登録処理が実行された際にマッチする要素にbindされるものでしたが、live eventsではdocumentが全てのイベントを監視し、イベント発生時に始めて登録されたセレクターと合致するかどうかを判別してリスナーを実行する形を取っているようです。
これにより、例えばAJAXで動的に要素が追加されるような場合にも、その都度イベントを登録する必要がなくなりました。
$p("div[class=item]").live("click", function(){ // 新たに追加された要素のクラスに.itemが含まれるようにすれば、 // 将来的にもそのような要素が足されてもイベントは動作する });また、このことにより、ページ内に大量の要素が入る場合にも全ての要素にリスナー登録を行う必要が無いので、処理速度の向上が望めます。
Sizzleによるセレクターエンジンそのものの高速化と併せて、ベンチマークでは従来の30倍近い数値を出しています。("Delegation Filtering Tests"参照)
単純な性能向上ではなく、ライブラリを使う我々側の技術が必要ではありますが、大きな恩恵が与えられそうです。
これらの機能は以前よりliveQueryプラグインなどで実装可能でしたが、今回変更を加えて本体に組み込まれました。
これは一部には、reglibにより示されたjQueryへの問題提起への回答にもなっているのかもしれません。
jQuery Event Object 実装
今回、イベント処理のモデルが大きく変わりました。従来は行われなかったbubbling処理が行われるようになるなど、W3C勧告に従ったモデルなっています。
これらにあわせて、jQuery.Eventオブジェクトが一新されています。
よりブラウザ間での処理の違いを意識せずに操作可能なW3C標準モデルのオブジェクトが実装されました。
HTML操作系処理の一新
要素の追加、置き換え、削除などのHTML操作系処理が、全て一から書き直されたようです。リリースノートによると「非常に一般的なボトルネックを発見した」とのことですが、どういったものなのかは詳しく読んでみないとわかりません。
しかし、このことの解決によって総じて従来の6倍くらいのパフォーマンスが出せるようになったとのことです。("DOM Manipulation Tests"参照)
Offset取得処理の一新
要素の位置を取得するoffset関数が、一から書き直されました。これはブラウザ間の挙動の違いなどの動作に関するものではなく、単純に処理速度向上のための変更です。
おおよそ3倍の性能向上があったとのことです。(".offset() Tests"参照)
ブラウザによる挙動の違いを一括取得
Javascript開発者を悩ませる問題ですが、以前のjQuery.boxModelのように各論で調べるのではなく、極めて根幹レベルの幾つかの挙動の違いをひとつにまとめたjQuery.supportが実装されました。これまで、この問題を解決するにはjQuery.browserが用いられてきました。これにより「このブラウザであれば、こういった挙動をするはずなので、このような特殊処理が必要」というロジックを書いてきましたが、今回の変更で最初の「このブラウザであれば、こういった挙動」の部分が不要になることになります。
そのためjQuery.browserは"deprecate"ということになりますが、多くのプラグインで使われている機能であるために、これを削除することは考えていないようです。
更新
今回のバージョンアップで必要になるかもしれない変更点を、簡単に列挙します。- セレクターの属性指定に"@"が使えなくなりました。これまで[@attr]という記述をしていた場合、これを[attr]としてやる必要があります。
- イベントにbubblingが行われるようになりました。これにより従来起きなかったタイミングでイベントが発生する可能性があります。それを避けるためには、イベント内で発生要素が自分自身であるかをテストしてやります。
- jQuery.ready()関数が、CSSのロードを待つ保証が無くなりました。CSSが取得されてからでないと実行したくない処理がある場合、必ずscriptタグよりも前にCSSを取り込むようにする必要があります。
- isFunction関数が単純化され、パフォーマンスが向上しました。これにより、一部の特殊なケースでの判別結果が変わったようですが、詳しくはわかりません。
- "a, b, c"というスタイルのセレクター書式でのオブジェクトの戻り順が変わります。これはブラウザでの実装が変わったためで、近い将来のバージョンではセレクターの指定順にかかわらず、DOM上の登場順にオブジェクトが返る形に統一される予定です。
- triggerやtriggerHandlerで呼び出された関数が、Eventオブジェクトを渡されることが無くなりました。代わりに、data配列に直接指定してやる必要があります。
- triggerやtriggerHandlerにあった、ドキュメントには無い隠し拡張関数が無くなりました。
- 内部的な処理として、jQuery.event.trigger関数が最後のハンドラによって返された戻り値を返す仕様が無くなりました。代わりに、true/falseによる単純判定値が返ります。値の確認をしたい場合は、新たにjQuery.Eventを参照します。
- ページがstandards modeで書かれている必要があります。quirks modeでは幾つかの問題が発見されています。
- 次の関数はもう使わず、jQuery.supportを用いる必要があります。但し、これらの関数が無くなってしまうわけではなく、非推奨扱いになります。
- Safari2は、非対応ブラウザとなります。
その他の変更点
この他にも幾つかの変更点がありますが、長くなったので割愛します。興味があれば、本家サイトのリリースノートを参照して下さい。