AJAX解惑篇(转)
这篇文章会使你对AJAX有一个基本了解,并给出两个容易上手的例子。
什么是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(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://blog.itpub.net/post/2573/37937
- http://www.javaeye.com/viewtopic.php?t=15076
AJAX解惑篇(转)的更多相关文章
- 图片上传并回显Ajax异步篇
图片上传并回显Ajax异步篇 图片如何无刷新的上传到服务器呢?继前两篇文章后,我们来实战一下如何无刷新的异步上传图片,我们还是先看一下效果 在实战前呢,我们需要做些准备工作.比如说,了解一下FormD ...
- Arduino杀手在此!!ESP 8266 NodeMCU小白手把手入门(二)(解惑篇)
上一次更新主要是简单介绍了NodeMCU的基本知识并且进行了一次简单的实操演示,最近有一些读者向我提出了一些小问题,所以决定出一期解惑篇,主要针对的是基础知识不是太牢固,或是喜欢刨根问底的小可爱们.里 ...
- Ajax完整篇(转载)
Ajax 完整教程 第 1 页 Ajax 简介Ajax 由 HTML.JavaScript™ 技术.DHTML 和 DOM 组成,这一杰出的方法可以将笨拙的 Web 界面转化成交互性的 Ajax 应用 ...
- 数据对象ajax学习篇9
题记:写这篇博客要主是加深自己对数据对象的认识和总结实现算法时的一些验经和训教,如果有错误请指出,万分感谢. 对ajax工作道理: 下面这段是来自一个网友的blog: Ajax的道理简单来说通过Xml ...
- C#中的 ref 传进出的到底是什么 解惑篇
今天在浏览博文时,看到这篇文章:C#中的ref 传进出的到底是什么 ? 在传对象时使用ref的疑问 另附言: 本文写于早上,就在想发布的那瞬间,靠,公司断网了,原来修改的部分丢失了. 网一断就是一天了 ...
- jQuery之ajax实现篇
jQuery的ajax方法非常好用,这么好的东西,你想拥有一个属于自己的ajax么?接下来,我们来自己做一个简单的ajax吧. 实现功能 由于jq中的ajax方法是用了内置的deferred模块,是P ...
- ajax应用篇
ajax简介 AJAX即“Asynchronous Javascript And XML”(异步JavaScript和XML),是指一种创建交互式网页应用的网页开发技术.Ajax不是一种新的编程语言, ...
- ajax终结篇
Ajax中post和get的区别 在ajax中有这个方法 xmlreq.open("post","servlet/MyServlet?time="+newDat ...
- 小心使用 Task.Run 解惑篇
继上一篇文章之后,这篇文章主要解答以下两个疑惑: 由于值类型是拷贝的方式赋值,所以捕获的本地变量和类成员是指向的是各自的值,对本地变量的捕获不会影响到整个类.但如果把 _id 改为引用类型(如 Str ...
随机推荐
- SqlServer字段说明查询及快速查看表结构
SqlServer字段说明查询 SELECT t.[name] AS 表名,c.[name] AS 字段名,cast(ep.[value] )) AS [字段说明] FROM sys.tables A ...
- 〖Android〗查找Android中的/system/lib中增加的lib文件是否在apk文件中
#!/bin/bash - #=============================================================================== # # F ...
- 从缓存行出发理解volatile变量、伪共享False sharing、disruptor
volatilekeyword 当变量被某个线程A改动值之后.其他线程比方B若读取此变量的话,立马能够看到原来线程A改动后的值 注:普通变量与volatile变量的差别是volatile的特殊规则保证 ...
- 40、JDBC相关概念介绍
1.1.数据库驱动 这里的驱动的概念和平时听到的那种驱动的概念是一样的,比如平时购买的声卡,网卡直接插到计算机上面是不能用的,必须要安装相应的驱动程序之后才能够使用声卡和网卡,同样道理,我们安装好数据 ...
- CRNN中英文字符识别
代码地址如下:http://www.demodashi.com/demo/13870.html 参考GitHub源码:https://github.com/YoungMiao/crnn 应demo大师 ...
- 【微软100题】定义字符串的左旋转操作:把字符串前面的若干个字符移动到字符串的尾部。 如把字符串abcdef左旋转2位得到字符串cdefab。请实现字符串左旋转的函数。
package test; /** * 定义字符串的左旋转操作:把字符串前面的若干个字符移动到字符串的尾部. 如把字符串abcdef左旋转2位得到字符串cdefab. 请实现字符串左旋转的函数. * ...
- Python 开发者的 6 个必备库,你都了解吗?
无论你是正在使用 Python 进行快速开发,还是在为 Python 桌面应用制作原生 UI ,或者是在优化现有的 Python 代码,以下这些 Python 项目都是应该使用的. Python那些事 ...
- C#:XML操作(简单)
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.X ...
- 基于Bootstrap的Asp.net Mvc 分页的实现(转)
最近写了一个mvc 的 分页,样式是基于 bootstrap 的 ,提供查询条件,不过可以自己写样式根据个人的喜好,以此分享一下.首先新建一个Mvc 项目,既然是分页就需要一些数据,我这 边是模拟了一 ...
- 使用sqlplus连接提示:ORA-28002: the password will expire within 7 days
今天在使用sqlplus时出现,或使用数据库的时候出现类似问题 =============================================== ERROR:ORA-28002: the ...