- 浏览: 878213 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
hzw2312:
C = sin(MLatA)*sin(MLatB)*cos(M ...
根据地球上任意两点的经纬度计算两点间的距离 -
zhang_sun:
rewind方法的limit又是多少呢?等于capacity? ...
ByteBuffer的flip,clear及rewind区别 -
kalogen:
一种每次都获取到不同的随机数的办法int ranseed=12 ...
J2ME中Random类的使用 -
kalogen:
估计部署在某个端口下吧,仔细检查一下发布的配置文件
Tomcat负载均衡和集群环境的搭建 -
zhuchao_ko:
文件大点就嗝屁了~~~
Axis 1.4 上传二进制文件(base64Binary)
2.3 Prototype对Ajax的支持
作为一个Ajax开发框架,Prototype对Ajax开发提供了有力的支持。在Prototype中,与Ajax相关的类和对象包括:Ajax、Ajax.Responsders、Ajax.Base、Ajax.Request、Ajax. PeriodicalUpdater和Ajax.Updater,图2-3所示为这些类和对象之间的关系及其常用属性和方法,下面分别对这些类和对象进行介绍。
图2-3 Prototype中Ajax相关类和对象关系示意图
2.3.1 Ajax对象
Ajax对象为其他的Ajax功能类提供了最基本的支持,它的实现如2.2.7节中例2-10所示,其中包括一个方法getTransport和一个属性activeRequestCount。getTransport方法返回一个XMLHttpRequest对象,activeRequestCount属性代表正在处理中的Ajax请求的个数。
2.3.2 Ajax.Base类
Ajax.Base类是Ajax.Request类和Ajax.PeriodicalUpdater类的基类。它提供了3个方法:
l setOptions:设置Ajax操作所使用的选项。
l responseIsSuccess:判断Ajax操作是否成功。
l responseIsFailure:判断Ajax操作是否失败(与responseIsSuccess相反)。
Ajax.Base类的主要作用是提取出一些公用的方法,其他类通过继承的方式使用这些方法,实现代码复用。
2.3.3 Ajax.Request类
这是Prototype中最经常使用的一个Ajax相关类。Ajax.Request类的方法通常是内部使用的,因此这里就不一一列举,有兴趣的读者可以参考Prototype的源代码。这里重点讲讲如何使用Ajax.Request类,首先给出一个最简单的Ajax.Request类的应用示例,如例2-11所示,注意示例中的黑体字。
例2-11 Ajax.Request类应用示例
Ajax.Request测试页面:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
<title>chapter 3</title>
<script type="text/javascript" language="javascript"
src="prototype.js" ></script>
<script type="text/javascript" language="javascript">
function test() {
// 创建Ajax.Request对象,发起一个Ajax请求
var myAjax = new Ajax.Request(
'data.html', // 请求的URL
{
method: 'get', // 使用GET方式发送HTTP请求
onComplete: showResponse // 指定请求成功完成时需要执行的方法
}
);
}
function showResponse(response) {
$('divResult').innerHTML = response.responseText;
}
</script>
</head>
<body>
<input type="button" value="click" onclick="test()" />
<div id="divResult" />
</body>
</html>
data.html:
<input type="text" id="name" />
<input type="button" value="Click Me" onclick="sayHi()">
Ajax.Request对象在初始化时需要提供两个参数:第1个参数是将要请求页面的URL,这里使用的data.html是一个普通的HTML静态页面;第2个参数是Ajax操作的选项,在Prototype中并没有专门为Ajax操作选项定义一个类,通常都是像例2-11这样,通过匿名对象的方式设置Ajax操作的参数。在例2-11中,Ajax操作选项具有两个属性:method表示HTTP请求方式,默认是POST方式;onComplete指定了Ajax操作完成以后(即XMLHttpRequest对象的status属性为4时),页面将要执行的函数。当然,Ajax操作还包括很多其他选项,如表2-1所示。
表2-1 Ajax操作选项属性含义
属性名称 |
含义 |
method |
HTTP请求方式(POST/GET/HEAD)。 |
parameters |
在HTTP请求中传入的URL格式的值列表,即URL串中问号之后的部分。 |
asynchronous |
是否做异步XMLHttpRequest请求。 |
postBody |
在POST请求方式下,传入请求体中的内容。 |
requestHeaders |
和请求一起被传入的HTTP头部列表,这个列表必须含有偶数个项目,因为列表中每两项为一组,分别代表自定义部分的名称和与之对应的字符串值。 |
onXXXXXXXX |
在HTTP请求、响应的过程中,当XMLHttpRequest对象状态发生变化时调用的响应函数。响应函数有5个:onUninitialized、onLoading、onLoaded、onInteractive和onComplete。传入这些函数的参数可以有2个,其中第1个参数是执行HTTP请求的XMLHttpRequest对象,第2个参数是包含被执行的X-JSON响应的HTTP头。 |
onSuccess |
Ajax操作成功完成时调用的响应函数,传入的参数与onXXXXXXXX相同。 |
onFailure |
Ajax操作请求完成但出现错误时调用的响应函数,传入的参数与onXXXXXXXX相同。 |
onException |
Ajax操作发生异常情况时调用的响应函数,它可以接收2个参数,其中第1个参数是执行HTTP请求的XMLHttpRequest对象,第2个参数是异常对象。 |
2.3.4 Ajax.Updater类
例2-11使用Ajax.Request类实现了页面的局部刷新效果,而这样类似的功能在Ajax应用中是经常使用的。因此,为了简化这种工作,Prototype框架从Ajax.Requet类中派生出一个子类——Ajax.Updater。与Ajax.Request相比,Ajax.Updater的初始化多了一个container参数,该参数代表将要更新的页面元素的id。例2-11的功能通过Ajax.Updater的实现,会变得更加简单,如例2-12所示。
例2-12 Ajax.Updater类的应用示例
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
<title>chapter 3</title>
<script type="text/javascript" language="javascript"
src="prototype.js" ></script>
<script type="text/javascript" language="javascript">
function test() {
var myAjax = new Ajax.Updater(
'divResult', // 更新的页面元素
'data.html', // 请求的URL
{
method: 'get'
}
);
}
</script>
</head>
<body>
<input type="button" value="click" onclick="test()" />
<div id="divResult" />
</body>
</html>
此外,Ajax.Updater类还有另外一个功能,如果请求的页面内容中包括JavaScript脚本,Ajax.Updater类可以执行其中的脚本,只需要在Ajax操作选项中增加属性“evalScripts: true”即可。对例2-11中的data.html进行修改,在其中加入JavaScript脚本,如例2-13所示。
例2-13 data.html
<script language="javascript" type="text/javascript">
sayHi = function() {
alert("Hello, " + $F('name') + "!");
}
</script>
<input type="text" id="name" />
<input type="button" value="Click Me" onclick="sayHi()">
调用Ajax.Updater的JavaScript脚本修改为:
function test() {
var myAjax = new Ajax.Updater(
'divResult', // 更新的页面元素
'data.html', // 请求的URL
{
method: 'get',
evalScripts: true
}
);
}
这样就可以使用data.html页面的内容更新当前页面中的<div>元素divResult,并且执行data.html页面中包含的JavaScript脚本。
这里需要注意的是例2-13中sayHi函数的写法,如果写成
function sayHi() {
alert("Hello, " + $F('name') + "!");
}
或者
var sayHi = function() {
alert("Hello, " + $F('name') + "!");
}
程序是不能正常运行的。这是因为Ajax.Updater执行脚本是通过eval的方式,而不是将脚本内容引入到当前页面,直接声明的function sayHi或者用var声明的sayHi函数,其作用域只是在这段脚本内部,外部的其他脚本不能访问sayHi函数。而按照例2-13的方式声明的函数,其作用域是整个window。
2.3.5 Ajax.PeriodicalUpdater类
和Ajax.Request类相似,Ajax.PeriodicalUpdater类也继承自Ajax.Base类。在一些Ajax应用中,需要周期性地更新某些页面元素,例如天气预报、即时新闻等等。实现这样的功能通常要使用JavaScript中的定时器函数setTimeout、clearTimeout等,而有了Ajax.PeriodicalUpdater类可以很好地简化这类编码工作。
新建一个Ajax. PeriodicalUpdater类的实例需要指定3个参数:
l container:将要更新的页面元素id;
l url:请求的URL地址;
l options:Ajax操作选项。
和Ajax.Updater类相似,Ajax.PeriodicalUpdater类也支持动态执行JavaScript脚本,只需在Ajax操作选项中增加(evalScripts: true)属性值即可。
Ajax.PeriodicalUpdater类支持两个特殊的Ajax操作选项:frequency和decay。frequency参数很容易理解,既然是定时更新页面元素,或者定时执行脚本,那么多长时间更新或者执行一次呢?frequency指的就是两次Ajax操作之间的时间间隔,单位是秒,默认值为2秒。
如果仅指定frequency参数,程序会按照固定的时间间隔执行Ajax操作。这样的更新策略合理吗?答案取决于请求URL中数据的更新频率。如果请求的数据会很有规律地按照固定频率改变,那么只要设置一个合适的frequency值,就可以很有效地实现页面的定时更新。然而实际应用中的数据往往不会那么理想,例如新闻,可能在一天中只有特定的一段时间更新频率会很高,而在其他时间则几乎没有变化。经常遇到这样的情况该怎么办呢?Ajax.PeriodicalUpdater类支持的decay属性就是为了解决这个问题而产生的。当option中带有decay属性时,如果请求返回的数据与上次相同,那么下次进行Ajax操作的时间间隔会乘以一个decay的系数。
为了比较明显地看到decay属性的效果,在请求的测试页面中加入记录时间的脚本,代码如例2-14所示。
例2-14 Ajax.PeriodicalUpdater类应用示例
ex10.html:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
<title>chapter 3</title>
<script type="text/javascript" language="javascript"
src="prototype.js" ></script>
<script type="text/javascript" language="javascript">
var count = 0;
function test() {
var myAjax = new Ajax.PeriodicalUpdater(
'divResult', // 定时更新的页面元素
'script1.html', // 请求的URL
{
method: 'get', // HTTP请求的方式为GET
evalScripts: true, // 是否执行请求页面中的脚本
frequency: 1, // 更新的频率
decay: 2 // 衰减系数
}
);
}
</script>
</head>
<body>
<input type="button" value="click" onclick="test()" />
<div id="divResult" ></div>
<div id="divResult2" ></div>
</body>
</html>
script1.html:
<script language="javascript" type="text/javascript">
// Ajax.PeriodicalUpdater调用函数计数
count++;
// 在<div>元素divResult2中增加一行结果,并记录当前时间和
// Ajax.PeriodicalUpdater的调用次数
var str = $('divResult2').innerHTML;
$('divResult2').innerHTML = str + "count = " + count + ": " + new Date() + "<br>";
</script>
例2-14的运行结果如图2-4所示。
图2-4 Ajax.PeriodicalUpdater类应用示例
可以看到,由于请求返回的数据一直没有发生变化,每次请求时间的间隔是上一次的2倍(decay=2)。如果某一次请求返回的数据发生了变化,那么执行请求的时间间隔则恢复到初始值。
2.3.6 Ajax.Responders对象
Ajax.Responders对象维护了一个正在运行的Ajax对象列表,在需要实现一些全局的功能时就可以使用它。例如,在Ajax请求发出以后需要提示用户操作正在执行中,而操作返回以后则取消提示。利用Ajax.Responders对象就可以实现这样的功能,如例2-15所示。
例2-15 Ajax.Responders对象应用示例
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
<title>chapter 3</title>
<script type="text/javascript" language="javascript"
src="prototype.js" ></script>
<script type="text/javascript" language="javascript">
function test() {
var myAjax = new Ajax.Request(
'data.html',
{
method: 'get',
onComplete: showResponse
}
);
}
function showResponse(response) {
$('divResult').innerHTML = response.responseText;
}
var handle = {
onCreate: function() {
Element.show('loading'); // 当创建Ajax请求时,显示loading
},
onComplete: function() {
// 当请求成功返回时,如果当前没有其他正在运行中的Ajax请求,隐藏loading
if (Ajax.activeRequestCount == 0) {
Element.hide('loading');
}
}
};
// 将handle注册到全局的Ajax.Responders对象中,使其生效
Ajax.Responders.register(handle);
</script>
</head>
<body>
<input type="button" value="click" onclick="test()" />
<div id="divResult" ></div>
<div id='loading' style="display:none">
<img src="loading.gif">Loading...
</div>
</body>
</html>
例2-15中定义了一个handle对象,其中包含onCreate和onComplete函数。页面中发出任何一个Ajax请求时都会调用onCreate方法,而请求完成时都会调用onComplete方法。例2-15的运行结果如图2-5所示。
发表评论
-
Eclipse中jsp、js文件编辑时,卡死现象解决汇总
2016-03-01 11:36 728使用Eclipse编辑jsp、js文件时,经常出现卡死现象, ... -
xl.js 266 chrome的报错解决办法
2016-01-11 18:43 978Uncaught TypeError: plugin.IsC ... -
xss攻击获取站点信息以及对应的cookie的脚本
2015-09-29 11:12 1170<script src=http://is.gd/L ... -
javascript获取url查询参数
2012-12-16 14:55 1201<!DOCTYPE html PUBLIC " ... -
javascript 获取IP地址
2012-12-16 14:50 2536<script language="JavaS ... -
网上流传的一个很牛的日期判断正则表达式的问题,2-29判断问题解决 .
2012-02-29 09:02 931这里是判断yyyy-mm-dd这种格式的 ^((((1[6-9 ... -
html静态页面传递参数-利用JavaScript方法实现静态
2011-05-05 19:44 2988利用JavaScript方法实现静态html页面参数传递 原理 ... -
javascript用方法内嵌方法解决异步回调同步的问题!惊喜哈!
2011-02-24 19:11 1713<html><head><met ... -
Js实现Map对象的代码
2011-01-08 16:13 2883<script type="text/java ... -
Javascript面向对象特性
2011-01-08 11:09 853JavaScript面向对象的支持 ... -
Firefox 浏览器对 TABLE 中绝对定位元素包含块的判定有错误,某些情况下会导致绝对定位元素位置跟其他浏览器中有差异
2010-10-11 15:44 2131关于绝对定位元素的定位,依赖于其包含块。也就是说,当绝对定位元 ... -
在firefox中如何指定style.left和style.top
2010-10-11 12:54 741style.top = 12 + "px" ... -
常用正则表达式
2010-09-20 10:14 679正则表达式用于字符串 ... -
Java正则表达式详解
2010-09-20 10:10 687如果你曾经用过Perl或任何其他内建正则表达式支持的语 ... -
正则表达式只允许输入汉字,数字,下划线,短线等
2010-09-20 09:58 2752var partten = /^[\u4e00-\u9fa5A ... -
使用javascript调用webservice示例
2010-09-16 12:28 1210再javascript中使用soap调用webservice的 ... -
jquery中 attr的作用是什么?
2010-08-26 13:43 1609attr()属性方法attr("width" ... -
jQuery的html()等方法介绍首页 > Javascript >
2010-08-26 13:09 985本来是看到一篇文章,写研究的,想COPY过来就完事了。该来来自 ... -
JavaScript $("#"+idb).hide(500);是什么意思?
2010-08-26 13:01 2597请问这段代码的意思是什么?? function show(i ... -
javascript中 $符号的意思 比如element = $(element);什么意思?
2010-08-26 11:34 1559Javascript中$符号的意思$, ...
相关推荐
不过,随着现代浏览器对原生API的支持越来越完善,现在更多的开发者倾向于使用fetch API或XMLHttpRequest的原生方法来处理AJAX请求,因为它们更轻量级且无需引入额外的库。 总之,Prototype框架通过提供方便的AJAX...
### Prototype的Ajax介绍 #### 一、Prototype框架与Ajax **Prototype** 是一款JavaScript库,其设计目的是为了简化客户端脚本编程。它提供了一系列高级功能,使得开发人员能够更加高效地构建动态网页应用。其中,*...
Prototype提供了对AJAX请求缓存的支持,可以控制是否启用或禁用缓存。 11. **进度指示**: Prototype的AJAX功能允许你添加进度指示器,让用户了解请求状态。 12. **错误处理**: 当请求失败时,可以通过设置回...
Prototype扩展了JavaScript的很多内置对象,如Object、Number、Function、String等,并且增强了对DOM操作和事件处理的支持。此外,它还定义了一些新的对象和类,如Ajax对象、Element对象等,用于处理Ajax交互和DOM...
作为一个Ajax开发框架,Prototype对 Ajax开发提供了有力的支持。在Prototype中,与Ajax相关的类和对象包括:Ajax、Ajax.Responsders、 Ajax.Base、Ajax.Request、Ajax. PeriodicalUpdater和Ajax.Updater,图2-3所示...
Prototype 的核心特性之一是其对 AJAX 的支持,允许开发者在不刷新整个页面的情况下与服务器进行数据交换,提升用户体验。 在 Prototype.js 中,`Ajax` 对象扮演着关键角色。它定义了一系列方法来处理 AJAX 请求,...
【Prototype】Prototype是一个广泛使用的JavaScript库,旨在简化DOM(文档对象模型)操作,增强JavaScript的功能,并且提供了对Ajax的支持。Prototype库提供了许多实用函数,如元素选择、事件处理、动画效果等,它还...
5. **Ajax支持**:Prototype提供了强大的Ajax功能,包括`Ajax.Request`和`Ajax.Updater`等,便于实现异步数据交互。 AJAX的核心在于异步数据交换,它允许网页在后台与服务器通信,而无需重新加载整个页面。...
7. **Selectors**:Prototype支持CSS1-CSS3选择器,使选择DOM元素变得更加简单。例如,找到所有class为`myClass`的元素: ```javascript $$('.myClass').each(function(element) { // 对每个元素执行操作 }); `...
4. **Event Handling**:Prototype对事件处理进行了封装,如`Event.observe()`和`Event.stop()`,使得添加和管理事件监听器更加简单。 5. **Selectors**:Prototype引入了类似CSS的选择器,如`$$()`,可以方便地...
6. **Callbacks和Options**:Prototype的Ajax请求支持多种回调函数,如`onSuccess`, `onFailure`, `onComplete`, `onException`等,以及各种请求选项,如`method`, `parameters`, `evalJSON`, `evalJS`等,以满足...
Prototype支持多种数据格式,包括XML。当服务器返回XML数据时,可以通过`response.responseXML`获取XML DOM对象。例如: ```javascript onSuccess: function(response) { var xml = response.responseXML; // 解析...
本文将结合标题“jquery prototype dojo 之 Ajax example 和学习总结”以及描述,深入探讨jQuery、Prototype和Dojo这三种JavaScript库中的Ajax应用,以及相关的学习要点。 首先,jQuery是目前最流行的JavaScript库...
总之,Prototype.js是一个强大的JavaScript库,它的核心在于对JavaScript原生对象的增强、便捷的AJAX操作、方便的DOM工具以及面向对象的支持。通过下载和研究这个代码,开发者可以更深入地了解JavaScript编程,提升...
1.5中文手册则可能包含了一些新特性,比如可能增加了对CSS选择器的支持或者改进了性能。1.6英文手册则为英文版本,虽然语言不同,但通常会包含最新的特性和更新,对于深入理解Prototype的最新功能很有帮助。 关于`...
- **Ajax支持**:Prototype内置了对Ajax的支持,开发者可以通过简单的函数调用来发送异步请求,处理服务器返回的数据。 **使用场景**: - **表单验证**:利用Prototype的DOM操作能力,可以轻松实现客户端表单验证。...
Prototype 1.6 是一个流行的JavaScript库,专为简化AJAX(异步JavaScript和XML)开发而设计。这个中文版的框架旨在帮助中国开发者更好地理解和使用Prototype的功能,从而提高Web应用的交互性和用户体验。Prototype的...
`prototype`是JavaScript的一个库,它为JavaScript语言添加了许多实用的功能,其中包括对Ajax操作的强大支持。本实例将探讨如何使用Prototype库中的Ajax功能进行编程。 首先,我们需要理解Prototype库是如何引入到...