`
boin
  • 浏览: 34840 次
社区版块
存档分类
最新评论

Prototype 'Element.addMethods()' 笔记

阅读更多

Prototype 提供了方便的扩展机制让用户可以把自定义的方法加入到框架中。用户可以在独立的文件中编写代码,而不用修改prototype.js本身,大大的增加了代码的可维护性,和可扩展性。这个方法就是Element.addMethods()

在官方的文档中对这个方法的介绍是:

Element.addMethods makes it possible to mix in your own methods to the Element object, which you can later use as methods of extended elements - those returned by the $() utility, for example - or as methods of Element.

方法原型是Element .addMethods([methods])<o:p></o:p>

一个最简单的使用:<o:p></o:p>

js 代码
 
  1. Element.addMethods({  
  2.  
  3.   sayHello: function() {  
  4.   
  5.    alert(‘hello!’);  
  6.   
  7.   } 

  8. });  

$(anything).sayHello();

//弹出对话框 hello

<o:p> </o:p>

复杂点的用法,加上参数:

js 代码
 
  1. Element.addMethods({  
  2.   
  3.   ajaxUpdate: function(element, url, options){  
  4.   
  5.     element = $(element);  
  6.   
  7.     element.update('
  8.   
  9.     new Ajax.Updater(element, url, options);  
  10.   
  11.     return element;  
  12.   
  13.   }  
  14.   
  15. });  

$(element).ajaxUpdate('/new/content');

// ->返回 HTMLElement

<o:p> </o:p>

仔细看一下Prototype.js最后一行调用了这一个方法,但是不带任何参数。文档里面说明,这样的用法是遍历Element.Methods, Element.Methods.Simulated, Form.Methods Form.Element.Methods对象,把所有的方法加入到相应的元素中。例如:<o:p></o:p>

js 代码
 
  1.  Form.Element.Methods.processing = function(element, text) {  
  2.   
  3.   element = $(element);  
  4.   
  5.   if (element.tagName.toLowerCase() == 'input' && ['button', 'submit'].include(element.type))  
  6.   
  7.     element.value = typeof text == 'undefined' ? 'Please wait...' : text;  
  8.   
  9.   return element.disable();  
  10.   
  11. };  
  12.   
  13. Element.addMethods();  

然后就可以通过$(someInputElement).processing()来调用了。<o:p></o:p>

借用这个机制,可以方便的把自己写的方法加入进来。比如我上一篇博客提到的无刷上传。

言归正传,看看prototype是怎么实现这个机制的。以下是实现的源代码:(1.6rc)

js 代码
 
  1. Element.addMethods = function(methods) {  
  2.   
  3.   var F = Prototype.BrowserFeatures, T = Element.Methods.ByTag;  
  4.   
  5. //  
  6.   
  7.   if (!methods) { //如果没有提供参数,那么默认初始化全部方法  
  8.   
  9.     Object.extend(Form, Form.Methods);  
  10.   
  11.     Object.extend(Form.Element, Form.Element.Methods);  
  12.   
  13.     Object.extend(Element.Methods.ByTag, {  
  14.   
  15.       "FORM":     Object.clone(Form.Methods),  
  16.   
  17.       "INPUT":    Object.clone(Form.Element.Methods),  
  18.   
  19.       "SELECT":   Object.clone(Form.Element.Methods),  
  20.   
  21.       "TEXTAREA": Object.clone(Form.Element.Methods)  
  22.   
  23.     });  
  24.   
  25.   }//继承Methods里面所有的方法  
  26.   
  27.    
  28.   
  29.   if (arguments.length == 2) {//如果提供的参数是2个  
  30.   
  31.     var tagName = methods;//把第一个参数视为tagName  
  32.   
  33. methods = arguments[1];  
  34.   
  35.   }  
  36.   
  37. //如果没有定义tagName,那么默认把methods添加到Element.Methods中  
  38.   
  39.   if (!tagName) Object.extend(Element.Methods, methods || { });  
  40.   
  41.   else {  
  42.   
  43.     if (Object.isArray(tagName)) tagName.each(extend);  
  44.   
  45.     else extend(tagName);  
  46.   
  47.   }//调用extent方法,如果tagName是数组,那么依次调用extent方法。  
  48.   
  49.    
  50.   
  51.   function extend(tagName) {  
  52.   
  53.     tagName = tagName.toUpperCase();  
  54.   
  55.     if (!Element.Methods.ByTag[tagName])  
  56.   
  57.       Element.Methods.ByTag[tagName] = { };  
  58.   
  59.     Object.extend(Element.Methods.ByTag[tagName], methods);  
  60.   
  61.   } //在Element.Methods.ByTag中存放以tagName为标识的继承了methods的对象  
  62.   
  63.    
  64.   
  65.   function copy(methods, destination, onlyIfAbsent) {  
  66.   
  67.     onlyIfAbsent = onlyIfAbsent || false;  
  68.   
  69.     for (var property in methods) {  
  70.   
  71.       var value = methods[property];  
  72.   
  73.       if (!Object.isFunction(value)) continue;  
  74.   
  75.       if (!onlyIfAbsent || !(property in destination))  
  76.   
  77.         destination[property] = value.methodize();  
  78.   
  79.     }  
  80.   
  81.   }//此方法用来把methods里面的所有方法复制到destination中  
  82.   
  83.    
  84.   
  85.   function findDOMClass(tagName) {  
  86.   
  87.     var klass;  
  88.   
  89.     var trans = {  
  90.   
  91.       "OPTGROUP""OptGroup""TEXTAREA""TextArea""P""Paragraph",  
  92.   
  93.       "FIELDSET""FieldSet""UL""UList""OL""OList""DL""DList",  
  94.   
  95.       "DIR""Directory""H1""Heading""H2""Heading""H3""Heading",  
  96.   
  97.       "H4""Heading""H5""Heading""H6""Heading""Q""Quote",  
  98.   
  99.       "INS""Mod""DEL""Mod""A""Anchor""IMG""Image""CAPTION":  
  100.   
  101.       "TableCaption""COL""TableCol""COLGROUP""TableCol""THEAD":  
  102.   
  103.       "TableSection""TFOOT""TableSection""TBODY""TableSection""TR":  
  104.   
  105.       "TableRow""TH""TableCell""TD""TableCell""FRAMESET":  
  106.   
  107.       "FrameSet""IFRAME""IFrame"  
  108.   
  109.     };  
  110.   
  111.     if (trans[tagName]) klass = 'HTML' + trans[tagName] + 'Element';  
  112.   
  113.     if (window[klass]) return window[klass];  
  114.   
  115.     klass = 'HTML' + tagName + 'Element';  
  116.   
  117.     if (window[klass]) return window[klass];  
  118.   
  119.     klass = 'HTML' + tagName.capitalize() + 'Element';  
  120.   
  121.     if (window[klass]) return window[klass];  
  122.   
  123.    
  124.   
  125.     window[klass] = { };  
  126.   
  127.     window[klass].prototype = document.createElement(tagName).__proto__;  
  128.   
  129.     return window[klass];  
  130.   
  131.   }此方法用来在各种不同的浏览器中找到正确的html dom 类名,然后返回之  
  132.   
  133.    
  134.   
  135. //接着处理,下面就是该把对应每个标签的自定义方法绑定到标签的prototype上了。  
  136.   
  137.   if (F.ElementExtensions) {  
  138.   
  139.     copy(Element.Methods, HTMLElement.prototype);  
  140.   
  141.     copy(Element.Methods.Simulated, HTMLElement.prototype, true);  
  142.   
  143.   }  
  144.   
  145.    
  146.   
  147.   if (F.SpecificElementExtensions) {  
  148.   
  149.     for (var tag in Element.Methods.ByTag) {  
  150.   
  151.       var klass = findDOMClass(tag);  
  152.   
  153.       if (Object.isUndefined(klass)) continue;  
  154.   
  155.       copy(T[tag], klass.prototype);  
  156.   
  157.     }  
  158.   
  159.   }//把Element.Methods.ByTag里面的方法绑定到相应的tagName上  
  160.   
  161.    
  162.   
  163.   Object.extend(Element, Element.Methods);//把Element.Methods里的方法绑到Element里  
  164.   
  165.   delete Element.ByTag; //删掉Element.ByTag;  
  166.   
  167.    
  168.   
  169.   if (Element.extend.refresh) Element.extend.refresh();  
  170.   
  171.   Element.cache = { };//刷新并清空缓存,扫尾。  
  172.   
  173. };  
至此,一个强大的功能诞生!附件是一个小小的实现
分享到:
评论

相关推荐

    prototype.js开发笔记.pdf

    Prototype.js开发笔记 Prototype.js是一个JavaScript库,由Sam Stephenson编写,用于简化JavaScript编程,提供了许多有用的函数和方法,以帮助开发者快速构建Web应用程序。下面是Prototype.js的开发笔记,涵盖了该...

    prototype.js 1.6中文手册、prototype.js 1.6英文手册、

    Prototype.js 提供了强大的动画功能,如`Element.fade()`、`Element.slideUp()`和`Element.slideDown()`,这些方法可以实现元素的淡入淡出、滑动显示等效果。此外,`Elementmorph()`方法可以平滑地改变元素的尺寸或...

    prototype.js开发笔记.doc

    【标题】:Prototype.js开发笔记 【描述】:本文档主要涵盖了Prototype.js库的编程指南,包括其核心概念、通用方法、Ajax对象以及对JavaScript原生类型和DOM对象的扩展。Prototype.js是一个由Sam Stephenson编写的...

    prototype.js开发笔记

    ### Prototype.js 开发笔记知识点详解 #### 1.1 Prototype.js 是什么? Prototype.js 是一个由 Sam Stephenson 开发的 JavaScript 库。该库的主要目的是简化 Web 应用程序的开发过程,尤其针对那些需要高度交互性...

    prototype_1.7.3.js 最新版本

    本文将深入探讨Prototype.js及其1.7.3版本的关键特性、应用场景以及它对现代Web开发的影响。 Prototype.js是一个开源的JavaScript库,由Sam Stephenson于2005年创建。它的设计目标是简化DOM操作,提供面向对象的...

    prototype 1.6.0.2.js+使用DEMO例子

    4. **DOM操作**:Prototype简化了对HTML元素的操作,如`$(selector)`用于选择元素,`Element.Methods`提供了丰富的DOM操作,如`insert()`, `remove()`, `wrap()`等。 5. **Ajax**:Prototype的Ajax模块提供了一套...

    Prototype 1.6.0.3 中文参考手册

    此外,`Function.prototype.bind()`方法允许我们固定函数的作用域,确保函数在调用时总是以特定的对象为上下文,这在处理事件或者异步操作时尤为重要。 Prototype在DOM操作上提供了极大的便利。例如,`Element....

    prototype1.7.zip

    例如,`Object.extend()`方法允许我们轻松地合并两个或多个对象,而`Function.prototype.bind()`则使我们能够固定函数的上下文,确保`this`关键字始终指向预期的对象。 2. **DOM操作** Prototype 提供了一套强大...

    prototype 开发应用手册,笔记,prototype.js文件下载

    2. Prototype.js文件:提供的`prototype.js`是Prototype库的主要实现文件,包含了所有的函数和类定义。通过引入这个文件,开发者可以立即使用Prototype提供的各种功能。 二、Prototype中的核心概念 1. Object....

    prototype 1.6中文手册 chm+prototype 1.6.js源码 最新版

    最后,手册中的特效与动画章节教授了如何通过Element.Methods轻松实现各种视觉效果。 Prototype 1.6.js源码: 包含的"prototype.js"文件是Prototype 1.6.0的源代码,这对于开发者来说是一份宝贵的参考资料。通过...

    prototype.js简介

    2. **DOM操作** - 为了解决JavaScript操作DOM的繁琐,prototype.js 提供了一系列便捷的方法,如`Element.select()`用于选取一组元素,`Element.hide()`和`Element.show()`控制元素的可见性,以及`Element.update()`...

    prototype1.6.0.2.js

    prototype1.6.0.2

    prototype.js 1.6

    Prototype.js 提供了一系列便捷的 DOM 操作方法,如 `Element.select()` 和 `Element.hide()`。1.6 版本进一步优化了这些方法,提高了性能并减少了代码量。`Element.Methods` 中新增了多个实用方法,使得对 HTML ...

    prototype.js 1.4版开发者手册(强烈推荐)

    7. **动画效果**:Prototype.js包含了一些简单的动画效果,如`Element.show`、`Element.hide`和`Element.fade`等,让开发者可以轻松实现过渡效果。 8. **函数装饰器**:如`wrap`、`bind`和`curry`等函数,可以帮助...

    prototype.js.cn.doc.rar

    3. **Element对象**:Prototype.js强化了DOM元素的操作,如`Element.hide()`、`Element.show()`控制元素的显示隐藏,`Element.update()`用于替换元素内容。 三、Prototype.js实战应用 1. **模块化开发**:...

    prototype Element学习笔记(篇一)

    `Element.Methods`对象则包含了所有扩展到`Element`上的方法,如`addClassName`、`hide`等。这些方法使得开发者可以以链式调用的方式操作DOM元素,提高了代码的可读性和简洁性。 总的来说,`Element`是Prototype中...

    prototype.js中文手册

    **《prototype.js中文手册》详解** Prototype.js 是一个开源JavaScript库,由Sam Stephenson于2005年创建,主要用于简化DOM(文档对象模型)操作,增强JavaScript的面向对象编程能力,以及提供实用的函数扩展。它在...

Global site tag (gtag.js) - Google Analytics