prototype 的ajax

原文:http://www.prototypejs.org/learn/introduction-to-ajax]
翻 译:www.ruby-china.cn 站长]

Prototype框架提供了非常容易和有意思的方法处理Ajax的调用,同时它也是浏 览器安全的 。除了简单的请求外,这个模块(指prototype里的Ajax)也能很聪明的处理从服务器返回 的javascript代码,并且提供了一个辅助的类不停的轮循。

Ajax的功能包含在了全局的Ajax对象里面。用于Ajax请求的 transport是xmlHttpRequest,它是从用户角度的对不同浏览器进行安全的抽象的结果。真正的请求是通过创建Ajax. Request对象的实例实现的。复制内容到剪贴板代码: new Ajax.Request('/some_url', { method:'get' });第一个参数是请求的地址,第二个是可选的哈希值。方法选项指定要使用的HTTP请求方法,默认是POST。

记住,由于安全的原 因(也就是防止跨站脚本攻击)Ajax请求只能被用在与包含这个Ajax请求页面相同的协议、主机与端口上。有些浏览器会允许任意的URL,但是你能不依 靠这个。

Ajax响应回调

Ajax请求默认是异步的,这也就意味着你必须要有回调函数能够处理返回的数据。回调方法 在发起请求的时候传给可选的哈希。复制内容到剪贴板代码:

new Ajax.Request('/some_url',
{
method:'get',
onSuccess: function(transport){
var response = transport.responseText || "no response text";
alert("Success! \n\n" + response);
},
onFailure: function(){ alert('Something went wrong...') }
});
这里两个回调函数传给了这个哈希值,分别表示成功与失败的警告。onSuccess和 onFailure根据返回的状态相应的被调用。第一个参数是原生的xmlHttpRequest对象,可以分别使用它的responseText和 responseXML属性。

你可以把两个回调都定义,也可以是一个或者没有,这全由你来定。其它的可以用的回调函数还有:
onUninitialized,
onLoading,
onLoaded,
onInteractive,
onComplete and
onException.


他们都与xmlHttpRequest的传输的某一个状态有关系,除了在分发其它回调时出现异常后引起的onException外。

还 有可以得到的就是onXXX的回调。这里XXX是HTTP的返回状态,象200或者404。需要注意的是,如果用这种方法,你的onSuccess和 onFailure就不会被调用了。因为onXXX有更高的优先级,因为这样做的话,表示你知道你在做什么。

而 onUninitialized、onLoading、 onLoaded和onInteractive这些回调函数并没有完全的被所有的浏览器实现出来。通过我们避免使用它们。

参数与 HTTP方法

你可以将请求参数象一个参数属性一样传递。复制内容到剪贴板代码:
new Ajax.Request('/some_url', {
method: 'get',
parameters: {company: 'example', limit: 12}
});那么参数会以company=example&limit=12的形式发出。

你可以使用GET/POST中的任一种。但是需要注意的是GET的请求不应该导到致数据发生变化
。浏览器很少会缓存POST请求,但是它往往会缓存GET请求。

参数属性的一个重要的应用是用Ajax请求发送一个FORM的内容,Prototype已经给了你一个
帮助的方法,叫做Form.serialize:复制内容到剪贴板代码:
new Ajax.Request('/some_url', {
parameters: $('id_of_form_element').serialize(true)
});如果你需要发送自定义的HTTP请求头,你可以用requestHeaders项来实现。只要作为
一个哈希或者用一个扁平的数组传入名字—值对就可以了。如:['X-Custom-1', 'value',
'X-Custom-2', 'other value'].

如果由于某种原因,你必须POST一个自定义的POST体(没有参数来自于参数项)的请求,有
一个postBody项就是为了这个目的设的。要注意的时,如果你使用postBody,那么你传进来
的所有的参数都不会被发送,因为postBody有更高的优先级。这样做的时候,你应该是清醒
的。

对javascript返回值求值

有时应用程序发送javascript代码作为响应。如果这个返回的Contenty-Type与Javascript
的MIME的类型是一样的,那么Prototype将会自动eval()返回的代码。你如果没有需要的话
,就不用显式的处理这个响应。

还有可能就是这个响应是一个X-JSON的头,那他的内容就会被解析,保存成立个对象并发送
给这些回调函数,当成第二个参数:复制内容到剪贴板代码:
new Ajax.Request('/some_url', { method:'get',
onSuccess: function(transport, json){
alert(json ? Object.inspect(json) : "no JSON object");
}
});可以用这个函数来取比较重要的数据,以避免解析XML返回的损耗。JSON比XML要更快
(当然也更轻)。

全局响应者

这里有一个对象在每次Ajax请求时都会被调用:Ajax.Responders。你可以用他来注册回调
函数在任何一个Ajax.Request状态发生时被触发:复制内容到剪贴板代码:
Ajax.Responders.register({
onCreate: function(){
alert('a request has been initialized!');
},
onComplete: function(){
alert('a request completed');
}
});每个与xmlHttpRequest的传输状态匹配的回调都可以放在这里,再带上一个onCreate。
象这样的全局的跟踪请求在不少方面是很有用的:你可以把它们记录下来以用于调试或者抛
出一个异常处理,来通过用户可能的连接问题。

用Ajax.Updater来动态更新你的页面
开发者经常想通过Ajax请求来接收HTML的片段来更新文档的部分内容。通过Ajax.Request的
onComplete回调是相当容易的,但是如果是用Ajax.Update就会变得更加容易。
假设你的HTML文档中有以下代码:复制内容到剪贴板代码:
<h2>Our fantastic products</h2>
<div id="products">(fetching product list ...)</div>'products'容器是空的,你
想把Ajax的响应的HTML返回值放到这里。没有问题:复制内容到剪贴板代码:
new Ajax.Updater('products', '/some_url', { method: 'get' });这就是全部,没有别
的其它工作。变量与Ajax.Request是一样的。除了第一个位置上多了一个接收元素。
Prototype会通过Element.update()来神奇的把响应更新到容器。

如果你的HTML里还有内含的一些脚本,默认情况下会被过滤掉,为了让你的脚本被执行,你
必须在evalScripts选项上传入真值。

那如果有错误发生,服务器返回一个错误信息而不是HTML,那会怎么样?一般来讲,你不会
想插入错误到用户需要内容的地方。幸运的时,prototype提供了一个方法的解决办法:你
现在在第一个参数里传入以这种形式{ success:'products', failure:'errors' }表示两个
不同的容器的哈希值,而不只是原来那一个。那么成功的话,内容就会被放在success的容
器上,错误就会被放在failure容器上。通过使用这些特性,你的界面就会变得更加用户友
好。

你也可能不想覆盖当前容器中的内容,而是想把新的HTML加在最前或者最后面。很好,你完
全可以这样做。只要把要插入的对象当成是插入参数传递给Ajax就可以了:复制内容到剪贴
板代码:
new Ajax.Updater('products', '/some_url', {
method: 'get',
insertion: Insertion.Top
});Ajax.Updater就会使用给定的对象在容器('products')元素里对返回的HTML执行插入
。漂亮的手法!


用Ajax.PeriodicalUpdater自动执行请求

你发现Ajax.Updater很酷,但是你还想定时的执行他从服务器取数据?Prototype框架也有
这个东西。这个东西就是Ajax.PeriodicalUpdater,它基本上就是定时的运行Ajax.
Updater。复制内容到剪贴板代码:
new Ajax.PeriodicalUpdater('products', '/some_url',
{
method: 'get',
insertion: Insertion.Top,
frequency: 1,
decay: 2
});两个新的参数是频率与衰退。频率就是请求产生的间隔,用秒表示。这里它是1秒,表
示Ajax每分钟请求一次。默认的频率是2秒。我们的用户可能会对应用有这么好的响应程序
感到非常高兴,但是我们的服务器可能性会承受非常大的压力,如果用户一直长时间开着浏
览器的话。这也是为什么有decay这个选项的原因。这是一个因子,通过它,频率会在每次
得到相同的返回内容时被加倍。第一次可能是1秒,然后是2秒,然后是4秒,然后是8这样一
直下去。当然,如果这个服务器一直返回不同的数据,decay就不会起作用。这个因子只在
你的内容基本上不变化了,返回的数据也基本相同时才起作用。

将频率调低可以明显减轻服务器的负担,因为无用的请求次数会减少。你可以用这个因子在
监视服务器的负载,或者你可以传进1来完全关掉它(1是默认值)或者省略掉。

转载于:https://www.cnblogs.com/trance/archive/2010/03/28/1698929.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/379296.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

汇编语言-018(FLD 、FST、FSTP、FCHS、FABS 、浮点运算符、浮点比较 )

1:FLD : FPU(浮点处理器)的加载浮点数到堆栈指令 .386 .model flat,stdcall.stack 4096 ExitProcess PROTO,dwExitCode:DWORD.data array REAL8 10 DUP(?) dblOne REAL8 234.56 dblTwo REAL8 10.1.code main PROCfld array …

mcq 队列_MCQ | 基础知识 免费和开源软件| 套装4

mcq 队列Q1. What do you call the technique of storing encrypted user passwords in Linux? Q1。 您如何称呼在Linux中存储加密的用户密码的技术? System Password Management 系统密码管理 Shadow Password 影子密码 Encrypted Password 加密密码 None of the…

将AX寄存器中的16位数据分成4组(从高到低),每组4位,然后把这4组数作为数当中的低4位分别放在AL,BL,CL,DL中。

将AX寄存器中的16位数据分成4组(从高到低),每组4位,然后把这4组数作为数当中的低4位分别放在AL,BL,CL,DL中。 P176 4.14 编程思路:首先用BX、DX存放AX,即原AX原BX原DX&…

一个很不错的wp企业站模板

http://zjuhpp.com/chinese-localization-of-business-wordpress-theme-devster.html转载于:https://www.cnblogs.com/i-kyle/archive/2012/09/13/2683817.html

著名的自由软件圣战- “KDE/QT .VS. Gnome/Gtk”

在 Unix 的图形界面一向是以 MIT 的 X Window 系统为标准, 可是在商业应用上有两大流派,一派是以 Sun 公司领导的 Openlook 阵营,一派是 IBM/HP 领导的OSF (Open Software Foundation) 的 Motif, 双方经过多年竞争之后&#xff0c…

汇编语言-019(汇编程序与c\c++相互调用)

1:在C程序中使用__asm块插入汇编代码程序(不能用LENGTHOF与SIZEOF运算符,而是LENGTH和SIZE) struct Package {long originZip; //4long destinationzip;//4float shippingPrice; //4 };int main(int argcount,char* args[]) {c…

kotlin 判断数字_Kotlin程序检查数字是偶数还是奇数

kotlin 判断数字Given a number N, we have to check whether it is EVEN or ODD. 给定数字N ,我们必须检查它是偶数还是奇数 。 Example: 例: Input:N 13Output:"ODD"Input:N 24Output:"EVEN"程序在Kotlin检查偶数或奇数 (Prog…

微机原理与接口技术(第2版)考点

第一章 1,微型计算机的特点: 功能强、可靠性高价格低廉系统设计灵活,适应性强体积小,重量轻,维护方便 2,微型计算机的硬件组成 微处理器内存储器I/O接口电路I/O设备系统总线 3,微机的工作过…

搜狗面试笔试一面二面全经历

09.25 华科西十二教,搜狗招聘笔试: C搜索引擎研发。同时有威盛、烽火两家笔试,就没有去。 09.26 华科校内某酒店,搜狗一面: 笔试做的不错,客观题错了3.5(20个),后两个算法…

UltraEdit语法高亮

语法加亮分支位于配置-编辑器显示之下,允许用户配置语法加亮选项:语法加亮可以识别预定词语,并用不同颜色显示它们。该功能对于程序员来说尤其有用,并且对那些想用不同颜色显示文档中词语的用户也非常有用。提供二十种…

线性代数 向量长度_用户定义长度的向量| 使用Python的线性代数

线性代数 向量长度Prerequisite: Defining a vector 先决条件: 定义向量 Linear algebra is the branch of mathematics concerning linear equations by using vector spaces and through matrices. In other words, a vector is a matrix in n-dimensional space…

顺序表(代码、分析、汇编)

目录:代码:分析:汇编:代码: SeqList.h #ifndef _SEQLIST_H_ #define _SEQLIST_H_ typedef void SeqList; //定义链表数据类型,void因为要适用不同链表数据类型 typedef void SeqListNode; //定义链表节…

设有两个16位整数变量A和B,试编写完成下述操作的程序。

设有两个16位整数变量A和B,试编写完成下述操作的程序。 (1)若有两个数中一个是奇数,则将奇数存入A中,偶数存入B中。 (2)若两个数均为奇数,则两数分别减1,并存回原变量中…

棋牌游戏服务器架构: 详细设计(三) 数据库设计

主要有3类Database: ServerInfoDB,UserInfoDB和GameDB。 ServerInfoDB主要存储的是游戏列表的信息,UserInfoDB存储玩家的全局信息,而GameDB就是积分以及积分变化情况。下面分别加以描述。 1. ServerInfoDB ServerInfoDB主要存储游戏列表信息。主要有以下几个表: 1. …

程序开发与性格特征

程序开发与性格特征 引言: 程序员给很多人的印象一般是不善于交际、表情严肃、思维紧密、做事认真、沉着冷静等等。那么这些特征到底和程序开发有没有关系呢?不同性格的人在团队开发当中将面临什么样的问题以及不同性格的人在团队开发中又将发挥着什么样…

汇编语言编写程序从1加到100要求使用循环结构。

汇编语言编写程序从1加到100要求使用循环结构。 汇编思路:AX用于存放每次累加的结果—>09998…0 首先,DATA段中定义SUM用来存放结果和,STACK段定义一个200DB类型空间,用来存放数据。CODE段,AX清0,CX赋值…

c语言指针++_C ++此指针| 查找输出程序| 套装3

c语言指针Program 1: 程序1&#xff1a; #include <iostream>using namespace std;class Test {int VAL;public:Test(int v){VAL v;}Test* Sum(Test T1, Test T2){VAL T1.VAL T2.VAL;return this;}void print(){cout << VAL << " ";}};int mai…

线性表(代码、分析、汇编)

目录&#xff1a;代码&#xff1a;分析&#xff1a;汇编&#xff1a;代码&#xff1a; LinkList.h #ifndef _LINKLIST_H_ #define _LINKLIST_H_typedef void LinkList; //定义线性表类型 typedef struct _tag_LinkListNode LinkListNode;//定义线性表节点类型 struct _tag_Li…

WPF 操作 richTextBox

FROM:http://blog.csdn.net/wuzhengqing1/article/details/7010902 取出richTextBox里面的内容 第一种方法&#xff1a; 将richTextBox的内容以字符串的形式取出 string xw System.Windows.Markup.XamlWriter.Save(richTextBox.Document); 第二种方法&#xff1a;将richTe…

微软企业库4.1学习笔记(八)创建对象 续集2

3.3通过配置指定和Unity的整合 另外一种方法是在配置源中指定配置的需要&#xff0c;你可以指定下面的一条或者多条&#xff1a; 你可以在Unity配置中指定想要的BlockExtensions  你可以在Unity配置中的type配置节指定如何创建企业库对象&#xff0c;指定类型映射的关系&…