XMLHttpRequest
对象
经过
ActiveXObject
实现()ajax
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) }); } }