AJAX原理
同步和异步的区别
XmlHttp
基本介绍
最通用的定义为:XmlHttp是一套可以在Javascript、VbScript、Jscript等脚本语言中通过http协议传送或从接收XML及其他数据的一套API。XmlHttp最大的用处是可以更新网页的部分内容而不需要刷新整个页面。
来自MSDN的解释:XmlHttp提供客户端同http服务器通讯的协议。客户端可以通过XmlHttp对象(MSXML2.XMLHTTP.3.0)向http服务器发送请求并使用微软XML文档对象模型Microsoft® XML Document Object Model (DOM)处理回应。现在的绝对多数浏览器都增加了对XmlHttp的支持,IE中使用ActiveXObject方式创建XMLHttp对象,其他浏览器如:Firefox、Opera等通过window.XMLHttpRequest来创建XMLhttp对象。
XmlHttp对象参考
属性
null | null |
---|---|
onreadystatechange* | 指定当readyState属性改变时的事件处理句柄。只写 |
readyState | 返回当前请求的状态,只读. |
responseBody | 将回应信息正文以unsigned byte数组形式返回.只读 |
responseStream | 以Ado Stream对象的形式返回响应信息。只读 |
responseText | 将响应信息作为字符串返回.只读 |
responseXML | 将响应信息格式化为Xml Document对象并返回,只读 |
status | 返回当前请求的http状态码.只读 |
statusText | 返回当前请求的响应行状态,只读 |
* 表示此属性是W3C文档对象模型的扩展.
onreadystatechange
指定当readyState属性改变时的事件处理句柄
语法
oXMLHttpRequest.onreadystatechange = funcMyHandler;
Example
如下的例子演示当XMLHTTPRequest对象的readyState属性改变时调用HandleStateChange函数,当数据接收完毕后(readystate == 4)此页面上的一个按钮将被激活
var xmlhttp=null;
function postorder(xmldoc) {
var xmlhttp = new ActiveXObject("Msxml2.XMLHTTP.5.0");
xmlhttp.Open("POST","http://myserver/orders/processorder.asp",false);
xmlhttp.onreadystatechange= HandleStateChange;
xmlhttp.Send(xmldoc);
myButton.disabled = true;
}
function HandleStateChange() {
if (xmlhttp.readyState == 4)
{
myButton.disabled = false;
alert("Result = " + xmlhttp.responseXML.xml);
}
}
备注
此属性只写,为W3C文档对象模型的扩展.
readyState
返回XMLHTTP请求的当前状态
语法
lValue = oXMLHttpRequest.readyState;
Example
var XmlHttp;
XmlHttp = new ActiveXObject("Msxml2.XMLHTTP.3.0");
function send() {
XmlHttp.onreadystatechange = doHttpReadyStateChange;
XmlHttp.open("GET","http://localhost/sample.xml",true);
XmlHttp.send();
}
function doHttpReadyStateChange() {
if (XmlHttp.readyState == 4) {
alert("Done");
}
}
备注
变量,此属性只读,状态用长度为4的整型表示.定义如下:
null | null |
---|---|
0 (未初始化) | 对象已建立,但是尚未初始化(尚未调用open方法) |
1 (初始化) | 对象已建立,尚未调用send方法 |
2 (发送数据) | send方法已调用,但是当前的状态及http头未知 |
3 (数据传送中) | 已接收部分数据,因为响应及http头不全,这时通过responseBody和responseText获取部分数据会出现错误 |
4 (完成) | 数据接收完毕,此时可以通过通过responseBody和responseText获取完整的回应数据 |
responseBody
返回某一格式的服务器响应数据
语法
strValue = oXMLHttpRequest.responseBody;
Example
var xmlhttp = new ActiveXObject("Msxml2.XMLHTTP.3.0");
xmlhttp.open("GET","http://localhost/books.xml",false);
xmlhttp.send();
alert(xmlhttp.responseBody);
备注
变量,此属性只读,以unsigned array格式表示直接从服务器返回的未经解码的二进制数据。
responseStream
以Ado Stream对象的形式返回响应信息
语法
strValue = oXMLHttpRequest.responseStream;
备注
变量,此属性只读,以Ado Stream对象的形式返回响应信息。
responseText
将响应信息作为字符串返回
语法
strValue = oXMLHttpRequest.responseText;
Example
var xmlhttp = new ActiveXObject("Msxml2.XMLHTTP.3.0");
xmlhttp.open("GET",false);
xmlhttp.send();
alert(xmlhttp.responseText);
备注
变量,此属性只读,将响应信息作为字符串返回。
XMLHTTP尝试将响应信息解码为Unicode字符串,XMLHTTP默认将响应数据的编码定为UTF-8,如果服务器返回的数据带BOM(byte-order mark),XMLHTTP可以解码任何UCS-2 (big or little endian)或者UCS-4 数据。注意,如果服务器返回的是xml文档,此属性并不处理xml文档中的编码声明。你需要使用responseXML来处理。
responseXML
将响应信息格式化为Xml Document对象并返回
语法
var objdispatch = oXMLHttpRequest.responseXML;
Example
var xmlhttp = new ActiveXObject("Msxml2.XMLHTTP.3.0");
xmlhttp.open("GET",false);
xmlhttp.send();
alert(xmlhttp.responseXML.xml);
备注
变量,此属性只读,将响应信息格式化为Xml Document对象并返回。如果响应数据不是有效的XML文档,此属性本身不返回XMLDOMParseError,可以通过处理过的DOMDocument对象获取错误信息。
status
返回当前请求的http状态码
语法
lValue = oXMLHttpRequest.status;
Example
var xmlhttp = new ActiveXObject("Msxml2.XMLHTTP.3.0");
xmlhttp.open("GET",false);
xmlhttp.send();
alert(xmlhttp.status);
返回值
长整形标准http状态码,定义如下:
Number | Description | Number | Description |
---|---|---|---|
100 | Continue | 101 | Switching protocols |
200 | OK | 201 | Created |
202 | Accepted | 203 | Non-Authoritative @R_875_4045@ion |
204 | No Content | 205 | Reset Content |
206 | Partial Content | 300 | Multiple Choices |
301 | Moved Permanently | 302 | Found |
303 | See Other | 304 | Not Modified |
305 | Use Proxy | 307 | Temporary Redirect |
400 | Bad Request | 401 | Unauthorized |
402 | Payment required | 403 | Forbidden |
404 | Not Found | 405 | Method Not Allowed |
406 | Not Acceptable | 407 | Proxy Authentication required |
408 | Request Timeout | 409 | Conflict |
410 | Gone | 411 | Length required |
412 | Precondition Failed | 413 | Request Entity Too Large |
414 | Request-URI Too Long | 415 | Unsupported Media Type |
416 | Requested Range Not Suitable | 417 | Expectation Failed |
500 | Internal Server Error | 501 | Not Implemented |
502 | Bad Gateway | 503 | Service Unavailable |
504 | Gateway Timeout | 505 | HTTP Version Not Supported |
备注
长整形,此属性只读,返回当前请求的http状态码,此属性仅当数据发送并接收完毕后才可获取。
statusText
返回当前请求的响应行状态
语法
strValue = oXMLHttpRequest.statusText;
Example
var xmlhttp = new ActiveXObject("Msxml2.XMLHTTP.3.0");
xmlhttp.open("GET",false);
xmlhttp.send();
alert(xmlhttp.statusText);
备注
字符串,此属性只读,以BSTR返回当前请求的响应行状态,此属性仅当数据发送并接收完毕后才可获取。
方法
null | null |
---|---|
abort | 取消当前请求 |
getAllResponseHeaders | 获取响应的所有http头 |
getResponseHeader | 从响应信息中获取指定的http头 |
open | 创建一个新的http请求,并指定此请求的方法、URL以及验证信息(用户名/密码) |
send | 发送请求到http服务器并接收回应 |
setRequestHeader | 单独指定请求的某个http头 |
abort
取消当前请求
语法
oXMLHttpRequest.abort();
备注
调用此方法后,当前请求返回UNINITIALIZED 状态。
getAllResponseHeaders
获取响应的所有http头
语法
strValue = oXMLHttpRequest.getAllResponseHeaders();
Example
var xmlhttp = new ActiveXObject("Msxml2.XMLHTTP.3.0");
xmlhttp.open("GET",false);
xmlhttp.send();
alert(xmlhttp.getAllResponseHeaders());
输出由web服务器返回的http头信息,example:
Server:Microsoft-IIS/5.1
X-Powered-By:ASP.NET
Date:Sat,07 Jun 2003 23:23:06 GMT
Content-Type:text/xml
Accept-Ranges:bytes
Last Modified:Sat,06 Jun 2003 17:19:04 GMT
ETag:"a0e2eeba4f2cc31:97f"
Content-Length:9
备注
每个http头名称和值用冒号分割,并以\r\n结束。当send方法完成后才可调用该方法。
getResponseHeader
从响应信息中获取指定的http头
语法
strValue = oXMLHttpRequest.getResponseHeader(bstrHeader);
Example
var xmlhttp = new ActiveXObject("MSXML2.XMLHTTP.3.0");
xmlhttp.open("GET",false);
xmlhttp.send();
alert(xmlhttp.getResponseHeader("Server"));
输出http头中的server列:当前web服务器的版本及名称。
备注
当send方法成功后才可调用该方法。如果服务器返回的文档类型为”text/xml
“,则这句话xmlhttp.getResponseHeader("Content-Type");
将返回字符串”text/xml
“。可以使用getAllResponseHeaders
方法获取完整的http头信息。
open
创建一个新的http请求,并指定此请求的方法、URL以及验证信息
语法
oXMLHttpRequest.open(bstrMethod,bstrUrl,varasync,bstrUser,bstrPassword);
参数
bstrMethod
- http方法,例如:POST、GET、PUT及PROPFIND。大小写不敏感。
bstrUrl
- 请求的URL地址,可以为绝对地址也可以为相对地址。
varasync[可选]
bstrUser[可选]
- 如果服务器需要验证,此处指定用户名,如果未指定,当服务器需要验证时,会弹出验证窗口。
bstrPassword[可选]
Example
下面的例子演示从服务器请求book.xml,并显示其中的book字段。
var xmlhttp = new ActiveXObject("Msxml2.XMLHTTP.3.0");
xmlhttp.open("GET",false);
xmlhttp.send();
var book = xmlhttp.responseXML.selectSingleNode("//book[@id='bk101']");
alert(book.xml);
备注
send
发送请求到http服务器并接收回应
语法
oXMLHttpRequest.send(varBody);
参数
- varBody
- 欲通过此请求发送的数据。
Example
xmlhttp = new ActiveXObject("Msxml2.XMLHTTP.3.0");
xmlhttp.open("GET",false);
xmlhttp.send();
alert(xmlhttp.responseXML.xml);
备注
此方法的同步或异步方式取决于open方法中的bAsync参数,如果bAsync == False,此方法将会等待请求完成或者超时时才会返回,如果bAsync == True,此方法将立即返回。
如果发送的数据为BSTR,则回应被编码为utf-8,必须在适当位置设置一个包含charset的文档类型头。
如果发送的数据为XML DOM object,则回应将被编码为在xml文档中声明的编码,如果在xml文档中没有声明编码,则使用默认的UTF-8。
setRequestHeader
单独指定请求的某个http头
语法
oXMLHttpRequest.setRequestHeader(bstrHeader,bstrValue);
参数
bstrHeader
- 字符串,头名称。
bstrValue
- 字符串,值。
备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。