Prototype框架是怎样扩展DOM的

2016-02-19 16:35 6 1 收藏

下面是个超简单的Prototype框架是怎样扩展DOM的教程,图老师小编精心挑选推荐,大家行行好,多给几个赞吧,小编吐血跪求~

【 tulaoshi.com - Web开发 】

  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的方法:

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/webkaifa/)

var contact_data = $('contactform').serialize();var search_terms = $('search_input').getValue();

  注意并非只有美钞函数能自动扩展元素!document.getElementsByClassName、Form.getElements、双美钞 $$()函数(CSS选择器)返回元素的时候,还有其他一些场合都要调用Element.extend() 总之,你根本很少有机会需要显式地调用Element.extend()。

  本地原生扩展

  在这一切背后有一个秘密。

  在支持向本地原生对象(诸如HTML元素)的原型添加方法的浏览器中,无需调用过Element.extend()、美钞函数或别的什么东西,所有元素的DOM扩展就是默认可用的!于是在这些浏览器中,这样的代码是有效的:

var my_div = document.createElement('div');my_div.addClassName('pending').hide();document.body.appendChild(my_div);

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/webkaifa/)

  因为浏览器本地原生对象的原型被扩展了,所有的DOM元素就内建具有了原型扩展方法。但是,这在IE里是行不通的,IE不让人改动HTMLElement.prototype。为了让前面的例子在IE上也能行得通,你需要用 Element.extend() 扩展元素。毋需担心,这个方法足够机灵,不会重复扩展元素。

  由于有不支持这个的浏览器的缘故,你必须注意只在元素已经被扩展了的情况下使用DOM扩展。举例来说,上面的例子在 Firefox 和 Opera 里行得通,但是在创建元素之后加上Element.extend(my_div)可以使得脚本稳定可靠。你可以用美钞函数作为快捷的写法,如下例:

// 这在 IE 里会出错:$('someElement').parentNode.hide()// 跨浏览器的方式:$($('someElement').parentNode).hide()

  记住了!永远要在所有(你打算支持的)浏览器里进行测试。

  Prototype API文档

  英文http://www.prototypejs.org/api

  中文http://www.ajaxgo.org/prototype/

  Prototype Copyright © 2006 Sam Stephenson

  (Bound0 译自 http://prototypejs.org/learn/extensions 可自由转载,请注明出处。)

来源:http://www.tulaoshi.com/n/20160219/1612473.html

延伸阅读
标签: Web开发
摘要 :现代网站和web应用程序趋向于依赖客户端的大量的 javascript 来提供丰富的交互。特别是通过不刷新页面的异步请求来返回数据或从服务器端的脚本(或数据系统)中得到响应。在这篇文章中,你将会了解到javascript框架如何更快、更方便的创建互动性强、响应快得网站和web应用程序。 导言 :JavaScript是一种面向对象的脚本语言,一直...
标签: Web开发
一、什么是框架 框架Frames最主要功用是"分割"视窗,使每个"小视窗"能显示不同的HTM L文件,不同框架之间可以互动(interact),这就是说不同框架之间可以交换讯息与资料。例如:假设您开了两个frames,第一个frame可显示书的目录,第二个frame则显示章节的具体内容。 框架可以将屏幕分割成不同的区域,每个区...
标签: Web开发
一直没有没有时间看prototype,现在好了,已经更新到了1.5 pre1,呵呵,强大的功能不得不学习啊,这个是提升自己JS能力的又一个捷径. 1. Prototype是什么? 或许你还没有用过它, prototype.js 是一个由Sam Stephenson写的JavaScript包。这个构思奇妙编写良好的一段兼容标准的一段代码将承担创造胖客户端, 高交互性WEB应用程序的重...
标签: Web开发
  在DOM 中,我们将代表XML 文件的程序设计对象,称为节点(nodes)。当Internet Explorer 5 处理被链接的XML 文件并储存于DOM 中时,它会为XML 文件的每一个基本组件建立一个节点。这些基本组件包括了元素、属性,与处理指令DOM 会使用不同形态的节点来代表不同形态的XML 组件。例如,元素是储存在Element 节点中,而属性则是储存在Attri...
标签: Web开发
  最近终于有时间研究研究AJAX了.看了一些AJAX的介绍. 用ProtoType框架完成的一个下拉框(asp:DropDownList)联动的AJAX的小例子,和初学者分享一下. 代码下载 script language="javascript" type="text/javascript"  !-- function goCity() {        ...

经验教程

479

收藏

94
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部