模拟jQuery的ajax简单实现


/**
* @author yli
* @date 2012-08-15
*/

var XmlHttp = {
get : "get",
post : "post",
reqCount : 4,
createXhr : function() {
var xmlhttp = null;
if (window.XMLHttpRequest) {
xmlhttp = new XMLHttpRequest();
} else {
xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
}
return xmlhttp;
},
ajax : function(_json) {
var url = _json["url"];
var callback = _json["callback"];
var async = (_json["async"] == undefined ? true : _json["async"]);
var error = _json["error"];
var params = _json["params"];
var method = (_json["method"] == undefined ? XmlHttp.post : _json["method"]).toLowerCase();

url = XmlHttp.serializeUrl(url);
params = XmlHttp.serializeParams(params);
if (method == XmlHttp.get && params != null) {
url += ("&" + params);
params = null; //如果是get请求,保证最终会执行send(null)
}

xmlhttp = XmlHttp.createXhr();
xmlhttp.open(method, url, async);

if (method == XmlHttp.post) {
xmlhttp.setRequestHeader("Content-type",
"application/x-www-form-urlencoded;charset=UTF-8");
}

var execount = 0;
// 异步
if (async) {
// readyState 从 1~4发生4次变化
xmlhttp.onreadystatechange = function() {
execount++;
// 等待readyState状态不再变化之后,再执行回调函数
if (execount == XmlHttp.reqCount) {
XmlHttp.execBack(xmlhttp, callback, error);
}
};
// send方法要在在回调函数之后执行
xmlhttp.send(params);
} else {
// 同步 readyState 直接变为 4
// 并且 send 方法要在回调函数之前执行
xmlhttp.send(params);
XmlHttp.execBack(xmlhttp, callback, error);
}
},
execBack : function(xmlhttp, callback, error) {
if (xmlhttp.readyState == 4
&& (xmlhttp.status == 200 || xmlhttp.status == 304)) {
callback(xmlhttp);
} else {
if (error) {
error(xmlhttp);
} else {
var errorMsg = "no error callback function!";
if(xmlhttp.responseText) {
errorMsg = xmlhttp.responseText;
}
alert(errorMsg);
// throw errorMsg;
}
}
},
serializeUrl : function(url) {
var cache = "cache=" + Math.random();
if (url.indexOf("?") > 0) {
url += ("&" + cache);
} else {
url += ("?" + cache);
}
return url;
},
serializeParams : function(params) {
var ud = undefined;
if (ud == params || params == null || params == "") {
return null;
}
if (params.constructor == Object) {
var result = "";
for ( var p in params) {
result += (p + "=" + params[p] + "&");
}
return result.substring(0, result.length - 1);
}
return params;
}
};

/*
** 测试
*/

// 执行成功的回调函数
function success(xmlhttp){
alert(xmlhttp.responseText);
}

//执行失败的回调函数
function error(xmlhttp){
alert(xmlhttp.responseText);
}

function testAjax() {

// get 请求
var url = "http://localhost:8080/WebDemo/UserServlet?name=yli&age=21";

XmlHttp.ajax({
url:url,
callback:success, // 成功回调函数,必须要写
error:error, // 失败回调函数,可以不写
async:true, // 默认就是 true
method:"get", // 默认是 post
params:{p1:"111",p2:"222"} // 即使是get请求,也可以通过 params 提交参数,会和url的参数合并
});

// post 请求
// var url = "http://localhost:8080/WebDemo/UserServlet";

// XmlHttp.ajax({
// url:url,
// callback:success, // 成功回调函数,必须要写
// params:{p1:"111",p2:"222"} // post请求,参数只能通过params提交
// });
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值