Prototype 1.6.0 で大きく進化したイベント API
Prototype 1.6.0 RC にはいくつもの変更点がある。
特に イベント周りの API で顕著だ。Event.observe メソッドなど、お馴染みの API が大幅に手を加えられている。
Prototype 1.6.0 のブラウザ判定と iPhone
prototype.js には 1.5.1 から、各種ブラウザを判定するための Prototype.Browser が定義されている。
var Prototype = {
...
Browser: {
IE: !!(window.attachEvent && !window.opera),
Opera: !!window.opera,
WebKit: navigator.userAgent.indexOf('AppleWebKit/') > -1,
Gecko: navigator.userAgent.indexOf('Gecko') > -1 && navigator.userAgent.indexOf('KHTML') == -1,
...
使い方は一目瞭然だろう。
たとえば Internet Explorer の場合は Prototype.Browser.IE が、Safari など WebKit を利用しているブラウザでは Prototype.Browser.WebKit が true になる。
Prototype 1.6.0 RC での Prototype.Browser
そして、Prototype 1.6.0 RC では、ここに新しい定義が追加された。
Prototype 1.6.0 と DOMContentLoaded
Prototype 1.6.0 のリリース候補版が公開されたようだ。
- Prototype JavaScript framework: Prototype 1.6.0 release candidate
- Riding Rails: Prototype 1.6.0 release candidate
変更点が多い。目を引くものとしては、クラスの継承がサポートされた。新しい Class.create では親クラスを指定できる。いままでは Object.extend によるコピーで擬似的な継承をしていただけなので、これは嬉しいかもしれない。
クロスブラウザな DOMContentLoaded イベント
また、「window.onload 前でも DOM 処理が可能なら通知してくれる domready.js」という記事でも書いた、DOMContentLoaded がサポートされた。
document.observe("contentloaded", function() { ... })
従来の Element#observe メソッドを通して、透過的に扱うことができる。これで、先の記事にアップしていた domready.js は不要になるだろう。
1.6.0 には他にも色々面白そうな機能が追加されている。暇があるときに追々調べていくつもり。
prototype.js の $$ 関数で CSS 風に DOM プログラミング
prototype.js の $$ 関数(実際の処理は Selector.findChildElements)は CSS セレクタを受け取り、セレクタにマッチする要素を配列で返してくれる。
var links = $$('#contents a');
だが、単純にひとつのセレクタだけではなくて、複数のセレクタを引数に渡したり、CSS と同じく、カンマ区切りで複数指定することもできる(結果は重複要素のない配列となって返ってくる)。
var links = $$("#contents a", "#footer .items a");
このコードは、こう書くこともできる。
var links = $$("#contents a, #footer .items a");
そして、いまさらながら気づいたのは、これらの特徴を利用すれば、DOM の処理を CSS のように宣言的に書くのが可能だ、ということ。
window.onload 前でも DOM 処理が可能なら通知してくれる domready.js
DOM 読み込み完了のタイミングで、任意の関数を実行できるようにする JavaScript ライブラリを書いてみた。
mootools の同様の機能を基にしていて、単体として使いやすいように外部ライブラリへの依存性をなくし、prototype.js とも併用できるようにしたもの。
現状、手元の環境では以下のブラウザで動作確認済み。
- IE 7 (XP standalone)
- IE 6 SP2
- Firefox 2.0.0.4
- Opera 9.21
- Safari 2.0.4
- Mac Firefox 2.0.0.4
- Mac IE 5.2.3
ただし、Mac IE では window.onload で代用するように実装してある。まあ、スクリプトエラーが出るよりマシだろう。