什么是Prototype
Prototype 是由 Sam
Stephenson 开发的一个 Javascript 类库,也是其他框架的鼻祖。其对现有的部分 Javascript 对象比如 Object 、 Function 、 Dom 、String 等进行扩展,并且对 Ajax 应用进行封装,借此提供了兼容标准的更加易于使用的类库,极大的方便开发人员快速创建具备高度交互性的 Web2.0 胖客户端应用程序。
Prototype 最初的目标是应用于 Ruby 领域的,不过由于优秀的表现和完美的封装以及服务器语言无关性,现在已经被应用到各个领域,包括 Java 、 .NET、 PHP 等。不过在 Prototype 的源码中,还是可以找到 Ruby 的影子,比如 Ruby 样式的 Array 对象枚举。
正如之前提到的, Prototype 是一个底层的远程调用包,虽然其仅仅是一个千余行的 Javascript 文件,但是它为其他框架提供了最底层的 Javascript 扩展和 Ajax 封装。其他 Javascript 程序库在其基础上构建了更加高级的功能和 UI 效果,比如 Script.aculo.us 。
Prototype 目前的最新版本是 1.4 , 1.5 也已经提供了 pre 版本,其官方网站提供了最新版本的下载,包括 zip 包、 js 文件和 Subvision 源码。不过和其他版本一样, Prototype 官方网站并未提供完整的参考文档,开发者只能通过阅读源码掌握其功能。可喜的是,网上已经流传着不少关于 Prototype 源码解读和使用的文档,这在一定程度上弥补了 Prototype 官方文档不足的遗憾。
2.2 软件组织架构以及应用
Prototype 主要包括三个内容:一是提供了一些全局性的函数,替代原先烦琐重复的代码;二是对现有 Javascript 、 DOM 对象的扩展,提供访问公共函数的捷径;三是对 Ajax 应用的封装,使得开发 Ajax 应用更加容易和快速。
全局性的函数,比较有代表性的 $ 系列函数和 Try.these() 函数。
$() 函数是用于替代在 DOM 中频繁使用的 document.getElementById() 方法的,其返回参数传入的 id 所指向的元素。不过,其允许传入多个 id 作为参数,然后返回一个其 id 指向的元素的 Array 对象。
$F() 函数则用于返回任何表单输入控件的值,比如文本框、文本区域、下拉列表,其也是以元素的 id 或者元素本身作为参数。不过,必须注意的是, id 所指向的元素必须支持 value 属性,比如文本框。如果 id 指向一个按钮,那自然就得不到所要的 value 值。
$A() 函数能够将其接受到的任何可枚举列表转化成为一个 Array 对象,比如将 string 字符串转化成 Array 数组。 $H() 函数则将传入的对象转换成一个可枚举的和联合数组类似的 Hash 对象。 $R() 函数是 new ObjectRange(lowBound, upperBound, excludeBounds) 的缩写和替代。
Try.thiese() 方法以一系列的函数作为参数,按照顺序一个一个的执行,返回第一个成功执行的函数的返回值。这使得想调用不同的方法直到其中一个成功执行的需求变得容易和直观。否则我们就得变通的用 if else 去判断了。典型的比如在保证浏览器兼容的情况下实例化 XHR 对象。
Prototype 对 Javascript 的 Object 、 Number 、 Function 、 String 、 Array 、 Event 等对象进行了扩展,创建了一些新的对象和类,并在此基础上提供了很多有用的公共函数,比如 each() 、 any() 、 collect() 等。
Prototype 另外一个值得称道的是对 Ajax 的封装和简化,这也是 Prototype 吸引我们的另外一个重要之处。 Prototype 的 Ajax 功能主要由 Ajax.Request 和 Ajax.Updater 两个类完成。
在没有使用 Prototype 之前,我们需要创建 XHR 对象实例并且异步的跟踪其进程,在回调函数中使用 DOM 解析其返回的响应数据并且处理后更新页面。而 Ajax.Request 类提供了完成这一系列步骤的捷径。我们只需要将目标 URL 、 URL 参数、 http 请求方法类型、回调函数名称等一股脑的传递给 Ajax.Request 类即可。
Ajax.Request 类是针对需要解析服务器返回的响应数据的情况。而如果服务器返回的信息已经是 HTML 格式,只需要填充到某个 HTML 控件中,则可以使用 Ajax.Updater 类。其调用 innerHTML 直接将 HTML 代码填充到指定的 HTML 控件内部。
难得可贵的是,以往我们需要判断 XHR 的 readyState 和 status 值来获取 http 请求的状态并且作出相应的处理,以便应付请求失败的情况;而 AjaxRequest 和 Ajax.Updater 类提供了 onComplete 来替代这些烦琐的判断,其只需要简单的在请求的选项参数中的名为 onXXXX 属性 / 方法中提供自定义的方法对象即可。
接下来,我们使用 Prototype1.4 ,列举一二,体验一下 Prototype 的主要功能及其所带来的便捷。
2.3 循序渐近
从 Prototype 官方网站 http://prototype.conio.net/ 下载最新的开发包 prototype-1.4.0.js ,放到应用程序目录中,通过 <script> 代码引入 Prototype 程序库:
<script
language="javascript" type="text/javascript"
src="prototype-1.4.0.js"></script>
2.3.1 $ 系列函数体验
在 Prototype 出现之前,我们使用这种方式定位页面上的某个 HTML 元素及其值:
var myElement =
document.getElementById(“your element's id”);
var myValue =
document.getElementById(“your element's id”).value;
现在,可以分别使用 $() 函数和 $F() 函数来代替,例程 1 展示 $() 和 $F() 函数的用法:
var myElement =
$(“your element's id”);
var myValue =
$F(“your element's id”);
例程 1 : $() 和 $F() 函数的用法
<p>Username:<input
type="text" name="txtUsername"
value="Jimmy"></p>
<p>
<input
type="button" name="$Test" value=" $ "
onClick="window.alert($('txtUsername'))">
<input
type="button" name="$FTest" value=" $F "
onClick="window.alert($F('txtUsername'))">
</p>
$A() 函数则将其接收到的可枚举的任何参数转化成为一个 Array 对象。结合 Prototype 对 Array 的扩展, $A() 能够提供更加强大的功能。例程 2 使用 $A() 函数获取页面中的全部 input 类型的控件,并使用扩展后的 each() 函数遍历全部的控件。
例程 2 : $A() 函数的用法
<script
language="javascript" type="text/javascript">
/*$A 函数体验 */
function do$ATest() {
var nodeList = document.getElementsByTagName("input");
var nodeArray = $A(nodeList);
var message = " 全部 input 控件: \r\n";
nodeArray.each(
function(node) {
message += node.type + "|" + node.name +
"|" + node.value + "\r\n";
}
);
window.alert(message);
}
</script>
<input
type="button" name="$ATest" value=" $A "
onClick="do$ATest()">
2.3.2 Try.these() 函数的妙用
我们知道, XHR 是 Ajax 的核心之一。但是各个浏览器对 XHR 的实现不同, IE 浏览器的各个版本对 XHR 的支持也有所差异。为了保证 Ajax 的浏览器兼容性,在实例化 XHR 对象的时候,通常要使用 try/catch 对兼容性进行判断。比如例程 3 所示。
例程 3 :使用 try/catch 块实例化 XHR
var xhr = null;
if(window.XMLHttpRequest)
{
xhr = new
XMLHttpRequest();
if(xhr.overrideMimeType)
xhr.overrideMimeType(“text/xml”);
}
else
if(window.ActiveXObject) {
try {
xhr = new ActiveXObject(“Msxml2.XMLHTTP”);
}catch(e) {
try {
xhr = new ActiveXObject(“Microsoft.XMLHTTP”);
}catch(e){}
}
}
而现在,使用 Try.these() 函数,这些烦琐的过程变得异常简单。
例程 4 :使用 Try.these() 函数实例化 XHR
function
doInitialXHR() {
return Try.these(
function() {return new ActiveXObject('Msxml2.XMLHTTP')},
function() {return new ActiveXObject('Microsoft.XMLHTTP')},
function() {return new XMLHttpRequest()}
) || false;
}
2.3.3 对集合类的遍历
之前提过, Prototype 最初的应用领域是 Ruby 。 Ruby 为遍历集合中的元素提供了一系列快捷的方法,使得执行维护、查找、收集、删除其中的元素更加快速。 Prototype 新建了一个 Enumerable 对象,为 Javascript 提供类似 Ruby 的功能。
在 Ruby 、 .NET 语言中,都支持使用 each 关键词对集合中的元素进行遍历。在 Enumberable 对象中,还有很多方法比如 all() 、 any() 、 collect() 等都是基于 each() 方法实现的。所以, each() 方法是操作集合元素的基础。
each() 方法使用 iterator 依次获取集合中的每个元素,并将其作为匿名函数的参数;也可以在该匿名函数中加上可选参数 index ,获取当前元素的索引值。其实在例程 2 中,我们已经使用了 each() 方法。
例程 5 使用 each() 方法,对一个保存货物价格的数组进行遍历,显示价格及其索引值。
例程 5 :使用 each() 方法遍历集合
function doEachTest()
{
var prices = [100.2, 445, 552.3, 56.0];
prices.each(
function(price, index) {
window.alert("Value:" + price + "|
Index:" + index);
}
);
}
2.3.4 P rototype 的Ajax体验
Prototype 将 Ajax 应用封装为 Ajax.Request 和 Ajax.Update 类。使用这两个类,可以应付大部分的 Ajax 应用,而且不需要烦琐的实例化 XHR 、监控请求状态的过程。
假设我们将书籍的信息保存在一个 XML 文档中,如例程 6 所示。
例程 6 :保存书籍信息的 XML 文档
<?xml
version="1.0" encoding="gb2312"?>
<books>
<book>
<title>Ajax bible</title>
<pages>500</pages>
</book>
<book>
<title>Build with Ant</title>
<pages>632</pages>
</book>
<book>
<title>Google</title>
<pages>934</pages>
</book>
</books>
现在,我们使用 Ajax.Request 类去获取这个 XML 文档的内容,并将其显示出来。例程 7 展示了这一过程。
例程 7 :使用 Ajax.Request 获取 XML 文档内容
<script
language=”javascript” type=”text/javascript”>
/*Ajax.Request 类体验 */
function
doAjaxRequest() {
var url = "books.xml";
var myAjax = new Ajax.Request(
url,
{
method:"get",
onComplete:showResponse
}
);
}
/*Ajax.Request 类回调函数 */
function
showResponse(request) {
window.alert(request.responseText);
}
</script>
<input
type="button" name="ajaxRequest"
value="ajaxRequest" onClick="doAjaxRequest()">
例程 7 中, onComplete 指定的 showResponse 函数其实是 Ajax 的回调函数,通常在这个回调函数中完成对响应数据的解析和显示。而如果服务器端返回的是已经格式化后的 HTML 代码(这点在 Ruby 中很流行),则可以使用 Ajax.Updater 。例程 8 使用 Ajax.Updater 将服务器的响应数据填充到指定的 div 中。图 2 展示了使用 Ajax.Updater 的执行效果。
例程 8 :使用 Ajax.Updater 获取服务器的响应数据
<script
language=”javascript” type=”text/javascript”>
/*Ajax.Update 类体验 */
function
doAjaxUpdate() {
var url = "response.jsp";
var pars = "field=all&show=true";
var myAjax = new Ajax.Updater(
"divContent",
url,
{
method:"get",
parameters:pars
}
);
</script>
<input
type="button" name="ajaxUpdate"
value="ajaxUpdate" onClick="doAjaxUpdate()">
<p><div
id="divContent"></div></p>
例程 9 是例程 8 所请求的 JSP 文件。其简单的打印出加粗后的“ Ajax.Update ”字样。
例程 9 :
<%@ page
contentType="text/html; charset=gb2312"
language="java"
import="java.sql.*" errorPage="" %>
<%="<strong>Ajax.Update</strong>"%>
分享到:
相关推荐
Prototype 对 JavaScript 的基础对象进行了扩展,包括 Object、Function、DOM、String 等,使得这些对象更加易用和强大。此外,它还对 AJAX 应用进行了高度封装,让开发人员可以更快速地构建具有高度交互性的 Web2.0...
这个"Prototype Ajax学习范例"提供了一系列实例,旨在帮助开发者迅速掌握使用Prototype进行Ajax操作的技巧。 Ajax,即异步JavaScript和XML(Asynchronous JavaScript and XML),是一种在无需刷新整个网页的情况下...
1. **XMLHttpRequest对象**:这是Ajax的基础,它提供了在后台与服务器进行交互的能力。通过创建XMLHttpRequest对象,可以发送HTTP请求,并接收服务器返回的数据。在JavaScript中,可以通过`new XMLHttpRequest()`来...
在JavaScript的世界里,Prototype是一个非常流行的库,它极大地简化了DOM操作,并且为Ajax通信提供了便利。...学习Prototype和Ajax技术有助于提升Web应用的交互性和实时性,为用户提供更流畅的体验。
《疯狂Ajax讲义:Prototype/jQuery+DWR+Spring+Hibernate整合开发》是疯狂Java体系丛书之一,前8章基本以XHTML、JavaScript和DOM编程为主,无须任何基础即可阅读;第9章以后的内容则需要掌握Spring、Hibernate等Java ...
Scriptaculous是在Prototype基础上构建的一个JavaScript特效库,它提供了丰富的动画效果和用户交互组件。主要知识点包括: 1. **Effects**:Scriptaculous包含各种视觉效果,如淡入淡出(`Fade`)、滑动(`Slide`)...
本文将结合标题“jquery prototype dojo 之 Ajax example 和学习总结”以及描述,深入探讨jQuery、Prototype和Dojo这三种JavaScript库中的Ajax应用,以及相关的学习要点。 首先,jQuery是目前最流行的JavaScript库...
Prototype 1.6 是一个流行的JavaScript库,专为简化AJAX(异步JavaScript和XML)开发而设计。这个中文版的框架旨在帮助中国开发者更好地理解和使用Prototype的功能,从而提高Web应用的交互性和用户体验。Prototype的...
读者可以通过实际运行和修改这些代码,更好地理解和学习Ajax、Prototype和Scriptaculous的使用方法。 从标签"prototype"我们可以推断,该压缩包内的内容可能包含使用Prototype库进行Ajax开发的相关示例和练习。 ...
1. **入门指南**:介绍如何引入Prototype.js库,并演示基本的DOM操作和Ajax请求。 2. **DOM操作**:详细讲解`Element`对象的各种方法,如`insert`、`replace`、`wrap`等,以及`Selectors API`,用于高效的选择和...
Prototype是JavaScript库,它为浏览器环境提供了许多便利的功能,特别是在处理AJAX(异步JavaScript和XML)方面。...结合`ajaxPrototype.js`这样的示例文件,你可以更好地理解并实践Prototype的AJAX功能。
在本篇"prototype笔记(9)----结合Prototype和JSON开发AJAX"中,我们将深入探讨如何利用Prototype JavaScript库与JSON(JavaScript Object Notation)技术来高效地开发异步JavaScript应用程序,也就是我们常说的AJAX...
**一、Prototype库中的Ajax基础** Prototype是一个流行的JavaScript库,它为JavaScript提供了许多实用的工具和扩展,包括Ajax功能。在Prototype中,Ajax对象是通过`Ajax`模块提供的,它包含了多种方法来发起不同类型...
这个“prototype从入门到精通”的教程涵盖了从基础概念到高级特性的全面学习路径,旨在帮助开发者快速掌握并精通Prototype框架。 一、Prototype基础知识 1. **对象扩展**:Prototype的核心特性之一就是对...
- `Ajax.Request`:最基础的Ajax请求方式,可以用来发送任意类型的请求。 - `Ajax.Updater`:更新页面元素的Ajax请求方式,通常用于动态更新某个HTML元素的内容。 - `Ajax.PeriodicalUpdater`:周期性更新页面元素的...
对于想要学习Ajax的初学者,可以从基础的JavaScript语法和DOM操作入手,逐步理解Ajax的核心——XMLHttpRequest对象。接着,可以深入学习不同服务器端技术(PHP、ASP、JSP)与Ajax的集成,熟悉各种数据交换格式。随着...
一、Ajax基础 Ajax的核心是通过JavaScript与服务器进行异步通信,无需刷新整个页面就能获取或更新数据。它由以下关键组件构成: 1. XMLHttpRequest对象:负责创建与服务器的连接并发送请求。 2. JavaScript:编写...
同时,尽管Prototype提供了一些基础的DOM操作,但也可以与其他JavaScript库(如jQuery、React等)一起使用,以获取更全面的功能支持。 总的来说,Prototype设计模式和Prototype库是JavaScript开发中非常重要的概念...
《Prototype入门》 Prototype.js 是一个著名的JavaScript库,由Sam Stephenson编写,它极大地扩展了JavaScript的功能,并且对Ajax提供了良好的支持。这个库在Web开发领域具有很高的实用性和学习价值,特别适合B/S...
《疯狂Ajax讲义:Prototype/jQuery+DWR+Spring+Hibernate整合开发》是疯狂Java体系丛书之一,前8章基本以XHTML、JavaScript和DOM编程为主,无须任何基础即可阅读;第9章以后的内容则需要掌握Spring、Hibernate等Java ...