prototype.js 1.5のElement.Methods

prototype.js1.5ではみんながこうしたいなーと思っていた機能が実装されました。(via Encytemedia) (SVN co http://dev.rubyonrails.org/svn/rails/spinoffs/prototype して rake distしたもの )

■Element.Methods

1.4まではelementに対する操作は

javascript code
  1. Element.show($("test"));
  2. Element.update($("test"), "hoge");
  3.  

のように書く必要がありました。

これが

javascript code
  1. $("test").show();
  2. $("test").update("hoge");
  3.  

と書けるようになりました。

これはprototype.jsで最も偉大な$メソッドの変更によるモノです。

javascript code
  1. function $() {
  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. }
  11.  

つまり取得したelementに対してElement.extendが適応されるようになった、と。 んでそのElement.extendは

javascript code
  1. Element.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. }
  15.  

Element.Methodsのメソッドがelementに対して第1引数をそのelementに束縛した状態でセットされます。 つまりElement.Methodsにメソッドを追加すれば自動的に$で取得したelementに対してそのメソッドが追加されます。

ちなみにscriptaculousでも

javascript code
  1. if(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. }
  9.  

というコードが追加されています。 クラス名変換のオーバーヘッドはあるものの、$("test").visualEffect('scale')と書けるようになりました。

IEで$$が動くようになっていたりと1.5のリリースが待ち遠しいですね。

Related posts:

07.27.08/12am

No comments yet

trackback uri
  • ajax-loading
  • ajax-loading
  • ajax-loading

Leave a Comment

You can use these tags: <code>, <i>, <em>, <strong>, <a>

About

Author:yuin(http://inforno.net/)

文学部文化学科卒という生粋の文系趣味プログラマ。

主にRuby、Javascript、PHP、JAVA,Python,C,Scala,Schemeなどを使っています。今はPythonな感じかもしれない。今後作曲活動なども復活するかもしれない。

Pages