第20章 使用XMLHttpRequest对象

  • 格式:pdf
  • 大小:595.64 KB
  • 文档页数:22

第20章 使用XMLHttpRequest 对象XMLHttpRequest 对象是Ajax 技术的核心,其主要任务是实现客房端与服务器的异步通信,缺少XMLHttpRequest 对象Ajax 技术将无从谈起。

然而,XMLHttpRequest 对象并不是独立存在的,要通过DOM 和CSS 动态操作HTML 页面元素,来实现页面的部分刷新。

20.1 XMLHttpRequest 对象XMLHttpRequest 对象和其他一样具有一定的属性和方法,在使用这些实例属性和实例方法前要首先创建XMLHttpRequest 对象实例。

20.1.1 创建XMLHttpRequest 对象由于XMLHttpRequest 对象还不是W3C 的标准,不同浏览器中其实现方式是不同的。

在Internet Explorer 7以前版本的IE 浏览器中,XMLHttpRequest 对象是以ActiveX 组件的形式实现的,而在Firefox 、Opera 等浏览器中XMLHttpRequest 对象是作为浏览器对象来提供的。

值得庆幸的是,IE7中XMLHttpRequest 对象可以作为浏览器对象使用,从而实现XMLHttpRequest 对象创建的统一。

在较老版本的IE 中创建XMLHttpRequest 对象的基本语法格式为:var xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");在较新版本的IE 中创建XMLHttpRequest 对象的基本语法格式为:var xmlHttp = new ActiveXObject("Msxml2.XMLHTTP");而在IE7以及其他非IE 浏览器中使用如下语法格式创建XMLHttpRequest 对象:var xmlHttp = new XMLHttpRequest();由于在不同浏览器中XMLHttpRequest 对象的创建方式不同,在实际开发过程必须考滤代码的兼容性。

下面的范例中列出创建XMLHttpRequest 对象的通用代码。

-------------------------------------------------------------------------------------------------------------应用范例本例列出了创建XMLHttpRequest 对象的通用代码。

程序清单1<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN""/TR/xhtml1/DTD/xhtml1-transitional.dtd">2 <html xmlns ="/1999/xhtml"> 3 <head> 4<meta http-equiv="Content-Type" content="text/html; charset=gb2312" /> 5 <title>创建XMLHttpRequest 对象</title> 简明教程 •2•6 </head>7 <body>8 <script language ="javascript" type ="text/javascript"> 9 var xmlHttp = false;10 if (window.XMLHttpRequest) { // 在非IE 浏览器中创建XMLHttpRequest 对象 11 xmlHttp = new XMLHttpRequest();12 } else if (window.ActiveXObject) { //通过ActiveX 创建XMLHttpRequest 13 try {14 // 尝试按新版Internet Explorer 方式创建15 xmlHttp = new ActiveXObject("Msxml2.XMLHTTP"); 16 } catch (error1) { // 创建请求的ActiveX 对象失败 17 try {18// 尝试按老版Internet Explorer 方式创建19 xmlHttp = new ActiveXObject("Microsoft.XMLHTTP"); 20 } catch (error2) {21 // 不能通过ActiveX 创建XMLHttpRequest 22 xmlHttp = false; 23 } 24}25 }26 if(xmlHttp){ 27alert("创建XMLHttpRequest 对象成功!"); 28 } 29 </script> 30 </body> 31 </html>范例解析代码第9行定义了一个变量并赋值为false 。

第10行代码判断是否存在window.XMLHttpRequest ,如果存在就将XMLHttpRequest 对象作为浏览器对象来创建,如果不存在返回null ,if 语句会将其看作false 。

第12行代码判断浏览器是否支持ActiveX 组件,在接下来的try…catch 语句中,首先在第15行尝试使用新版Internet Explorer 方式创建XMLHttpRequest 对象。

如果创建失败,在catch 语句中嵌套的try…catch 中的第18行尝试按老版Internet Explorer 方式创建XMLHttpRequest 对象。

如果也创建失败则将变量xmlHttp 设置为false 。

代码第26行首先判断xmlHttp 的值,如果不为false ,则弹出提示框提示“创建XMLHttpRequest 对象成功”。

范例结果演示范例代码在IE6和FireFox 中的执行结果分别如图20-1和图20-2中所示。

图20-1 IE6中执行结果图 20-2 Firefox 执行结果•3•光盘路径代码位于光盘中的位置是/code/chap20/20-1.html。

20.1.2 XMLHttpRequest对象的属性和方法XMLHttpRequest对象和其他对象一样具有属性和方法,但和其他对象不同的是这些属性和方法之间的联系非常紧密,其使用不是独立的。

表20-1和20-2分别列出了XMLHttpRequest对象的属性和方法,本章后续部分会对这些属性和方法做详细的介绍。

表20-1 XMLHttpRequest对象的属性属性名称说明onreadystatechange指定当readyState属性改变时的回调函数。

readyState 返回当前请求的状态。

responseBody 返回以数组形式表示的响应信息正文(仅限IE浏览器)。

responseStream 以Ado Stream对象的形式返回响应信息(仅限IE浏览器)。

responseXML 返回XML Document对象形式表示的响应信息。

status 返回当前请求的HTTP状态码。

statusText 返回当前请求的HTTP状态信息。

表20-2 XMLHttpRequest对象的方法方法名称说明abort 取消当前请求。

getAllResponseHeaders获取响应的所有HTTP头。

getResponseHeader 从响应信息中获取指定的HTTP头。

open 创建一个新的HTTP请求,并指定此请求的方法、URL等信息。

send 发送请求到HTTP服务器并接收回应。

setRequestHeader 指定请求的某个HTTP头。

20.2 使用XMLHttpRequest对象发送请求20.2.1 打开请求使用XMLHttpRequest对象发送请求的第一步是使用open方法打开一个新的HTTP 请求,并指定此请求的方法、URL等。

open方法的基本请求格式为:xmlHttp.open(method, url, [async], [user], [password]);其中,xmlHttp为一个XMLHttpRequest对象实例,open方法各个参数说明如下:●method:字符串类型数据,表示http请求方法的类型,例如:POST、GET、PUT,不区分大小写。

简明教程•4•●url:字符串类型数据,表示请求的URL地址,可以为绝对地址也可以为相对地址。

●async:参数可选,布尔类型数据,指定此请求是否为异步方式,默认为true。

如果为真,当状态改变时会调用onreadystatechange属性指定的回调函数。

●user:参数可选,字符串类型数据,如果服务器需要验证,此处指定用户名,如果未指定,当服务器需要验证时,会弹出验证窗口。

●password:参数可选,字符串类型数据,指定验证信息中的密码,如果用户名为空,则此值将被忽略。

下面是一个使用open方法的示例:xmlHttp.open("post","getMsg.jsp?msgid=256&msgtype=3");上面的代码xmlHttp表示已经创建的XMLHttpRequest对象实例,使用open方法打开一个请求,请求使用post方法。

请求的URL地址为“getMsg.jsp?msgid=256&msgtype=3”,在此地址中有两个参数msgid和msgtype。

20.2.2 发送请求使用open方法打开请求之后,就可以发送请求了。

发送请求的方法比较简单,使用send方法。

send方法的基本语法格式为:xmlHttp.send(body);send方法只有一个参数boyd,就是要发送的内容。

body内容以是键-值对的形式表示的,各个键-值对之间使用&分隔,类似于URL地址中查询字符串的部分,例如,"name=smartdong&sex=male",表示向服务器发送name的值为smartdong以及sex的值为male。

send方法的同步或异步方式取决于open方法中的async参数,如果async为false,此方法将会等待请求完成或者超时时才会返回。

如果open方法的async参数为true,此方法将立即返回。

如果使用POST方法发送请求,那么在使用sned方法发送请求之前必须使用XMLHttpRequest对象的setRequestHeader方法按照如下方式设置HTTP头信息。