XMLHttpRequest
对象
经由历程
ActiveXObject
完成()
new ActiveXObject('Microsoft.XMLHTTP')
- IE5是第一个引入
XMLHttpRequest
对象的浏览器;- IE5中,
XHR
对象是经由历程MSXML
库中的一个ActiveX
对象完成的;- IE中可能会碰到3种差别版本的
XHR
对象,即MSXML2.XMLHttp.6.0
,MSXML2.XMLHttp.3.0
,MSXML2.XMLHttp
;- 适用于IE7之前的版本
经由历程
XMLHttpRequest
组织函数
var xhr = new XMLHttpRequest();
- IE7+、FireFox、Opera、Chrome和Safari都支撑原生
XMLHttpRequest
对象;
天生XMLHttpRequest
对象的要领
function createXHR() {
if (typeof XMLHttpRequest !== 'undefined') {
return new XMLHttpRequest();
} else if (typeof ActiveXObject !== 'undefined'){
// 支撑IE7之前的版本
if (typeof arguments.callee.activeXString !== 'string') {
var versions = ['MSXML2.XMLHttp.6.0', 'MSXML2.XMLHttp.3.0', 'MSXML2.XMLHttp'];
for (var i = 0; i < versions.length; i++) {
try {
new ActiveXObject(versions[i]);
arguments.callee.activeXString = versions[i];
break;
} catch (e) {
//
}
}
}
return new ActiveXObject(arguments.callee.activeXString);
} else {
throw new Error("No XHR Object available!");
}
}
XHR
对象的readyState
属性
readyState
示意要求/相应历程的当前运动阶段;readyState
值变化将触发readystatechange
事宜,应用该事宜检测每次状况变化后的readyState
值;- 一般只对
readyState
值为4
的阶段感兴趣,此时一切数据已停当;- 为了确保跨浏览器兼容性,必须在挪用
open()
之前指定readystatechange
事宜处置惩罚顺序;
readyState
属性取值:
值 | 阶段 | 申明 |
---|---|---|
0 | 未初始化 | 还没有挪用 open() 要领 |
1 | 启动 | 已挪用 send() 要领,正在发送要求 |
2 | 发送 | send() 要领完成,已收到悉数相应内容 |
3 | 吸收 | 正在剖析相应内容 |
4 | 完成 | 相应内容剖析完成,能够在客户端挪用 |
XHR
对象收到相应后增加的属性
属性 | 申明 |
---|---|
responseText | 作为相应主体被返回的文本; |
responseXML | 若相应内容范例是”text/xml”或”application/xml”, 其值包含着相应数据的XML DOM文档; 关于非XML数据而言,responseXML值为 null |
status | 相应的HTTP状况 |
statusText | HTTP状况的申明 |
封装AJAX
要领
/**
*
* @param type 要求范例:get,post,...
* @param url
* @param dataObj 要求参数:对象字面量{key:value,...}
* @param callback
* @param async 是不是异步
*/
function ajax(type, url, dataObj, callback, async) {
var paramsStr = buildParamsStr(dataObj), xhr = null;
if (type === 'get' && dataObj) {
url = addURLParams(url, paramsStr);
}
xhr = createXHR();
xhr.onreadystatechange = function () {
if (xhr.readyState == 4) {
var status = xhr.status;
if ((xhr.status >= 200 && xhr.status < 300) || xhr.status == 304) {
console.log(xhr.responseText);
callback && callback(xhr.responseText);
} else {
console.log("要求非常!状况码:" + xhr.status);
}
}
};
xhr.open(type, url, async); // open()要领启动一个要求以备发送;
if (type == 'get') {
xhr.send(null);
} else {
xhr.setRequestHeader('content-type', 'application/x-www-form-urlencoded;charset=UTF-8');
xhr.send(paramsStr);
}
}
encodeURIComponent()
要领
GET
要求常常发作查询字符串花样激发的毛病;- 能够对查询字符串中每一个参数的称号和值用
encdoeURIComponent()
举行编码;
function buildParamsStr(paramsObj){
var str = '';
for (key in paramsObj) {
// 消除原型中属性
if (dataObj.hasOwnProperty(key)) {
// 对查询字符串中每一个参数称号和值用encdoeURIComponent()举行编码
str += "&" + encodeURIComponent(key) + "=" + encodeURIComponent(paramsObj[key]);
}
}
return str.slice(1);
}
function addURLParams(url, paramsStr) {
url += (url.indexOf('?') === -1) ? '?' : '&';
url += paramsStr + '&' + new Date().getTime();
return url;
}
挪用示例
window.onload = function(){
var btn = document.getElementById("btn1");
btn.onclick = function(){
ajax('get', 'a.txt', function fnSucc(str){
alert(str)
});
}
}