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