javascript xmlhttprequest 纯天然无第三方插件 ajax 实现
--> -->
手写的纯javascript 实现xmlhttprequest .
屛弃了所有第三方javascript 包,这样做的目的主要是节省空间,现在很多第三方框架动辄几十K,上百k 等.
如果我们只用到其中一个很小的 ajax 功能,完全没有必要这样做.
而且当前的应用环境是手机端的展示,所以对于流量的考虑至关重要.
看下代码实现:
function ajax(option, callback) {
//option 参数必须是对象,里面包括 (type 请求方式,url 请求路径,param 请求参数)
if (typeof option === 'object') {
//option 没有定义请求url ,直接返回错误
if (!option.hasOwnProperty('url')) {
return callback('no url');
}
//option 没有定义请求方式,默认我 get 请求
if (!option.hasOwnProperty('type')) {
option.type = 'GET';
}
} else {
//如果 option 不是对象,直接返回
return callback('option not object');
}
var xmlHttp = null;
if (window.XMLHttpRequest) {
//针对chrome,firefox 等浏览器创建 xmlhttprequest 对象
xmlHttp = new XMLHttpRequest();
if (xmlHttp.overrideMimeType) {
//针对http传输mime类型不是 text/xml 时的设置.
xmlHttp.overrideMimeType('text/xml');
}
} else if (window.ActiveXObject) {
//针对变态浏览器IE及其各版本创建 xmlhttprequest 对象
try {
xmlHttp = new ActiveXObject("Msxml2.XMLHTTP");
} catch (e) {
try {
xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
} catch (e) {
console.log('Microsoft.XMLHTTP xmlHttpRequest Generation error!', e);
return callback('Microsoft.XMLHTTP xmlHttpRequest Generation error!', null);
}
}
}
//如果参数对象option 包括 param 参数对象
if ( option.hasOwnProperty('param')) {
//如果传输方式是 get 时
if(option.type.toLowerCase() === 'get'){
option.url += '?';
var i = 0;
for (var key in option.param) {
option.url += i == 0 ? (key + '=' + option.param[key]) : ('&' + key + '=' + option.param[key]);
++i;
}
}
//如果传输方式是 post 时
if(option.type.toLowerCase() === 'post'){
xmlHttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");
var params,i=0;
for (var key in option.param) {
params += i == 0 ? (key + '=' + option.param[key]) : ('&' + key + '=' + option.param[key]);
++i;
}
xmlHttp.send(params);
}
}
xmlHttp.open(option.type.toUpperCase(), option.url, true);
xmlHttp.send();
//ajax 请求状态变化监听
xmlHttp.onreadystatechange = function () {
// readState == 4 请求完成
if (xmlHttp.readyState == 4) {
//状态码 返回 200 表示请求成功
if (xmlHttp.status == 200) {
callback(null, xmlHttp.responseText);
}
//状态码 返回 1xx 提示客户端使用更高版本 HTTP 协议
if ((xmlHttp.status / 100) === 1) {
callback('请使用更高版本的HTTP协议');
}
//状态码 返回 3xx 表示请求实现了跳转
if ((xmlHttp.status / 100) === 3) {
callback('请求跳转到新的URL');
}
//状态码 返回 4xx 表示请求的资源不存在,比如 404
if ((xmlHttp.status / 100) === 4) {
callback('客户端请求的资源不存在');
}
//状态码 返回 5xx 表示服务器端错误
if ((xmlHttp.status / 100) === 5) {
callback('服务器端错误');
}
}
};
}
上面的注释足够清楚.
如何使用,见下面的代码:
ajax({
type: "GET",
url: "/common/blog/detail",
param: {
key: "66787826c3da3e9f1db21"
}
}, function (err, result) {
//这里返回错误信息 或者 正确结果
alert(err + result);
});