Prototype框架是怎样扩展DOM的

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()。

时间: 2024-09-22 23:53:13

Prototype框架是怎样扩展DOM的的相关文章

Prototype框架详解_javascript技巧

这里所说的"Prototype"不是JavaScript编程中的原型("prototype"),而是由"Sam Stephenson"写的一个JavaScript类库.这个构思奇妙,而且兼容标准的类库,能帮助程序员轻松建立有高度互动的"web2.0"特性的富客户端页面. •很多人初次接触Prototype,都是从其"$"系列函数开始的,这些类似于桌面应用程序的快捷方式,是Prototype框架中使用频率最高

thinkphp+redis-TP框架里怎么扩展redis操作

问题描述 TP框架里怎么扩展redis操作 1C TP框架里怎么扩展redis操作?通过扩展redis类?操作redis就像操作mysql数据库一样 解决方案 https://github.com/liu21st/thinkphp/blob/master/ThinkPHP/Library/Think/Cache/Driver/Redis.class.php http://www.thinkphp.cn/extend/501.html 解决方案二: 用JS访问操作iframe框架里的dom

prototype框架中美元符号$用法分析_javascript技巧

本文实例讲述了prototype框架中美元符号$用法.分享给大家供大家参考,具体如下: prototype是实现面向对象的一个重要工具,是javascript的一个不错的框架. 用jquery的人都知道,jquery中也有$美元符号,prototype中呢,也有$,他们有什么区别呢. 1.prototype中$()的用法 prototype写法 $("test") 或者 $$("#test"), 他相当于js中document.getElementById(&quo

利用ProtoType框架完成的一个下拉框(asp:DropDownList)联动的AJAX例子

ajax|下拉 最近终于有时间研究研究AJAX了.看了一些AJAX的介绍.用ProtoType框架完成的一个下拉框(asp:DropDownList)联动的AJAX的小例子,和初学者分享一下. 代码下载 <script language="javascript" type="text/javascript" ><!-- function goCity(){        var url = "AreaHandler.ashx";

利用ProtoType框架完成的一个下拉框(asp:DropDownList)联动的AJAX例子

最近终于有时间研究研究AJAX了.看了一些AJAX的介绍. 用ProtoType框架完成的一个下拉框(asp:DropDownList)联动的AJAX的小例子,和初学者分享一下. <script language="javascript" type="text/javascript" > <!-- function goCity() { var url = "AreaHandler.ashx"; var father= $F('

ajax prototype框架之Ajax.Request 类

使用 Ajax.Request 类 如果你不使用任何的帮助程序包,你很可能编写了整个大量的代码来创建 XMLHttpRequest 对象并且异步的跟踪它的进程,然后解析响应并处理它.当你不需要支持多于一种类型的浏览器时你会感到非常的幸运. 为了支持 AJAX 功能.这个包定义了 Ajax.Request 类. 假如你有一个应用程序可以通过http://yoursever/app/get_sales?empID=1234&year=1998 与服务器通信.它返回下面这样的 XML 响应: <?

jquery与prototype框架的详细对比_jquery

以前做界面是用jquery的,现在因为要用许多ajax效果,改用了rails自带的prototype 因为jquery用多了,换个框架也大同小异,不过细节上有很多不同... 1.dom加载方面: jquery有dom ready方法,推迟js函数的绑定知道dom树完成(如果没有这个功能,一些element的事件函数之类的绑定可能会出错): $(document).ready(function(){}); 但是prototype是没有的...得自己找非官方的扩展,不方便,这个基本的功能,这么重要的

mootools框架【八】-Dom篇:Css查询支持之Dom.js

说明:mootools支持通过Css选择器语法来获取元素节点,以最少的代码做最多的事情.在Dom.js中提供了实现这些功能的工具方法以及元素级的扩展. 1.方法:$E 作用:按照css选择器语法获取第一个符合规则的元素 参数: selector:css选择器,如a,#my_div等 filter:可选,过滤范围,默认是document 例子: <div id="myDiv"> <a href="#" id="link1">

对prototype.js进行的扩展

最近的项目中要使用ajax,于是对各种ajaxframework在进行比较之后,最终选择了prototype.js,由于prototype.js是一个非常基础的ajaxframework,需要根据项目需求自己来进行一些扩展,下面就是我所做的一些扩展,如有误,请指正! 我实现了一个Form.Element.ValidationObserver,这个类需要依赖Validation.js以及相应的css(validation-advice),该类是对表单中的单个元素通过ajax结合后台进行验证,其中因