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 代码
- Element.addMethods({
-
- sayHello: function() {
-
- alert(‘hello!’);
-
- }
- });
$(anything).sayHello();
//弹出对话框 hello
<o:p> </o:p>
复杂点的用法,加上参数:
js 代码
- Element.addMethods({
-
- ajaxUpdate: function(element, url, options){
-
- element = $(element);
-
- element.update('
-
- new Ajax.Updater(element, url, options);
-
- return element;
-
- }
-
- });
$(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 代码
- Form.Element.Methods.processing = function(element, text) {
-
- element = $(element);
-
- if (element.tagName.toLowerCase() == 'input' && ['button', 'submit'].include(element.type))
-
- element.value = typeof text == 'undefined' ? 'Please wait...' : text;
-
- return element.disable();
-
- };
-
- Element.addMethods();
然后就可以通过$(someInputElement).processing()来调用了。<o:p></o:p>
借用这个机制,可以方便的把自己写的方法加入进来。比如我上一篇博客提到的无刷上传。
言归正传,看看prototype是怎么实现这个机制的。以下是实现的源代码:(1.6rc)
js 代码
- Element.addMethods = function(methods) {
-
- var F = Prototype.BrowserFeatures, T = Element.Methods.ByTag;
-
-
-
- if (!methods) {
-
- Object.extend(Form, Form.Methods);
-
- Object.extend(Form.Element, Form.Element.Methods);
-
- Object.extend(Element.Methods.ByTag, {
-
- "FORM": Object.clone(Form.Methods),
-
- "INPUT": Object.clone(Form.Element.Methods),
-
- "SELECT": Object.clone(Form.Element.Methods),
-
- "TEXTAREA": Object.clone(Form.Element.Methods)
-
- });
-
- }
-
-
-
- if (arguments.length == 2) {
-
- var tagName = methods;
-
- methods = arguments[1];
-
- }
-
-
-
- if (!tagName) Object.extend(Element.Methods, methods || { });
-
- else {
-
- if (Object.isArray(tagName)) tagName.each(extend);
-
- else extend(tagName);
-
- }
-
-
-
- function extend(tagName) {
-
- tagName = tagName.toUpperCase();
-
- if (!Element.Methods.ByTag[tagName])
-
- Element.Methods.ByTag[tagName] = { };
-
- Object.extend(Element.Methods.ByTag[tagName], methods);
-
- }
-
-
-
- function copy(methods, destination, onlyIfAbsent) {
-
- onlyIfAbsent = onlyIfAbsent || false;
-
- for (var property in methods) {
-
- var value = methods[property];
-
- if (!Object.isFunction(value)) continue;
-
- if (!onlyIfAbsent || !(property in destination))
-
- destination[property] = value.methodize();
-
- }
-
- }
-
-
-
- function findDOMClass(tagName) {
-
- var klass;
-
- var trans = {
-
- "OPTGROUP": "OptGroup", "TEXTAREA": "TextArea", "P": "Paragraph",
-
- "FIELDSET": "FieldSet", "UL": "UList", "OL": "OList", "DL": "DList",
-
- "DIR": "Directory", "H1": "Heading", "H2": "Heading", "H3": "Heading",
-
- "H4": "Heading", "H5": "Heading", "H6": "Heading", "Q": "Quote",
-
- "INS": "Mod", "DEL": "Mod", "A": "Anchor", "IMG": "Image", "CAPTION":
-
- "TableCaption", "COL": "TableCol", "COLGROUP": "TableCol", "THEAD":
-
- "TableSection", "TFOOT": "TableSection", "TBODY": "TableSection", "TR":
-
- "TableRow", "TH": "TableCell", "TD": "TableCell", "FRAMESET":
-
- "FrameSet", "IFRAME": "IFrame"
-
- };
-
- if (trans[tagName]) klass = 'HTML' + trans[tagName] + 'Element';
-
- if (window[klass]) return window[klass];
-
- klass = 'HTML' + tagName + 'Element';
-
- if (window[klass]) return window[klass];
-
- klass = 'HTML' + tagName.capitalize() + 'Element';
-
- if (window[klass]) return window[klass];
-
-
-
- window[klass] = { };
-
- window[klass].prototype = document.createElement(tagName).__proto__;
-
- return window[klass];
-
- }此方法用来在各种不同的浏览器中找到正确的html dom 类名,然后返回之
-
-
-
-
-
- if (F.ElementExtensions) {
-
- copy(Element.Methods, HTMLElement.prototype);
-
- copy(Element.Methods.Simulated, HTMLElement.prototype, true);
-
- }
-
-
-
- if (F.SpecificElementExtensions) {
-
- for (var tag in Element.Methods.ByTag) {
-
- var klass = findDOMClass(tag);
-
- if (Object.isUndefined(klass)) continue;
-
- copy(T[tag], klass.prototype);
-
- }
-
- }
-
-
-
- Object.extend(Element, Element.Methods);
-
- delete Element.ByTag;
-
-
-
- if (Element.extend.refresh) Element.extend.refresh();
-
- Element.cache = { };
-
- };
至此,一个强大的功能诞生!附件是一个小小的实现
分享到:
相关推荐
Prototype.js开发笔记 Prototype.js是一个JavaScript库,由Sam Stephenson编写,用于简化JavaScript编程,提供了许多有用的函数和方法,以帮助开发者快速构建Web应用程序。下面是Prototype.js的开发笔记,涵盖了该...
Prototype.js 提供了强大的动画功能,如`Element.fade()`、`Element.slideUp()`和`Element.slideDown()`,这些方法可以实现元素的淡入淡出、滑动显示等效果。此外,`Elementmorph()`方法可以平滑地改变元素的尺寸或...
【标题】:Prototype.js开发笔记 【描述】:本文档主要涵盖了Prototype.js库的编程指南,包括其核心概念、通用方法、Ajax对象以及对JavaScript原生类型和DOM对象的扩展。Prototype.js是一个由Sam Stephenson编写的...
### Prototype.js 开发笔记知识点详解 #### 1.1 Prototype.js 是什么? Prototype.js 是一个由 Sam Stephenson 开发的 JavaScript 库。该库的主要目的是简化 Web 应用程序的开发过程,尤其针对那些需要高度交互性...
本文将深入探讨Prototype.js及其1.7.3版本的关键特性、应用场景以及它对现代Web开发的影响。 Prototype.js是一个开源的JavaScript库,由Sam Stephenson于2005年创建。它的设计目标是简化DOM操作,提供面向对象的...
4. **DOM操作**:Prototype简化了对HTML元素的操作,如`$(selector)`用于选择元素,`Element.Methods`提供了丰富的DOM操作,如`insert()`, `remove()`, `wrap()`等。 5. **Ajax**:Prototype的Ajax模块提供了一套...
此外,`Function.prototype.bind()`方法允许我们固定函数的作用域,确保函数在调用时总是以特定的对象为上下文,这在处理事件或者异步操作时尤为重要。 Prototype在DOM操作上提供了极大的便利。例如,`Element....
例如,`Object.extend()`方法允许我们轻松地合并两个或多个对象,而`Function.prototype.bind()`则使我们能够固定函数的上下文,确保`this`关键字始终指向预期的对象。 2. **DOM操作** Prototype 提供了一套强大...
2. Prototype.js文件:提供的`prototype.js`是Prototype库的主要实现文件,包含了所有的函数和类定义。通过引入这个文件,开发者可以立即使用Prototype提供的各种功能。 二、Prototype中的核心概念 1. Object....
最后,手册中的特效与动画章节教授了如何通过Element.Methods轻松实现各种视觉效果。 Prototype 1.6.js源码: 包含的"prototype.js"文件是Prototype 1.6.0的源代码,这对于开发者来说是一份宝贵的参考资料。通过...
2. **DOM操作** - 为了解决JavaScript操作DOM的繁琐,prototype.js 提供了一系列便捷的方法,如`Element.select()`用于选取一组元素,`Element.hide()`和`Element.show()`控制元素的可见性,以及`Element.update()`...
prototype1.6.0.2
Prototype.js 提供了一系列便捷的 DOM 操作方法,如 `Element.select()` 和 `Element.hide()`。1.6 版本进一步优化了这些方法,提高了性能并减少了代码量。`Element.Methods` 中新增了多个实用方法,使得对 HTML ...
7. **动画效果**:Prototype.js包含了一些简单的动画效果,如`Element.show`、`Element.hide`和`Element.fade`等,让开发者可以轻松实现过渡效果。 8. **函数装饰器**:如`wrap`、`bind`和`curry`等函数,可以帮助...
3. **Element对象**:Prototype.js强化了DOM元素的操作,如`Element.hide()`、`Element.show()`控制元素的显示隐藏,`Element.update()`用于替换元素内容。 三、Prototype.js实战应用 1. **模块化开发**:...
`Element.Methods`对象则包含了所有扩展到`Element`上的方法,如`addClassName`、`hide`等。这些方法使得开发者可以以链式调用的方式操作DOM元素,提高了代码的可读性和简洁性。 总的来说,`Element`是Prototype中...
**《prototype.js中文手册》详解** Prototype.js 是一个开源JavaScript库,由Sam Stephenson于2005年创建,主要用于简化DOM(文档对象模型)操作,增强JavaScript的面向对象编程能力,以及提供实用的函数扩展。它在...