prototype.js开发笔记
来源:互联网 发布:阳江网络问政平台投诉 编辑:程序博客网 时间:2024/04/30 14:33
1. Prototype是什么?
或许你还没有用过它, prototype.js 是一个由Sam Stephenson写的JavaScript包。这个构思奇妙编写良好的一段兼容标准的一段代码将承担创造胖客户端, 高交互性WEB应用程序的重担。轻松加入Web 2.0特性。
如果你最近体验了这个程序包,你很可能会发现文档并不是它的强项之一。像所有在我之前的开发者一样,我只能一头扎进prototype.js的源代码中并且试验其中的每一个部分。 我想当我学习他的时候记写笔记然后分享给其他人将会很不错。
我也一起提供了这个包的对象,类,方法和扩展的 非官方参考 。
2. 通用性方法
这个程序包里面包含了许多预定义的对象和通用性方法。编写这些方法的明显的目的就是为了减少你大量的重复编码和惯用法。
2.1. 使用 $()方法
$() 方法是在DOM中使用过于频繁的 document.getElementById() 方法的一个便利的简写,就像这个DOM方法一样,这个方法返回参数传入的id的那个元素。
比起DOM中的方法,这个更胜一筹。你可以传入多个id作为参数然后 $() 返回一个带有所有要求的元素的一个 Array 对象。下面的例子会向你描述这些。
<HTML><HEAD><TITLE> Test Page </TITLE><script src="prototype-1.3.1.js"></script><script> function test1() { var d = $('myDiv'); alert(d.innerHTML); } function test2() { var divs = $('myDiv','myOtherDiv'); for(i=0; i<divs.length; i++) { alert(divs[i].innerHTML); } }</script></HEAD><BODY> <div id="myDiv"> <p>This is a paragraph</p> </div> <div id="myOtherDiv"> <p>This is another paragraph</p> </div> <input type="button" value=Test1 onclick="test1();"><br> <input type="button" value=Test2 onclick="test2();"><br></BODY></HTML>
这个方法的另一个好处就是你可以传入id字符串或者元素对象自己,这使得在创建可以传入任何形式参数的方法的时候, 它变得非常有用。
2.2. 使用$F()方法
$F()方法是另一个非常受欢迎的简写。它可以返回任何输入表单控件的值,如文本框或下拉框。 这个方法可以传入元素的id或者元素自己。
<script> function test3() { alert( $F('userName') ); }</script><input type="text" id="userName" value="Joe Doe"><br> <input type="button" value=Test3 onclick="test3();"><br>
2.3. 使用Try.these()方法
Try.these() 方法使得实现当你想调用不同的方法直到其中的一个成功正常的这种需求变得非常容易, 他把一系列的方法作为参数并且按顺序的一个一个的执行这些方法直到其中的一个成功执行,返回成功执行的那个方法的返回值。
在下面的例子中, xmlNode.text在一些浏览器中好用,但是xmlNode.textContent在另一些浏览器中正常工作。 使用Try.these()方法我们可以得到正常工作的那个方法的返回值。
<script>function getXmlNodeValue(xmlNode){ return Try.these( function() {return xmlNode.text;}, function() {return xmlNode.textContent;) );}</script>
3. Ajax 对象
上面提到的共通方法非常好,但是面对它吧,它们不是最高级的那类东西。它们是吗?你很可能自己编写了这些甚至在你的脚本里面有类似功能的方法。但是这些方法只是冰山一角。
我很肯定你对prototype.js感兴趣的原因很可能是由于它的AJAX能力。所以让我们解释当你需要完成AJAX逻辑的时候,这个包如何让它更容易。
Ajax 对象是一个预定义对象,由这个包创建,为了封装和简化编写AJAX 功能涉及的狡猾的代码。 这个对象包含一系列的封装AJAX逻辑的类。我们来看看它们的一些。
3.1. 使用 Ajax.Request类
如果你不使用任何的帮助程序包,你很可能编写了整个大量的代码来创建XMLHttpRequest对象并且异步的跟踪它的进程, 然后解析出响应 然后处理它。当你不需要支持多于一种类型的浏览器时你会感到非常的幸运。
为了支持 AJAX 功能。这个包定义了 Ajax.Request 类。
假如你有一个应用程序可以通过url http://yoursever/app/get_sales?empID=1234&year=1998与服务器通信。它返回下面这样的XML 响应。
<?xml version="1.0" encoding="utf-8" ?><ajax-response> <response type="object" id="productDetails"> <monthly-sales> <employee-sales> <employee-id>1234</employee-id> <year-month>1998-01</year-month> <sales>$8,115.36</sales> </employee-sales> <employee-sales> <employee-id>1234</employee-id> <year-month>1998-02</year-month> <sales>$11,147.51</sales> </employee-sales> </monthly-sales> </response></ajax-response>
用 Ajax.Request对象和服务器通信并且得到这段XML是非常简单的。下面的例子演示了它是如何完成的。
<script> function searchSales() { var empID = $F('lstEmployees'); var y = $F('lstYears'); var url = 'http://yoursever/app/get_sales'; var pars = 'empID=' + empID + '&year=' + y; var myAjax = new Ajax.Request( url, {method: 'get', parameters: pars, onComplete: showResponse} ); } function showResponse(originalRequest) { //put returned XML in the textarea $('result').value = originalRequest.responseText; }</script><select id="lstEmployees" size="10" onchange="searchSales()"> <option value="5">Buchanan, Steven</option> <option value="8">Callahan, Laura</option> <option value="1">Davolio, Nancy</option></select><select id="lstYears" size="3" onchange="searchSales()"> <option selected="selected" value="1996">1996</option> <option value="1997">1997</option> <option value="1998">1998</option></select><br><textarea id=result cols=60 rows=10 ></textarea>
你看到传入 Ajax.Request构造方法的第二个对象了吗? 参数{method: 'get', parameters: pars, onComplete: showResponse} 表示一个匿名对象的真实写法。他表示你传入的这个对象有一个名为 method 值为 'get'的属性,另一个属性名为 parameters 包含HTTP请求的查询字符串,和一个onComplete 属性/方法包含函数showResponse。
还有一些其它的属性可以在这个对象里面定义和设置,如 asynchronous,可以为true 或 false 来决定AJAX对服务器的调用是否是异步的(默认值是 true)。
这个参数定义AJAX调用的选项。在我们的例子中,在第一个参数通过HTTP GET命令请求那个url,传入了变量 pars包含的查询字符串, Ajax.Request 对象在它完成接收响应的时候将调用showResponse 方法。
也许你知道, XMLHttpRequest在HTTP请求期间将报告进度情况。这个进度被描述为四个不同阶段:Loading, Loaded, Interactive, 或 Complete。你可以使 Ajax.Request 对象在任何阶段调用自定义方法 ,Complete 是最常用的一个。想调用自定义的方法只需要简单的在请求的选项参数中的名为 onXXXXX 属性/方法中提供自定义的方法对象。 就像我们例子中的 onComplete 。你传入的方法将会被用一个参数调用,这个参数是 XMLHttpRequest 对象自己。你将会用这个对象去得到返回的数据并且或许检查包含有在这次调用中的HTTP结果代码的 status 属性。
还有另外两个有用的选项用来处理结果。我们可以在onSuccess 选项处传入一个方法,当AJAX无误的执行完后调用, 相反的,也可以在onFailure选项处传入一个方法,当服务器端出现错误时调用。正如onXXXXX 选项传入的方法一样,这两个在被调用的时候也传入一个带有AJAX请求的XMLHttpRequest对象。
我们的例子没有用任何有趣的方式处理这个 XML响应, 我们只是把这段XML放进了一个文本域里面。对这个响应的一个典型的应用很可能就是找到其中的想要的信息,然后更新页面中的某些元素, 或者甚至可能做某些XSLT转换而在页面中产生一些HTML。
更完全的解释,请参照 Ajax.Request 参考 和 Ajax选项参考。
3.2. 使用 Ajax.Updater 类
如果你的服务器的另一端返回的信息已经是HTML了,那么使用这个程序包中 Ajax.Updater 类将使你的生活变得更加得容易。用它你只需提供哪一个元素需要被AJAX请求返回的HTML填充就可以了,例子比我写说明的更清楚。
<script> function getHTML() { var url = 'http://yourserver/app/getSomeHTML'; var pars = 'someParameter=ABC'; var myAjax = new Ajax.Updater('placeholder', url, {method: 'get', parameters: pars}); }</script><input type=button value=GetHtml onclick="getHTML()"><div id="placeholder"></div>
你可以看到,这段代码比前面的例子更加简洁,不包括 onComplete 方法,但是在构造方法中传入了一个元素id。 我们来稍稍修改一下代码来描述如何在客户端处理服务器段错误成为可能。
我们将加入更多的选项, 指定处理错误的一个方法。这个是用 onFailure 选项来完成的。
我们也指定了一个 placeholder 只有在成功请求之后才会被填充。为了完成这个目的我们修改了第一个参数从一个简单的元素id到一个带有两个属性的对象, success (一切OK的时候被用到) 和 failure (有地方出问题的时候被用到) 在下面的例子中没有用到failure属性,而仅仅在 onFailure 处使用了 reportError 方法。
<script> function getHTML() { var url = 'http://yourserver/app/getSomeHTML'; var pars = 'someParameter=ABC'; var myAjax = new Ajax.Updater( {success: 'placeholder'}, url, {method: 'get', parameters: pars, onFailure: reportError}); } function reportError(request) { alert('Sorry. There was an error.'); }</script><input type=button value=GetHtml onclick="getHTML()"><div id="placeholder"></div>
如果你的服务器逻辑是返回JavaScript 代码而不是单纯的 HTML 标记, Ajax.Updater对象可以执行那段JavaScript代码。为了使这个对象对待响应为JavaScript,你只需在最后参数的对象构造方法中简单加入evalScripts: true属性。
更完全的解释,请参照 Ajax.Updater 参考 和 Ajax选项参考 。
4. prototype.js参考
4.1. JavaScript 类的扩展
prototype.js 包中加入功能的一种途径就是扩展已有的JavaScript 类。
4.2. 对 Object 类的扩展
Table 1. Object 类的扩展
4.3. 对 Number 类的扩展
Table 2. Number 类的扩展
4.4. 对 Function 类的扩展
Table 3. 对 Function 类的扩展
让我们看看这些扩展的具体例子。
<input type=checkbox id=myChk value=1> Test?<script> //declaring the class var CheckboxWatcher = Class.create(); //defining the rest of the class implmentation CheckboxWatcher.prototype = { initialize: function(chkBox, message) { this.chkBox = $(chkBox); this.message = message; //assigning our method to the event this.chkBox.onclick = this.showMessage.bindAsEventListener(this); }, showMessage: function(evt) { alert(this.message + ' (' + evt.type + ')'); } }; var watcher = new CheckboxWatcher('myChk', 'Changed');</script>
4.5. 对 String 类的扩展
Table 4. String 类的扩展
4.6. 对 document DOM 对象的扩展
Table 5. document DOM 对象的扩展
4.7. 对 Event 对象的扩展
Table 6. Event 对象的扩展
Table 7. Event 对象的扩展
让我们看看怎样用这个对象加入处理 window 对象的load事件的处理方法。
<script> Event.observe(window, 'load', showMessage, false); function showMessage() { alert('Page loaded.'); }</script>
4.8. 在 prototype.js中定义的新对象和类
另一个这个程序包帮助你的地方就是提供许多既支持面向对象设计理念又有共通功能的许多对象。
4.9. PeriodicalExecuter 对象
这个对象提供一定间隔时间上重复调用一个方法的逻辑。
Table 8. PeriodicalExecuter 对象
Table 9. PeriodicalExecuter 对象
4.10. Prototype 对象
Prototype 没有太重要的作用,只是声明了该程序包的版本 。
Table 10. The Prototype object
4.11. Class 对象
在这个程序包中 Class 对象在声明其他的类时候被用到 。用这个对象声明类使得新类支持 initialize() 方法,他起构造方法的作用。
看下面的例子
//declaring the classvar MySampleClass = Class.create();//defining the rest of the class implmentationMySampleClass.prototype = { initialize: function(message) { this.message = message; }, showMessage: function(ajaxResponse) { alert(this.message); }};//now, let's instantiate and use one objectvar myTalker = new MySampleClass('hi there.');myTalker.showMessage(); //displays alert
Table 11. Class 对象
4.12. Ajax 对象
这个对象被用作其他提供AJAX功能的类的根对象。
Table 12. Ajax 对象
4.13. Ajax.Base 类
这个类是其他在Ajax对象中定义的类的基类。
Table 13. Ajax.Base 类
4.14. Ajax.Request 类
继承自 Ajax.Base
封装 AJAX 操作
Table 14. Ajax.Request 类
Table 15. Ajax.Request 类
4.15. options 参数对象
AJAX操作中一个重要的部分就是 options 参数。 本质上没有options类。任何对象都可以被传入,只要带有需要的属性。通常会只为了AJAX调用创建匿名类。
Table 16. options 参数对象
4.16. Ajax.Updater 类
继承自 Ajax.Request
当请求的url返回一段HTML而你想把它直接放置到页面中一个特定的元素的时候被用到。 如果url的返回<script> 的块并且想在接收到时就执行它的时候也可以使用该对象。含有脚本的时候使用 evalScripts 选项。
Table 17. Ajax.Updater 类
Table 18. Ajax.Updater 类
4.17. Ajax.PeriodicalUpdater 类
继承自 Ajax.Base
这个类重复生成并使用 Ajax.Updater 对象来刷新页面中的一个元素。或者执行 Ajax.Updater 可以执行的其它任务。更多信息参照 Ajax.Updater 参考 。
Table 19. Ajax.PeriodicalUpdater 类
Table 20. Ajax.PeriodicalUpdater 类
4.18. Element 对象
这个对象提供在操作DOM中元素时使用的功能性方法。
Table 21. Element 对象
4.19. Abstract 对象
这个对象是这个程序包中其他类的根。它没有任何属性和方法。在这个对象中定义的类可以被视为传统的抽象类。
4.20. Abstract.Insertion 类
这个类被用作其他提供动态内容插入功能的类的基类,它像一个抽象类一样被使用。
Table 22. Abstract.Insertion 类
Table 23. Abstract.Insertion 类
4.21. Insertion 对象
这个对象是其他类似功能的根。它没有任何属性和方法。在这个对象中定义的类仍然可以被视为传统的抽象类。
4.22. Insertion.Before 类
继承自 Abstract.Insertion
在给定元素开始标记的前面插入HTML。
Table 24. Insertion.Before 类
下面的代码
<br>Hello, <span id="person" style="color:red;">Wiggum. How's it going?</span><script> new Insertion.Before('person', 'Chief '); </script>
将把 HTML 变为
<br>Hello, Chief <span id="person" style="color:red;">Wiggum. How's it going?</span>
4.23. Insertion.Top 类
继承自 Abstract.Insertion
在给定元素第一个子节点位置插入 HTML。内容将位于元素的开始标记的紧后面。
Table 25. Insertion.Top 类
下面的代码
<br>Hello, <span id="person" style="color:red;">Wiggum. How's it going?</span><script> new Insertion.Top('person', 'Mr. '); </script>
将把 HTML 变为
<br>Hello, <span id="person" style="color:red;">Mr. Wiggum. How's it going?</span>
4.24. Insertion.Bottom 类
继承自 Abstract.Insertion
在给定元素最后一个子节点位置插入 HTML。内容将位于元素的结束标记的紧前面。
Table 26. Insertion.Bottom 类
下面的代码
<br>Hello, <span id="person" style="color:red;">Wiggum. How's it going?</span><script> new Insertion.Bottom('person', " What's up?"); </script>
将把 HTML 变为
<br>Hello, <span id="person" style="color:red;">Wiggum. How's it going? What's up?</span>
4.25. Insertion.After 类
继承自 Abstract.Insertion
在给定元素结束标记的后面插入HTML。
Table 27. Insertion.After 类
下面的代码
<br>Hello, <span id="person" style="color:red;">Wiggum. How's it going?</span><script> new Insertion.After('person', ' Are you there?'); </script>
将把 HTML 变为
<br>Hello, <span id="person" style="color:red;">Wiggum. How's it going?</span> Are you there?
4.26. Field 对象
这个对象提供操作表单中的输入项目的功能性方法。
Table 28. Field 对象
4.27. Form 对象
这个对象提供操作表单和他们的输入项目的功能性方法。
Table 29. Form 对象
4.28. Form.Element 对象
这个对象提供表单对象中的可视和非可视元素的功能性方法。
Table 30. Form.Element 对象
4.29. Form.Element.Serializers 对象
这个对象提供了内部使用的用来协助解析出表单元素的当前值功能性方法。
Table 31. Form.Element.Serializers 对象
4.30. Abstract.TimedObserver 类
这个类是用于其它监听一个元素的值(或者任何类中涉及的属性)变化的类的基类,这个类像一个抽象类一样被使用。
子类可以被创建来监听如输入项目值,或style属性,或表格的行数,或者其他任何对跟踪变化相关的东西。
子类必须实现这个方法来决定什么才是被监听的元素的当前值。
Table 32. Abstract.TimedObserver 类
Table 33. Abstract.TimedObserver 类
4.31. Form.Element.Observer 类
继承自 Abstract.TimedObserver
Abstract.TimedObserver 的一个实现类用来监听表单输入项目的值的变化。当你想监听一个没有带报告值变化事件的元素的时候使用这个类。否则的话使用 Form.Element.EventObserver 类代替。
Table 34. Form.Element.Observer 类
4.32. Form.Observer 类
继承自 Abstract.TimedObserver
Abstract.TimedObserver 的一个实现类用来监听表单中任何数据项的值的变化。当你想监听一个没有带报告值变化事件的元素的时候使用这个类。 否则的话使用类Form.EventObserver 代替。
Table 35. Form.Observer 类
4.33. Abstract.EventObserver 类
这个类被用作其他一些类的基类,这些类具有在一个元素的值改变事件发生的时候执行一个回调方法这样的功能。
类 Abstract.EventObserver 的多个对象可以绑定到一个元素上,不是一个帮其他的擦出了,而是按照他们付给元素的顺序执行这些回调方法。
单选按钮和复选框的触发事件是 onclick ,而文本框和下拉列表框/下拉列表框的是 onchange 。
子类必须实现这个方法来决定什么才是被监听的元素的当前值。
Table 36. Abstract.EventObserver 类
Table 37. Abstract.EventObserver 类
4.34. Form.Element.EventObserver 类
继承自 Abstract.EventObserver
Abstract.EventObserver 的一个实现类,它在监测到表单中数据项元素的值改变的相应事件时候执行一个回调方法。 如果元素没有任何报告变化的事件,那么你可以使用 Form.Element.Observer 类代替。
Table 38. Form.Element.EventObserver 类
4.35. Form.EventObserver 类
继承自 Abstract.EventObserver
Abstract.EventObserver 的一个实现类,监听表单对象中包含的任何对象的任何变化,用元素的事件检测值的变化。如果元素没有任何报告变化的事件, 那么你可以使用Form.Observer 类代替。
Table 39. Form.Element.EventObserver 类
4.36. Position 对象 (预备文档)
这个对象提供许多和元素位置相关的方法。
Table 40. Position 对象 (预备文档)
- prototype.js开发笔记
- prototype.js开发笔记
- prototype.js开发笔记
- prototype.js开发笔记
- prototype.js开发笔记
- prototype.js开发笔记
- prototype.js开发笔记
- prototype.js开发笔记
- prototype.js开发笔记
- prototype.js开发笔记
- prototype.js开发笔记
- prototype.js开发笔记
- prototype.js开发笔记
- prototype.js开发笔记
- prototype.js开发笔记
- prototype.js开发笔记
- prototype.js开发笔记
- prototype.js开发笔记
- 怎样在Web开发中完美控制IE标题栏 (转)
- 安装MPICH和配置SSH
- 常见的蔬菜
- 刚验证的ieee帐号
- DOS文件格式转换成unix文件格式
- prototype.js开发笔记
- 唉,又捡回来了,
- Microsoft 公司 interview 時的問題!!!----三个灯泡
- 武林外传经典对话
- 在Main Thread之外的线程中更新Control的属性
- 脑筋急转弯
- Ant 和 Junit 的复用
- asp.net 防注入
- 接口和抽象类的区别