XMLHttpRequest对象
•接着介绍XMLHttpRequest对象,因为Ajax应用程序的中心就是它。同时,对于许多数网页开发的实际问题中,它也是最广泛适用的解决方案。
•我们还将介绍该对象的GET和POST方法的使用。同时探讨用户使用此对象常见的错误,例如当试图让页面在所有服务器上都能运行时遇到的一些问题。
•XMLHttpRequest对象最初是作为IE5中的一个ActiveX控件出现的,随后Mozilla 1.0、Netscape7、Safari1.2和Opera7.60都将它纳入自身。
•XMLHttpRequest对象在IE浏览器和非IE浏览器中创建的方法不同。
•XMLHttpRequest对象的作用在于,允许用脚本程序通过HTTP连接到服务器,而不是通过HTTP请求响应模型与服务器通信。
•简而言之:它可以异步从服务器端获取text、xml 、JSON三种类型的数据
创建XMLHttpRequest对象
•同步使用XMLHttpRequest对象
按照下面模式,可以同步地XMLHttpRequest对象:
1.创建对象; - new (叫助手过来)
2.创建请求; - open (告诉他要去做的事情)
3.发送请求; - send (去吧)
•一、先来创建XMLHttpRequest对象
–在IE、Firefox、safari和Opera中创建该对象的JavaScript代码为:
var xhr = new XMLHttpRequest();
–在IE5/6中代码为:
var xmlRequest = new ActiveXObject(“Microsoft.XMLHTTP”);
注意,JavaScript区分大小写。
1 function createXmlHttp() {//创建xhr对象 2 var xhobj = false; 3 try { 4 xhobj = new ActiveXObject("Msxml2.XMLHTTP"); // ie msxml3.0+ 5 } catch (e) { 6 try { 7 xhobj = new ActiveXObject("Microsoft.XMLHTTP"); //ie msxml2.6 8 } catch (e2) { 9 xhobj = false; 10 } 11 } 12 if (!xhobj && typeof XMLHttpRequest != 'undefined') {// Firefox, Opera 8.0+, Safari 13 xhobj = new XMLHttpRequest(); 14 } 15 return xhobj; 16 }
|
XMLHttpRequest对象的方法
|
|
|
方法
|
说明
|
|
abort
|
取消请求
|
|
open
|
需要使用多个参数,第一个设置方法属性,第二个设置目标URL,第三个指定是同步(false)还是异步(true)发送请求
|
|
send
|
发送请求到服务器
|
|
setRequestHeader
|
添加自定义HTTP头到请求(post传参时使用)
|
|
getAllResponseHeaders
|
获取HTTP响应头的整个列表
|
|
getResponseHeader
|
仅获取指定的HTTP响应头
|
|
|
|
•二、为XMLHttpRequest对象设置请求参数
1.设置参数:
xhr.open("GET", "GetAreasByAjax.ashx?isAjax=1", true);
xhr.open("GET", "GetAreasByAjax.ashx?isAjax=1", true);
2.POST方式:
xhr.open("POST", "GetAreasByAjax.aspx", true);//第二个参数设置请求的页面,第三个参数设置是否异步
xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
xhr.open("POST", "GetAreasByAjax.aspx", true);//第二个参数设置请求的页面,第三个参数设置是否异步
xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
3.设置浏览器不使用缓存
xhr.setRequestHeader("If-Modified-Since", "0");
xhr.setRequestHeader("If-Modified-Since", "0");
•三、发送请求:(分别对应GET和POST)
xhr.send(null);//GET方式
xhr.send("isAjax=1&na=123");//POST方式
请求发送出去后会有响应回来,那我怎么知道请求已经返回了呢?
|
XMLHttpRequest对象常用属性
|
|
|
属性
|
说明
|
|
onreadystatechange
|
返回或设置异步请求的事件处理程序
|
|
readyState
|
返回状态码:0:未初始化;1:打开;2:发送;3:正在接收;4:已加载
|
|
responseText
|
使用字符串返回HTTP响应
|
|
responseXML
|
使用XML DOM对象返回HTTP响应
|
|
Status
|
返回HTTP状态码
|
•readyState属性
readyState属性指出了XMLHttpRequest对象在发送/接收数据过程中所处的几个状态。XMLHttpRequest对象会经历5种不同的状态。
–0:未初始化。对象已经创建,但还未初始化,即还没调用open方法;
–1:已打开。对象已经创建并初始化,但还未调用send方法;
–2:已发送。已经调用send 方法,但该对象正在等待状态码和头的返回;
–3:正在接收。已经接收了部分数据,但还不能使用该对象的属性和方法,因为状态和响应头不完整;
–4:已加载。所有数据接收完毕
异步使用XMLHttpRequest对象:
异步使用XMLHttpRequest对象时,必须使用:onreadystatechange事件。
使用模式应该是:
1.创建该对象;-new
2.设置readystatechange事件触发一个回调函数; -onreadystatechagne
3.打开请求;-open
4.发送请求;-send
5.在回调函数中检查readyState属性,看数据是否准备就绪(是否等于4)。
* 如果没有准备好,隔一段时间再次检查。因为数据没有下载完时,我们无法使用它的属性和方法。
* 如果已经准备好,就继续往下执行;
编写回调函数
1.在xhr.send之前添加设置回调函数代码:
xhr.onreadystatechange = watching;
2.回调函数
function watching() {
if (xhr.readyState >= 4) {
if (xhr.status == 200) {
var msg = xhr.responseText; //服务器返回的字符串
} else alert("服务器错误!" + ajaxH.status);
}
}

注意:页面提交时,要确定数据是发往哪个页面的,数据提交的页面是由open()方法的第二个参数指定的。
View Code
View Code
1 <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %> 2 3 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 4 5 <html xmlns="http://www.w3.org/1999/xhtml"> 6 <head runat="server"> 7 <title></title> 8 <script type="text/javascript"> 9 function createXmlHttp() {//创建xhr对象 10 var xhobj = false; 11 try { 12 xhobj = new ActiveXObject("Msxml2.XMLHTTP"); // ie msxml3.0+ 13 } catch (e) { 14 try { 15 xhobj = new ActiveXObject("Microsoft.XMLHTTP"); //ie msxml2.6 16 } catch (e2) { 17 xhobj = false; 18 } 19 } 20 if (!xhobj && typeof XMLHttpRequest != 'undefined') {// Firefox, Opera 8.0+, Safari 21 xhobj = new XMLHttpRequest(); 22 } 23 return xhobj; 24 } 25 var xhobj = false; 26 window.onload = function () { xhobj = createXmlHttp(); } 27 28 //调用 29 function DoAjax() { 30 xhobj.open("GET", "GetAreasByAjax.ashx?isAjax=1", true); 31 //xhobj.setRequestHeader("If-Modified-Since", "0"); 32 xhobj.onreadystatechange = watching; 33 xhobj.send(null); //GET方式 34 35 } 36 37 function watching() { 38 if (xhobj.readyState >= 4) { 39 if (xhobj.status == 200) { 40 41 var msg = xhobj.responseText; //服务器返回的字符串 42 document.getElementById("divMsg").innerHTML =msg; 43 } 44 else 45 document.getElementById("divMsg").innerHTML = "服务器错误!" + xhobj.status; 46 } 47 } 48 </script> 49 </head> 50 <body> 51 <form id="form1" runat="server" action="GetAreasByAjax.ashx"> 52 <input type="button" value="调用Ajax" onclick="DoAjax();" /> 53 <div id="divMsg"> 54 55 </div> 56 </form> 57 58 </body> 59 </html>
1 <%@ WebHandler Language="C#" Class="GetAreasByAjax" %> 2 3 using System; 4 using System.Web; 5 6 public class GetAreasByAjax : IHttpHandler { 7 8 public void ProcessRequest (HttpContext context) { 9 //context.Response.ContentType = "text/plain"; 10 //context.Response.Write("Hello World"); 11 string isAjax = context.Request.QueryString["isAjax"]; 12 if (!string.IsNullOrEmpty(isAjax)) 13 { 14 context.Response.Write("我要好好学习Asp.Net!....."); 15 } 16 else 17 context.Response.Write("我bu要好好学习Asp.Net!"); 18 } 19 20 public bool IsReusable { 21 get { 22 return false; 23 } 24 } 25 26 }
浙公网安备 33010602011771号