Prototype框架最大的部分就是对DOM的扩展。Prototype框架里的$()函数返回一个网页DOM元素,框架给这个元素添加了很多方便的方法。举个例子:你可以写这样的代码 $('comments').addClassName('active').show() ,用来取得ID是“comments”的元素,给它添加一个CSS的ClassName并且显示它(假设之前是隐藏的)。本来在JavaScript里,“comments”元素是没有这些方法可用的;这是怎么实现的呢?这篇文章揭示了几个在Prototype框架里用到的技巧。
用 Element.addMethods() 添加你自己的方法
如果你有自己的DOM方法想要添加到Prototype的那一大堆方法里去凑凑热闹,没问题!Prototype也为此提供了一种机制。假设你有一组函数封装在一个对象里,只要把这个对象交给 Element.addMethods() 就可以了:
var MyUtils = {
truncate: function(element, length){
element = $(element);
return element.update(element.innerHTML.truncate(length));
},
updateAndMark: function(element, html){
return $(element).update(html).addClassName('updated');
}
}
Element.addMethods(MyUtils);
// 现在你可以:
$('explanation').truncate(100);
唯一需要注意的事情就是要确保这些方法的第一个参数是元素自身。在你的方法里,你还可以在最后返回这个元素以实现可链性(或者,就像例子里实践的那样,实现自身返回元素的方法)。
Element.extend() 方法
大多数扩展DOM方法都是封装在Element.Methods对象里的,并被复制到Element对象(提供方便之用)。这些方法都把要操作的元素作为第一个参数来接受。
Element.hide('comments');
var div_height = Element.getHeight(my_div);
Element.addClassName('contactform', 'pending');
这些例子可谓简明易懂了,但是我们还有更好的方式。如果你想要操纵一个元素,你可以把这个元素交给Element.extend(),它会把所有的那些方法都直接复制给这个元素。例如,创建一个新的元素并且控制它:
var my_div = document.createElement('div');
Element.extend(my_div);
my_div.addClassName('pending').hide();
// 把元素插入到文档
document.body.appendChild(my_div);
我们的方法调用变得更短更直观了!正如上面提到的,Element.extend() 从Element.Methods把所有的方法复制到我们的元素,元素自动成为所有那些方法函数的第一个参数。extend()方法足够机灵,不会在同一个元素上尝试操作两次。更牛的是,美钞函数 $() 通过这种机制扩展了交给它的每个元素。
此外,Element.extend() 机制也适用于在FORM元素上使用Form.Methods的方法,以及在INPUT、TEXTAREA 和 SELECT 元素上使用Form.Element.Methods的方法:
var contact_data = $('contactform').serialize();
var search_terms = $('search_input').getValue();
注意并非只有美钞函数能自动扩展元素!document.getElementsByClassName、Form.getElements、双美钞 $$()函数(CSS选择器)返回元素的时候,还有其他一些场合都要调用Element.extend() ……总之,你根本很少有机会需要显式地调用Element.extend()。