XHR
XHR即XMLHttpRequest,XMLHttpRequest对象是现今所有AJAX和Web 2.0应用程序的技术基础。虽然目前的主流趋势都是在提供各种AJAX(Asynchronism Javascript And Xml)框架以进一步简化XHR对象的使用,但是,了解对象的工作机制是很有必要的,下面,小弟谈谈自己的见解,如有不当敬请指正。
AJAX是一个专用术语,用于实现在客户端脚本和服务器之间的数据交互过程。此技术最大的优点就是:我们从服务器检索数据的时候不必把当前用户正在使用的页面全部回馈给服务器,它与JavaScript结合,使得更新被显示的HTML内容而不需要刷新整个页面,AJAX使得浏览器类似桌面程序,变得更有交互性。
AJAX利用一个构建到浏览器内部的对象(XMLHttpRequest)来实现发送和接收HTTP请求与响应信息。经由XHR对象发送HTTP请求并不需要页面中拥有或者寄回一个<form>元素。A代表的意思是异步,这表示XHR对象请求过程可以另外开启一个线程,不影响Web页面上的其他HTML/JavaScript继续对其浏览器进行处理。需要注意的是缺省状态的情况下是异步进行的,需要同步处理只需要在open()方法中指定一下。注:同步处理会使页面的处理暂停在XHR向服务器的请求过程中,直到给XHR请求处理完成得到服务器回应后为止。
下面简单介绍一下XMLHttpRequest对象的属性及事件
一、XHR的属性:
1、readyState
当XHR对象把一个HTTP请求发送到服务器的过程中会经历几个状态,直到请求被处理,然后才接收一个回应。readyState就是XHR请求的状态属性,它本身有5个属性值:(如下表)
readyState取值 |
描述 |
0 |
描述一种"未初始化"状态;此时,已经创建一个XMLHttpRequest对象,但是还没有初始化。 |
1 |
描述一种"发送"状态;此时,代码已经调用了XMLHttpRequest open()方法并且XMLHttpRequest已经准备好把一个请求发送到服务器。 |
2 |
描述一种"发送"状态;此时,已经通过send()方法把一个请求发送到服务器端,但是还没有收到一个响应。 |
3 |
描述一种"正在接收"状态;此时,已经接收到HTTP响应头部信息,但是消息体部分还没有完全接收结束。 |
4 |
描述一种"已加载"状态;此时,响应已经被完全接收。 |
var xhr;
if(window.ActiveXObject)//判断浏览器是否支持ActiveX
xhr = new ActiveXObject('Microsoft.XMLHTTP');
else if (window.XMLHttpRequest)//判断浏览器是否支持XHR
xhr = new XMLHttpRequest();
function send()//自定义方法
{
var checkname = document.getElementById("tbxName").value;
xhr.open("POST","http://localhost:1956/CheckBySql/Service.asmx",true);
xhr.SetRequestHeader ("Content-Type","text/xml; charset=utf-8");
xhr.SetRequestHeader ("SOAPAction","http://tempuri.org/IsExist");
var data="<?xml version=\"1.0\" encoding=\"utf-8\"?><soap:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\"><soap:Body><IsExist xmlns=\"http://tempuri.org/\"><name>" + checkname + "</name></IsExist></soap:Body></soap:Envelope>";
xhr.onreadystatechange=processRequest; //事件处理,processRequeset是个处理方法
xhr.send(data);
}
function processRequest()
{
//alert(xh.responseText);
if(xh.readyState==4) //接受完毕
{
if(xh.status==200)//正确 401代表错误
{
var pat= new RegExp("<IsExistResult>([\\w\\W]*?)<\\/IsExistResult>","i");
var ar=pat.exec(xh.responseText);
var x = ar[0].replace("<IsExistResult>","");
var y = x.replace("</IsExistResult>","");
var result = parseInt(y);
if(result == 1)
{
document.getElementById("lblMsg").innerHTML = "用户名已存在!";
}
else
{
document.getElementById("lblMsg").innerHTML = "用户名可以使用!";
}
}
}
}
</script>
<body>
<form id="form1" runat="server">
<div>
<table class="style1">
<tr>
<td style="width: 50px">
<asp:Label ID="lblName" runat="server" Text="姓名:"></asp:Label>
</td>
<td style="width: 129px">
<asp:TextBox ID="tbxName" runat="server" onblur="javascript:send();"></asp:TextBox>
</td>
<td>
<asp:Label ID="lblMsg" runat="server"></asp:Label>
</td>
</tr>
</div>
</form>
</body>
</html>