慕容星空小站
.NET技术研究进行中....
posts - 14, comments - 97, trackbacks - 4, articles - 0
2006年9月28日
ajax的原理和运行机制
关于ajax,是最近炒得非常火的一种技术,并且时下它也是非常流行。当然,它并不是什么新技术,而是在各种已有的技术和支持机制下的一个统一。在我的项目中,偶尔也会用到ajax,用来给用户一些无刷新的体验。用过几次之后,我个人决定对它的原理和运行机制做一个总结。
ajax这个名字据说是Asynchronous JavaScript + XML的简写,实际上,它由下列几种技术组合而成。
1.使用CSS和XHTML来表示。
2. 使用DOM模型来交互和动态显示。
3.使用XMLHttpRequest来和服务器进行异步通信。
4.使用javascript来绑定和调用。
ajax的原理
XMLHttpRequest是ajax的核心机制,它是在IE5中首先引入的,是一种支持异步请求的技术。简单的说,也就是javascript可以及时向服务器提出请求和处理响应,而不阻塞用户。达到无刷新的效果。
所以我们先从XMLHttpRequest讲起,来看看它的工作原理。
首先,我们先来看看XMLHttpRequest这个对象的属性。
它的属性有:
onreadystatechange 每次状态改变所触发事件的事件处理程序。
responseText 从服务器进程返回数据的字符串形式。
responseXML 从服务器进程返回的DOM兼容的文档数据对象。
status 从服务器返回的数字代码,比如常见的404(未找到)和200(已就绪)
status Text 伴随状态码的字符串信息
readyState 对象状态值,0—未初始化 1—正在加载 2—加载完毕 3—交互 4—完成。
但是,由于各浏览器之间存在差异,所以创建一个XMLHttpRequest对象可能需要不同的方法。这个差异主要体现在IE和其它浏览器之间。
下面是面对不同浏览器分别创建的XMLHttpRequest对象。
<
script language
=
"
javascript
"
type
=
"
text/javascript
"
>
var
xmlHttp
=
false
;
//
创建面向IE的XMLHttpRequest对象
try
{
//
使用Msxml的一个版本来创建
xmlHttp
=
new
ActiveXObject(
"
Msxml2.XMLHTTP
"
);
}
catch
(e)
{
try
{
//
使用它的另外一个对象来创建
xmlHttp
=
new
ActiveXObject(
"
Microsoft.XMLHTTP
"
);
}
catch
(e2)
{
xmlHttp
=
false
;
}
}
if
(
!
xmlHttp
&&
typeof
XMLHttpRequest
!=
'undefined')
{
//
创建面向其它非微软浏览器的XMLHttpRequest对象
xmlHttp
=
new
XMLHttpRequest();
}
</
script
>
这个过程分为三步,首先我们定义一个xmlHttp来引用创建的XMLHttpRequest。然后,我们尝试在微软的浏览器中创建该对象,先用Msxml.XMLHTTP对象来创建,如果失败再尝试用macrosoft.XMLHTTP来创建它.最后,我们面向非微软浏览器来创建该对象.
这样,我们创建了一个XMLHttpRequest对象,下面我们来看如何发出一个XMLHttpRequest请求。
function
executeXMLHttpRequest(callback,url)
{
//
处理非微软浏览器的情况
if
(window.XMLHttpRequest)
{
xhr
=
new
XMLHttpRequest();
xhr.onreadystatechange
=
callback;
xhr.open(
"
Get
"
,url,
true
);
xhr.send(
null
);
}
//
处理微软浏览器的情况
else
if
(window.ActiveXObject)
{
xhr
=
new
ActiveXObject(
"
macrosoft.XMLHttp
"
);
if
(xhr)
{
xhr.onreadystatechage
=
callback;
xhr.open(
"
Get
"
,url,
true
);
xhr.send();
}
}
由上面可见,执行XMLHttpRequest实际上大多数代码还是用在处理浏览器的区别上面,针对不同的浏览器它还是要做出不同的处理,但是这样看上去也非常的直观。
在上面的代码中,最关键的是:
xhr.onreadystatechage=callback 它定义了回调函数,一旦响应它就会自动执行。
xhr.open(""Get",url,true); true表示您想要异步执行该请求。
对于callback来说,我们有:
function
processAjaxResponse()
{
//
状态标识为已完成
if
(xhr.readyState
==
4
)
{
//
已就绪
if
(xhr.status
==
200
)
{
502
502
'votes').innerHTML
=
xhr.responseText;
}
else
{
alert(
"
There was a problem retrieving the XML data:
"
+
xhr.statusText);
}
}
}
就是说,一旦服务器处理完XMLHttpRequest并返回给浏览器,用xhr.onreadystatechange指派的回调方法将自动调用。
上面差不多就是XMLHttpRequest的整个工作流程,它首先检查XMLHttpRequest的整体状态并且保证它已经完成(readyStatus=4),然后根据服务器的设定询问请求状态,如果一切已经就绪(status=200),那么就执行下面需要的操作。
知道了XMLHttpRequest的工作流程,我们可以看出,XMLHttpRequest是完全用来向服务器发出一个请求的,它的作用也局限于此,但它的作用是整个ajax实现的关键,因为ajax无非是两个过程,发出请求和响应请求。并且它完全是一种客户端的技术。而XMLHttpRequest正是处理了服务器端和客户端通信的问题所以才会如此的重要。
现在,我们对ajax的原理大概可以有一个了解了。我们可以把服务器端看成一个数据接口,它返回的是一个纯文本流,当然,这个文本流可以是XML格式,可以是Html,可以是Javascript代码,也可以只是一个字符串。这时候,XMLHttpRequest向服务器端请求这个页面,服务器端将文本的结果写入页面,这和普通的web开发流程是一样的,不同的是,客户端在异步获取这个结果后,不是直接显示在页面,而是先由javascript来处理,然后再显示在页面。至于现在流行的很多ajax控件,比如magicajax等,可以返回DataSet等其它数据类型,只是将这个过程封装了的结果,本质上他们并没有什么太大的区别。
posted @
2006-09-28 14:42
慕容一刀 阅读(619) |
评论 (1)
|
编辑
Powered by:
博客园
Copyright © 慕容一刀
导航
博客园
首页
新随笔
联系
订阅
管理
<
2006年9月
>
日
一
二
三
四
五
六
27
28
29
30
31
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
1
2
3
4
5
6
7
与我联系
发短消息
搜索
常用链接
我的随笔
我的空间
我的短信
我的评论
更多链接
我的参与
我的新闻
最新评论
我的标签
留言簿
(4)
给我留言
查看留言
随笔分类
Ajax方面(3)
ASP.NET其它知识(3)
ASP.NET之控件篇(2)
ASP.NET之项目总结(1)
ASP.NET之语法篇(3)
Javascript(1)
XML
随笔档案
2007年5月 (1)
2007年4月 (1)
2007年3月 (1)
2007年2月 (1)
2007年1月 (1)
2006年10月 (1)
2006年9月 (1)
2006年8月 (5)
2006年7月 (2)
相册
求学北京(左)
经常去的地方
孟子E章
最新随笔
1. 关于.NET邮件的收发问题总结(带附件)
2. C#2.0新特性之泛型与迭代器
3. ajax完美解决的一个麻烦问题
4. Ajax的原理和应用(给公司做所的培训)
5. 最近遇到的几个小问题总结
6. javascript中事件的理解
7. ajax的原理和运行机制
8. DOM模型概述
9. C# 常用函数和方法集(转载)
10. 怎样封装控件
最新评论
1. re: 实现google suggest技术过程总结
急用!!!! 发我一份,非常感谢!90caoxu@163.com
--sunnydream
2. re: 实现google suggest技术过程总结
麻烦给我一份,谢谢!bhdxyjg@gmail.com
--bhdxyjg
3. re: 关于.NET邮件的收发问题总结(带附件)
我到网上找了很多发邮件的代码,但是每个都报错,而且出现的错误是乱码,抛出“调用的目标发生了异常。”这个异常。 我没写过发邮件的代码,也不知道怎么修改这个错误。 哦,我用的是vs2008...
--xiao肖
4. re: 实现google suggest技术过程总结
麻烦给我一份,非常感谢.healthguo@yahoo.com.cn
--healthguo
5. re: 实现google suggest技术过程总结
麻烦给份代码吧,谢谢了.guodapeng668@163.com
--Netprawn
阅读排行榜
1. 关于.NET邮件的收发问题总结(带附件)(3044)
2. 实现google suggest技术过程总结(2691)
3. Ajax的原理和应用(给公司做所的培训)(2326)
4. ajax完美解决的一个麻烦问题(1677)
5. DOM模型概述(784)
评论排行榜
1. Ajax的原理和应用(给公司做所的培训)(41)
2. 实现google suggest技术过程总结(29)
3. 关于.NET邮件的收发问题总结(带附件)(19)
4. ajax完美解决的一个麻烦问题(6)
5. C#2.0新特性之泛型与迭代器(1)