`
jianghg2010
  • 浏览: 64801 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

ajax详解(转载)

阅读更多
XMLHttpRequest 对象是AJAX功能的核心,要开发AJAX程序必须从了解XMLHttpRequest 对象开始。

了解XMLHttpRequest 对象就先从创建XMLHttpRequest 对象开始,在不同的浏览器中创建XMLHttpRequest 对象使用不同的方法:

先看看IE创建XMLHttpRequest 对象的方法(方法1):

var xmlhttp = new ActiveXObject("Msxml2.XMLHTTP"); //使用较新版本的 IE 创建 IE 兼容的对象(Msxml2.XMLHTTP)var xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); //使用较老版本的 IE 创建 IE 兼容的对(Microsoft.XMLHTTP)
而 Mozilla、Opera、Safari 和大部分非IE的浏览器都使用下面这种方法(方法2)创建XMLHttpRequest 对象:

var xmlhttp = new XMLHttpRequest();

实际上Internet Explorer 使用了一个名为 XMLHttp 的对象,而不是 XMLHttpRequest 对象,而 Mozilla、Opera、Safari 和 大部分非 Microsoft 浏览器都使用的是后者(下文统称 XMLHttpRequest 对象)。IE7开始也开始使用XMLHttpRequest 对象了。

在创建 XMLHttpRequest 对象的时候如果不同的浏览器使用了不正确的方法浏览器都将会报错,并且无法使用该对象。所以我们需要一种可以兼容不同浏览器的创建XMLHttpRequest 对象的方法:

创建兼容多浏览器的 XMLHttpRequest 对象方法

var xmlhttp = false; //创建一个新变量 request 并赋值 false。使用 false 作为判断条件,它表示还没有创建 XMLHttpRequest 对象。
function CreateXMLHttp(){
try{
xmlhttp = new XMLHttpRequest(); //尝试创建 XMLHttpRequest 对象,除 IE 外的浏览器都支持这个方法。
}
catch (e){
try{
xmlhttp = new ActiveXObject("Msxml2.XMLHTTP"); //使用较新版本的 IE 创建 IE 兼容的对象(Msxml2.XMLHTTP)
}
catch (e){
try{
xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); //使用较老版本的 IE 创建 IE 兼容的对象(Microsoft.XMLHTTP)。
}
catch (failed){
xmlhttp = false; //如果失败则保证 request 的值仍然为 false。
}
}
}
return xmlhttp;
}
判断是否创建成功就很简单了

if (!xmlhttp){
//创建XMLHttpRequest 对象失败!
}
else{
//创建成功!
}



创建好了XMLHttpRequest 对象我们再来看看这个对象的方法、属性以及最重要的onreadystatechange事件句柄吧。


方法:

open() 说明:初始化 HTTP 请求参数,例如 URL 和 HTTP 方法,但是并不发送请求。

abort() 说明:取消当前响应,关闭连接并且结束任何未决的网络活动。

getAllResponseHeaders() 说明:把 HTTP 响应头部作为未解析的字符串返回。

getResponseHeader() 说明:返回指定的 HTTP 响应头部的值。

send() 说明:发送 HTTP 请求,使用传递给 open() 方法的参数,以及传递给该方法的可选请求体。

setRequestHeader() 说明:向一个打开但未发送的请求设置或添加一个 HTTP 请求。

属性:

readyState 说明:HTTP 请求的状态。

responseText 说明:目前为止为服务器接收到的响应体(不包括头部),或者如果还没有接收到数据的话,就是空字符串。

responseXML 说明:对请求的响应,解析为 XML 并作为 Document 对象返回。

status 说明:由服务器返回的 HTTP 状态代码。

statusText 说明:这个属性用名称而不是数字指定了请求的 HTTP 的状态代码。

onreadystatechange 是每次 readyState 属性改变的时候调用的事件句柄函数。

下面从发送请求并处理请求结果的过程来理解一下XMLHttpRequest 对象吧。

发送请求之前自然就是生成一个XMLHttpRequest 对象,代码上面有了就不多写了。

生成一个XMLHttpRequest 对象

var xmlhttp = CreateXMLHttp();

创建好XMLHttpRequest 对象了,那我们要送请求到哪个网站呢,就选择博客园首页的RSS吧。那怎么设置我要请求的网站地址呢,使用open()方法。

open(method, url, async, username, password)

该方法有5个参数,具体什么意思可以看这里:http://www.w3school.com.cn/xmldom/dom_http.asp
我们用的就是这个了。

xmlHttp.open("get","http://www.cnblogs.com",true);

get参数表示用get方法,第二个自然就是目标地址,博客园首页,第三个就是表示是否异步了,我们当然使用true了。具体的参数说明还都可以到http://www.w3school.com.cn上面看了。

好了,目标定好了,怎么发送呢。用send()方法?

send(body),send()方法只有一个参数,表示DOM对象,这个DOM对象需要说明的内容很多,下次说,今天我们只要写

xmlhttp.send();就可以了。好了,发送了,那怎么处理返回的结果呢,这个时候就用到XMLHttpRequest 对象最重要的东西了,那就是onreadystatechange事件句柄。什么意思呢,那就需要说明一下XMLHttpRequest 对象的readyState了,readyState有5种状态,分别用数字的 0 到 4 来表示。

状态名称描述 0 Uninitialized 初始化状态。XMLHttpRequest 对象已创建(未调用open()之前)或已被 abort() 方法重置。 1 Open open() 方法已调用,但是 send() 方法未调用。请求还没有被发送。 2 Sent Send() 方法已调用,HTTP 请求已发送到 Web 服务器。未接收到响应。 3 Receiving 所有响应头部都已经接收到。响应体开始接收但未完成。 4 Loaded HTTP 响应已经完全接收。

但是需要注意的是,onreadystatechange事件句柄不同的浏览器能处理的状态并不一致,IE和FireFox能处理1到4,而Safari能处理2到4的状态,Opera 能处理3、4两中状态。0的状态基本没什么用,因为创建了XMLHttpRequest 对象后都会马上调用open() 方法,这时候状态就变成1了,当然除非你要判断对象是否已经被 abort() 取消,可是这样的情况依然很少。大部分情况下判断是不是4(已经接受完成)这个状态就够了。

好了,明白了readyState有5种状态了,那处理返回结果就是看状态变更到不同的状态我们做不同的处理就可以了,怎么告诉XMLHttpRequest 对象状态变化时让谁来处理这个变化呢。有两种写法,一种是用匿名方法,另一种是指定方法,其实只是不同的写发,作用都一样,看下代码:

xmlhttp.onReadyStateChange = function (){
//处理状态变化的代码
}
//或者
xmlhttp.onReadyStateChange = getResult;
function getResult(){
///处理状态变化的代码
}

顺便说一下,句柄的名称比较长,可以这样记忆 on ReadyState Change 表示在读取状态改变时请求发送了,也指定处理方法了,怎么获取返回的内容呢,有responseText和responseXML两个属性可供使用,responseXML是返回对象,需要再解析,后面再说,这里先用responseText,看看返回什么。

alert(xmlhttp.responseText); //看看是不是返回了首页的HTML代码啊。是你就成功了。

整个过程是:创建XMLHttpRequest 对象 -> 指定发送地址及发送方法 -> 发送请求 -> 指定处理方法并处理返回结果。但是需要注意,我们正常的思路理解是这样的,可是onreadystatechange事件句柄指定处理方法需要在发送之前就指定好,否则无法处理状态变化事件。

所以我们应该按照下面的流程来记忆:创建XMLHttpRequest 对象 -> 指定发送地址及发送方法 -> 指定状态变化处理方法 -> 发送请求,请求发送后状态变化了就会自动调用指定的处理方法。
好了,看看完成的代码吧。

完成的代码


var xmlhttp = false; //创建一个新变量 request 并赋值 false。使用 false 作为判断条件,它表示还没有创建 XMLHttpRequest 对象。
function CreateXMLHttp(){
try{
xmlhttp = new XMLHttpRequest(); //尝试创建 XMLHttpRequest 对象,除 IE 外的浏览器都支持这个方法。
}
catch (e){
try{
xmlhttp = new ActiveXObject("Msxml2.XMLHTTP"); //使用较新版本的 IE 创建 IE 兼容的对象(Msxml2.XMLHTTP)
}
catch (e){
try{
xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); //使用较老版本的 IE 创建 IE 兼容的对象(Microsoft.XMLHTTP)。
}
catch (failed){
xmlhttp = false; //如果失败则保证 request 的值仍然为 false。
}
}
}
return xmlhttp;
}
xmlhttp = CreateXMLHttp();
xmlhttp.open("get","http://www.cnblogs.com",true);
xmlhttp.onReadyStateChange = getResult;
xmlhttp.send();
function getResult(){
if(xmlhttp.readyState == 4){
alert(xmlhttp.responseText);
}
}
看似一切都OK了,可是有没有想过,如果HTML代码在网络传输过程中出错了,或者我们指定的地址失效会怎么样呢。这个时候就需要用到status属性,即由服务器返回的 HTTP 状态代码。 xmlhttp.status 等于200时表示传输过程完整没有错误。具体的HTTP状态代码什么意思可以到W3C组织网站上看看,地址http://www.w3.org/Protocols/rfc2616/rfc2616-sec6.html#sec6.1.1 。


把getResult()方法写成下面这样我觉的就真的OK了。

function getResult(){
if(xmlhttp.readyState == 4 && xmlhttp.status == 200){
alert(xmlhttp.responseText);
}
}

好了,一个本来挺简单的东西,被我写的这么多,好象很罗嗦。不过我觉的编程对基础内容的理解很重要,现在很多时候开发AJAX的程序都使用很多JS的库,不需要直接编写这么基础的代码。如使用著名的jQuery,但是如果我们对基础的东西有很好的理解,那这些库报告错误,或者出现问题我们可以很好很快的知道错在哪里,更快的做出改变使程序正常运行。
分享到:
评论

相关推荐

    这个事ajax日历代码,希望对大家有帮助

    【Ajax日历组件详解】 Ajax(Asynchronous JavaScript and XML)技术在网页开发中扮演着重要角色,它使得页面无需刷新就能与服务器交换数据并局部更新页面。本篇将深入探讨一个基于Ajax的日历代码实现,旨在帮助...

    Jquery 技术详解

    使用 jQuery 简化 Ajax 开发(转载) jQuery 是什么? jQuery 由 John Resig 创建于 2006 年初,对于任何使用 JavaScript 代码的程序员来说,它是一个非常有用的 JavaScript 库。无论您是刚刚接触 JavaScript 语言...

    jquery 分页 为了收藏纯属转载

    在提供的压缩包中,有两个文件:`jQuery Pagination Ajax分页插件中文详解 « 张鑫旭-鑫空间-鑫生活.htm`可能是张鑫旭关于jQuery分页的详细教程,可以进一步学习;`jquery-plugin-pagination-zh`可能包含了分页插件...

    JS组件Bootstrap Table使用方法详解

    JS组件Bootstrap Table使用方法详解 转载 2016年03月21日 15:06:09 标签: Bootstrap Table 最近客户提出需求,想将原有的管理系统,做下优化,通过手机也能很好展现,想到2个方案: a方案:保留原有的页面,新设计...

    GT-Grid 1.0 基础教程(一)转载

    ### GT-Grid 1.0 基础教程(一)——纯客户端只读列表开发详解 #### 一、教程背景与目标 本教程旨在帮助初学者快速掌握如何使用GT-Grid开发纯客户端只读列表的基本技能。对于那些对Ajax技术下的列表组件不太熟悉的...

    输入框信息提示的实现(仿google、百度搜索框)(转载)

    此实现方式经过IE和Firefox浏览器测试,并且在加载与显示速度上相比传统的AJAX技术有显著提高。 #### 技术原理与实现步骤 ##### 技术原理 1. **监听输入框**:首先需要对输入框进行监听,一旦检测到内容发生变化...

    解决网页乱码.zip

    首先,我们来看"jsp,struts,javascript,ajax乱码解决方案(转载)_安装过滤器.txt",这可能是指在Struts框架中使用JavaScript和Ajax进行交互时遇到的乱码问题。在Struts框架中,可以通过设置Filter来统一处理请求和...

    ztree源码以及api和demo

    2. **异步加载**:演示了如何通过Ajax动态加载子节点数据,提高页面加载效率。 3. **多选功能**:展示了zTree的复选框功能,支持单选、多选、全选等多种选择模式。 4. **拖拽操作**:演示了节点的拖放功能,允许用户...

Global site tag (gtag.js) - Google Analytics