What is AJAX?(转)(二)

关键词: ajax    Asynchronous    JavaScript    Xml                                          

 

目录

 

  1. 什么是AJAX?
  2. 第一步:如何发出一个HTTP请求
  3. 第二步:处理服务器的响应
  4. 第三步:一个简单的例子
  5. 第四步:与XML响应协同工作

什么是AJAX

AJAX是一个新的合成术语,隐含了两个已经存在多年的JavaScript特性,但是直到最近,随着一些诸如Gmail、Google Suggest以及Google Maps的轰动,才被许多网络开发者所注意到。

我们所讨论的两个JavaScript的特性是你能够:

  • 向服务器发出请求而不需重新加载任何页面
  • 解析XML文档并且与之协同工作

 

AJAX是一个缩写,A是指"asynchronous"(异步的),它表示你可以在向服务器发出一个HTTP请求后,边做其他的事情,边等待服务器的响应。JA表示"JavaScript"X表示"XML"(可扩展标记语言)。

第一步:如何发出一个HTTP请求

为了用JavaScript向服务器发出一个HTTP请求,你需要一个类的实例来提供给你这种功能。这个类原本在IE里被作为一个ActiveX对象提出,叫XMLHTTP。然后,Mozilla、Safari以及一些其他的浏览器相继跟随,出现了一个XMLHttpRequest类,其支持微软的ActiveX对象原本的方法和属性。

所以,为了能够跨浏览器地创建这个类的对象,你需要这样:

if (window.XMLHttpRequest) { // Mozilla, Safari,
http_request = new XMLHttpRequest();
} else if (window.ActiveXObject) { // IE
http_request = new ActiveXObject("Microsoft.XMLHTTP");
}
(以上例子中的代码,是一个用来构建XMLHTTP实例的简单版本,实际使用时的例子请参见本文的第三步)

 

如果服务器端的响应中没有包含XML的mime-type报头(header),有些版本的Mozilla浏览器可能不会处理。所以,为了安全起见,你可以用一个特殊的方法来给服务器端发出的响应强加上这个报头,以防其不是text/xml类型。

http_request = new XMLHttpRequest();
http_request.overrideMimeType('text/xml');

 

下一步就是你来决定在服务器对你的请求作出响应后,你准备做什么。这一阶段,你只需要告诉HTTP请求对象(HTTP request object)用哪一个JavaScript函数来处理这一响应。这一步用设置该对象onreadystatechange属性为相应的JavaScript函数名来实现:

http_request.onreadystatechange = nameOfTheFunction;

 

注意,在函数名后面没有括号。另外如下定义处理响应的函数:

http_request.onreadystatechange = function(){
// 处理响应
};

 

接下来,既然你已经声明了在接到响应后干什么,你就需要去发出请求。你需要调用HTTP请求类的open()send()方法:

http_request.open('GET', 'http://www.example.org/some.file', true);
http_request.send(null);
  • open()方法的第一个参数是HTTP请求的方式——GET、POST、HEAD或者任何其它你想使用的,你的服务器支持的方式。方式的名称要大写,否则有些浏览器(如Firefox)可能就不会处理请求。可以去 W3C specs获取更多的你可以使用的HTTP请求方式的信息。
  • 第二个参数是你所请求页面的URL。
  • 第三个参数是用来设置请求是否为异步的。如果是TRUE,则在服务器尚未返回响应的时候,JavaScript的函数会继续执行。这也就是AJAX中的A的含义。

 

send()方法的参数可以使任何你希望传递给服务器的数据,数据应该为如下格式的查询串:

name=value&anothername=othervalue&so=on

 

第二步:处理服务器响应

记住,当你向服务器发出了一个请求,你也就发出了一个被设计用来处理响应的JavaScript函数的名字。

http_request.onreadystatechange = nameOfTheFunction;

我们来看看这个函数都应该做些什么。首先,其需要检查请求的状态,如果状态的值为4,那么就意味着全部的服务器响应都已接受完毕,你可以继续来处理了。

if (http_request.readyState == 4) {
// 一切就绪,相映已接受完成
} else {
//尚未就绪
}
readyState全部值的列表如下:
  • 0(未初始化/uninitialized)
  • 1(正在加载/loading)
  • 2(加载完毕/loaded)
  • 3(交互/interactive)
  • 4(完成/complete)
( 来源)

 

下一步是检查HTTP服务器响应的情况代码。所有可能的代码都被列在了W3C的网站上。目前,我们只对200 OK响应感兴趣。

if (http_request.status == 200) {
// 棒极了!
} else {
// 请求出了些问题,
// 比如响应可能是404(Not Found),未找到
// 或者500,内部服务器错误
}

 

在你检查完请求的状态和HTTP响应情况后,你就可以自己决定对服务器发送给你的数据作什么样的处理了。你有两种途径来访问这些数据:

  • http_request.responseText将会把服务器的响应作为一个文本串返回
  • http_request.responseXML将把响应作为一个XMLDocument对象返回,你可以用JavaScript的文档对象模型(DOM)的函数来处理

 

第三步:一个简单的例子

我现在来做一个简单的HTTP请求。我们的JavaScript脚本将会请求一个HTML文档,test.html,其包含了一段文本——“这是一个测试。”——然后我们会alert() test.html的内容。

<script type="text/javascript" language="javascript">
var http_request = false;

function makeRequest(url) {

http_request = false;

if (window.XMLHttpRequest) { // Mozilla, Safari,...

http_request = new XMLHttpRequest();
if (http_request.overrideMimeType) {
http_request.overrideMimeType('text/xml');
}
} else if (window.ActiveXObject) { // IE
try {
http_request = new ActiveXObject("Msxml2.XMLHTTP");
} catch (e) {
try {
http_request = new ActiveXObject("Microsoft.XMLHTTP");
} catch (e) {}
}
}

if (!http_request) {
alert('Giving up :( Cannot create an XMLHTTP instance');
return false;
}
http_request.onreadystatechange = alertContents;
http_request.open('GET', url, true);
http_request.send(null);

}

function alertContents() {

if (http_request.readyState == 4) {
if (http_request.status == 200) {
alert(http_request.responseText);
} else {
alert('There was a problem with the request.');
}
}

}
</script>

<span
style="cursor: pointer; text-decoration: underline"
onclick="makeRequest('test.html')">
发出请求
</span>

在这个例子中:

  • 用户在浏览器里点击“发出请求”(make a request);
  • 这会调用makeRequest()函数,并且附有参数test.html,一个自阿同一目录下的HTML文档的名字。
  • 请求被发出,然后(onreadystatechange)操作被传递给alertContents()
  • alertContents()检查响应是否被接收和是否状态为“OK”,然后alert() test.html文件的内容。

 

你可以在这里测试这个例子,并且可以在这里看见测试文件。

与XML响应协同工作

在上个例子中,在HTTP响应被接收完毕后,我们和使用了请求对象的responseText属性,其包含了test.html文件的内容。现在,让我们试试responseXML属性。

让我们现在就创建一个有效的XML文档,这个文档稍后会被我们请求。文档(test.xml)包括:

<?xml version="1.0" encoding="utf-8" ?>
<root>
这是个测试.
</root>
我们只需要在脚本中用下面的内容替换请求行:
...
onclick="makeRequest('test.xml)">
...
然后在 alertContents()里把 alert()行替换成 alert(http_request.responseText);,并且,在其上方写下:
var xmldoc = http_request.responseXML;
var root_node = xmldoc.getElementsByTagName('root').item(0);
alert(root_node.firstChild.data);

 

这样,我们获取了responseXML中的XMLDocument对象,并且用DOM方法来访问了XML文档中所包含的某些内容。你可以在这里浏览到test.xml,更新后的脚本可以在这里得到。

可以去Mozilla's DOM implementation获取更多的DOM方法。 

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

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

相关文章

react学习(68)--ant design inputNumber

<InputNumber min{0} style{{ width: 100 }} onPressEnter{this.handleSearch} />

控制`Actor`朝向,运动 Learn Unreal Engine (with C++)

控制Actor的朝向,以及Actor的运动 SpaceshipBattle fanxingin/UE4项目 - 码云 - 开源中国 (gitee.com) 控制Actor朝向鼠标 设置鼠标在游戏中可见 获取玩家控制器鼠标可见设置为true PC Cast<APlayerController>(GetController()); PC->bShowMouseCursor true;获取…

zz 聊聊并发(一)

引言 在多线程并发编程中synchronized和Volatile都扮演着重要的角色&#xff0c;Volatile是轻量级的synchronized&#xff0c;它在多处理器开发中保证了共享变量的“可见性”。可见性的意思是当一个线程修改一个共享变量时&#xff0c;另外一个线程能读到这个修改的值。 它在某…

小故事的蕴意1

①蛇与乌龟的故事   一条大蟒蛇和一条小毒蛇是朋友。   这天他们在路边发现了一只巨大的乌龟。   蛇兄弟想&#xff0c;这么大的个儿&#xff0c;可是一顿美餐啊。   蟒蛇说&#xff1a;我来对付他。   于是蟒蛇施展自己的绝技&#xff0c;用身体将大乌龟牢牢地缠住。…

.Net开发人员应该下载的十种必备工具(三)

NDoc 编写代码文档资料几乎总是一项令人畏惧的任务。我所说的不是早期设计文档&#xff0c;甚至也不是更为详细的设计文档&#xff1b;我说的是记录类上的各个方法和属性。NDoc 工具能够使用反射来分析程序集&#xff0c;并使用从 C# XML 注释生成的 XML 自动为代码生成文档资料…

react学习(69)--置空操作

//重置按钮handleReset () > {this.props.form.setFieldsValue({merchantCode: ,goodsCode: ,});};

Actor范围内随机生成 Learn Unreal Engine (with C++)

Actor范围内随机生成 Learn Unreal Engine (with C) SpaceshipBattle fanxingin/UE4项目 - 码云 - 开源中国 (gitee.com) Actor范围内随机生成 新建box组件 SpawnArea CreateDefaultSubobject<UBoxComponent>(TEXT("SpawnArea"));RootComponent SpawnArea…

浏览器是如何展示网页的

作为一名前端工程师&#xff0c;我们应该清楚浏览器是如何展示网页的&#xff0c;了解浏览器的原理可以令设计者找到适合的途径把网页展示给用户。 首先&#xff0c;让我们来看看什么是浏览器。网页浏览器是显示网页服务器或档案系统内的文件&#xff0c;并让用户与这些文件互动…

.Net开发人员应该下载的十种必备工具(二)

NUnit NUnit 是为 .NET 框架生成的开放源代码单元测试框架。NUnit 使您可以用您喜欢的语言编写测试&#xff0c;从而测试应用程序的特定功能。当您首次编写代码时&#xff0c;单元测试是一种测试代码功能的很好方法&#xff0c;它还提供了一种对应用程序进行回归测试的方法。NU…

金山毒霸2007亮点介绍

盘点即将过去的2006年&#xff0c;计算机病毒多变种&#xff0c;恶意软件、流氓软件的泛滥&#xff0c;钓鱼欺诈网站的频繁出现&#xff0c;都给网民留下深刻印象。为在新的一年里对杀毒市场展开新一轮争夺&#xff0c;主流杀毒软件也纷纷发布了新一代产品。纵观各厂商提供的解…

子弹创建及发射 Learn Unreal Engine (with C++)

子弹创建及发射 Learn Unreal Engine (with C) SpaceshipBattle fanxingin/UE4项目 - 码云 - 开源中国 (gitee.com) 子弹的创建 声明: UPROPERTY(EditAnywhere, Category "Fire")TSubclassOf<ABullet> Bullet;实现: //在空组件处生产子弹GetWorld()->…

爬虫工作量由小到大的思维转变---<第二十四章 Scrapy的`统计数据`收集stats collection>

前言: 前两篇是讲的数据诊断分析,还有一篇深挖解决内存泄漏的文章,目前我还没整理汇编出来;但是,想到分析问题的时候,忽然觉得爬虫的数据统计好像也挺重要;于是,心血来潮准备来插一篇这个------让大家对日常scrapy爬的数据,做到心里有数!不必自己去搅破脑汁捣腾日志,敲计算器了…

uva 10245 The Closest Pair Problem_枚举

题意&#xff1a;求任意两点之间的距离的最少一个距离 思路&#xff1a;枚举一下就可以了 #include <iostream> #include<cstdio> #include<cmath> using namespace std; #define N 10010 struct node{double x,y; }p[N]; int main(int argc, char** argv) {…

react学习(70)--拼接方式

const tabs [{ key: , value: 全部 }, ...MERCHANTLISTSTARTUS];

.Net开发人员应该下载的十种必备工具(一)

用于编写单元测试的 NUnit用于创建代码文档资料的 NDoc用于生成解决方案的 NAnt用于生成代码的 CodeSmith用于监视代码的 FxCop用于编译少量代码的 Snippet Compiler两种不同的转换器工具&#xff1a;ASP.NET 版本转换器和 Visual Studio .NET 项目转换器用于生成正则表达式的 …

旋转根组件 Learn Unreal Engine (with C++)

旋转根组件 Learn Unreal Engine (with C) 在UE4中,根组件是无法旋转定位的,只能够缩放,在一些情况下,我们有旋转根组件的需求 SpaceshipBattle fanxingin/UE4项目 - 码云 - 开源中国 (gitee.com) 旋转根组件 将SceneComponent设为根组件 然后将StaticMeshComponentattach…

2007.2.14 日程安排

公元二零零七年二月十四日&#xff0c;农历腊月二十七&#xff0c;该天尤为特别&#xff0c;乃春节长假之初始。此外&#xff0c;该天将是片地鸳侣&#xff0c;漫天桃花之好时日&#xff0c;于是吾将广纳四方真气&#xff0c;闭关修炼&#xff0c;与世无争。00&#xff1a;00 -…

react学习(71)--render使用

title: 品牌资质有效期,dataIndex: certificationStartDate,render: (text, row) > {return (<span>{moment(row.certificationStartDate).format(YYYY-MM-DD)}-{moment(row.certificationEndDate).format(YYYY-MM-DD)}</span>);},

2014.3.5-C语言学习小结

知识点:1.结构体 struct2.联合体 union3.枚举4.结构、联合与函数结构体思考:如果现在希望保存一个学生的信息,该如何保存sprintf "zhangsan:18:180”%s:%d:%d, name, height, agechar name[10][100]int age[10]int height[10]1.什么是结构体 struct结构体指的是一种数据结…

什么是Tomcat?

如今&#xff0c;基于Web的应用越来越多&#xff0c;传统的Html已经满足不了如今的需求。我们需要一个交互式的Web&#xff0c;于是便诞生了各种Web语言。如Asp&#xff0c;Jsp&#xff0c;Php等。当然&#xff0c;这些语言与传统的语言有着密切的联系&#xff0c;如Php基于C和…