prototype.js1.5ではみんながこうしたいなーと思っていた機能が実装されました。(via Encytemedia ) (SVN co http://dev.rubyonrails.org/svn/rails/spinoffs/prototype して rake distしたもの )
■Element.Methods
1.4まではelementに対する操作は
1Element.show($("test"));
2Element.update($("test"), "hoge");
のように書く必要がありました。
これが
1$("test").show();
2$("test").update("hoge");
と書けるようになりました。
これはprototype.jsで最も偉大な$メソッドの変更によるモノです。
1function $() {
2 var results = [], element;
3 for (var i = 0; i < arguments.length; i++) {
4 element = arguments[i];
5 if (typeof element == 'string')
6 element = document.getElementById(element);
7 results.push(Element.extend(element)); //<= ココ!
8 }
9 return results.length < 2 ? results[0] : results;
10}
つまり取得したelementに対してElement.extendが適応されるようになった、と。 んでそのElement.extendは
1Element.extend = function(element) {
2 if (!element) return;
3
4 if (!element._extended && element.tagName && element != window) {
5 var methods = Element.Methods;
6 for (property in methods) {
7 var value = methods[property];
8 if (typeof value == 'function')
9 element[property] = value.bind(null, element);
10 }
11 }
12 element._extended = true;
13 return element;
14}
Element.Methodsのメソッドがelementに対して第1引数をそのelementに束縛した状態でセットされます。 つまりElement.Methodsにメソッドを追加すれば自動的に$で取得したelementに対してそのメソッドが追加されます。
ちなみにscriptaculousでも
1if(Element.Methods) {
2 Element.Methods.visualEffect = function(element, effect, options) {
3 s = effect.gsub(/_/, '-').camelize();
4 effect_class = s.charAt(0).toUpperCase() + s.substring(1);
5 new Effect[effect_class](element, options);
6 return $(element);
7 }
8}
というコードが追加されています。 クラス名変換のオーバーヘッドはあるものの、$(“test”).visualEffect(‘scale’)と書けるようになりました。
IEで$$が動くようになっていたりと1.5のリリースが待ち遠しいですね。