jian_ajax.js:
/**
* ============================================================
* A J A X
* ============================================================
* DESCRIPTION: ajax调用框架,供页面简单快速调用来实现ajax通信
* @AUTHOR: xiaolong8
* @VERSION: 1.0.0
* @SEE:
* @CREATION DATE: 2012年3月24日,9:59:30
* @DATE: 2012-3-25 16:57:44
* COPYRIGHT: 失业中
***************************************************************/
/**
* 使用方法:
* 一、将js文件引入需使用ajax的HTML文档,在HTML文档添加:<script type="text/javascript" src="jian_ajax.js"></script>
* 二、调用方法。
* 1) GET方式:
* @example ajax.get("servlet/AjaxServlet", {
* item0: document.getElementById("item0").value,
* item1: document.getElementById("item1").value
* }, {
* sucess: function(responseXML, responseText){
* alert(responseText);
* },
* fail: function(responseXML, responseText){
* alert("fail");
* }
* });
*
* 2) POST方式:
* @example 1) URL编码形式提交。
* ajax.post("servlet/AjaxServlet",
* ajax.CONTENT_TYPE_URLENCODED, {
* item0: document.getElementById("item0").value,
* item1: document.getElementById("item1").value
* }, {
* sucess: function(responseXML, responseText){
* alert(responseText);
* },
* fail: function(responseXML, responseText){
* alert("fail");
* }
* });
* 2) 大块二进制数据形式提交,如文件上传。
* ajax.post("servlet/AjaxServlet",
* ajax.CONTENT_TYPE_DATA,
* "send content.", {
* sucess: function(responseXML, responseText){
* alert(responseText);
* },
* fail: function(responseXML, responseText){
* alert("fail");
* }
* });
*/
/* 全局变量ajax */
var ajax = {
/** 常量: POST提交请求报文头方式 */
/* application/x-www-form-urlencoded: 表示客户端提交给服务器文本内容的编码方式是URL编码 */
CONTENT_TYPE_URLENCODED: "application/x-www-form-urlencoded",
/* multipart/form-data: 表示客户端提交给服务器的为数据,一般都是大块二进制数据,如文件。 */
CONTENT_TYPE_DATA: "multipart/form-data",
/* XMLHttpRequest对象 */
xhr: null,
/* 请求回应后的回调函数对象
* 约定格式:
* {
* sucess: function(responseXML, responseText){
* ...//请求成功执行的操作
* },
* fail: function(responseXML, responseText){
* ...//请求失败执行的操作
* }
* }
*/
callback: null,
/**
* 创建XMLHttpRequest对象
* @param
* @return
* @example
*/
createXhr: function(){
if(ajax.xhr == null){
if(window.XMLHttpRequest){
ajax.xhr = new XMLHttpRequest();
} else if(window.ActiveXObject){
try {
ajax.xhr = new ActiveXObject("MSXML2.XMLHTTP");
} catch(e){
try {
ajax.xhr = new ActiveXObject("Microsoft.XMLHTTP");
} catch(e_){}
}
}
}
},
/**
* 编码参数。将对象编码成url形式
* @param params 请求附带参数对象。
* 约定格式:普通非嵌套对象,即每个属性名 对应 一个非对象的属性值,
* 如{username: "xiaolong", password: "xxxxxx"}
* @return url形式的字符串,如:username=xiaolong&password=xxxxxx
* @example var urlSuffix = encodeParams({username: "xiaolong", password: "xxxxxx"});
*/
encodeParams: function(params){
var s = "";
for (var i in params) {
s += "&" + i + "=" +params[i];
}
s = s.substr(1);
return s;
},
/**
* 以get方式获取数据
* @param url 请求的地址
* @param params 请求附带参数对象,
* 约定格式:普通非嵌套对象,即每个属性名 对应 一个非对象的属性值,
* 如{username: "xiaolong", password: "xxxxxx"}
* @param callback 请求回应后的回调函数对象
* 约定格式:
* {
* sucess: function(responseXML, responseText){
* ...//请求成功执行的操作
* },
* fail: function(responseXML, responseText){
* ...//请求失败执行的操作
* }
* }
* @return
* @example ajax.get("servlet/AjaxServlet", {
* item0: document.getElementById("item0").value,
* item1: document.getElementById("item1").value
* }, {
* sucess: function(responseXML, responseText){
* alert(responseText);
* },
* fail: function(responseXML, responseText){
* alert("fail");
* }
* });
*/
get: function(url, params, callback){
ajax.callback = callback;
if (!ajax.xhr) {
ajax.createXhr();
}
if (ajax.xhr) {
ajax.xhr.open("GET", encodeURI(url + "?" + ajax.encodeParams(params)), true);
ajax.xhr.onreadystatechange = ajax.handleStateChange;
ajax.xhr.send(null);
}
},
/**
* 以post方式获取数据
* @param url 请求的地址
* @param enctype POST提交请求报文头编码类型
* @param content 发送内容
* @param callback 请求回应后的回调函数对象
* 约定格式:
* {
* sucess: function(responseXML, responseText){
* ...//请求成功执行的操作
* },
* fail: function(responseXML, responseText){
* ...//请求失败执行的操作
* }
* }
* @return
* @example 1) ajax.post("servlet/AjaxServlet",
* ajax.CONTENT_TYPE_URLENCODED, {
* item0: document.getElementById("item0").value,
* item1: document.getElementById("item1").value
* }, {
* sucess: function(responseXML, responseText){
* alert(responseText);
* },
* fail: function(responseXML, responseText){
* alert("fail");
* }
* });
* 2) ajax.post("servlet/AjaxServlet",
* ajax.CONTENT_TYPE_DATA,
* "send content.", {
* sucess: function(responseXML, responseText){
* alert(responseText);
* },
* fail: function(responseXML, responseText){
* alert("fail");
* }
* });
*/
post: function(url, enctype, content, callback){
ajax.callback = callback;
if(!ajax.xhr){
ajax.createXhr();
}
if(ajax.xhr){
ajax.xhr.open("POST", encodeURI(url), true);
ajax.xhr.onreadystatechange = ajax.handleStateChange;
if(ajax.CONTENT_TYPE_URLENCODED == enctype){
ajax.xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
ajax.xhr.send(encodeURI(ajax.encodeParams(content)));
} else if(ajax.CONTENT_TYPE_DATA == enctype){
ajax.xhr.setRequestHeader("Content-Type", "multipart/form-data");
ajax.xhr.send(content);
}
}
},
/**
* 处理readyState属性改变时的事件
* @param
* @return
* @example
*/
handleStateChange: function(){
if(ajax.xhr.readyState == 4){// 数据接收完毕,此时可以通过通过responseXML和responseText获取完整的回应数据
if(ajax.xhr.status == 200){// 200: OK
ajax.callback.sucess(ajax.xhr.responseXML, ajax.xhr.responseText);
} else{
ajax.callback.fail(ajax.xhr.responseXML, ajax.xhr.responseText);
}
}
}
};
// var ajaxTools = function(){
// this.xmlHttpReq = null;
// this.callback = null;
//
// this.createXmlRequest = function(){
// if(window.XMLHttpRequest){
// this.xmlHttpReq = new XMLHttpRequest();
// } else if(window.ActiveXObject){
// try {
// this.xmlHttpReq = new ActiveXObject("MSXML2.XMLHTTP");
// } catch(e){
// try {
// this.xmlHttpReq = new ActiveXObject("Microsoft.XMLHTTP");
// } catch(e_){}
// }
// }
// };
//
// this.get = function(url, callbackFunc) {
// this.callback = callbackFunc;
// if(!this.xmlHttpReq){
// this.createXmlRequest();
// }
// if(this.xmlHttpReq){
// this.xmlHttpReq.open("GET", url, true);
// this.xmlHttpReq.onreadystatechange = this.processResponse;
// this.xmlHttpReq.send(null);
// }
// };
//
// this.processResponse = function (){
// if(this.readyState == 4){// 数据接收完毕,此时可以通过通过responseXML和responseText获取完整的回应数据
// if(this.status == 200){// 200: OK
// //var res = XMLHttpReq.responseXML.getElementsByTagName("res")[0].firstChild.data;
// parent.callback.sucess(this.responseXML, this.responseText);
// } else{
// parent.callback.fail(this.responseXML, this.responseText);
// }
// }
// };
// return this;
// }();
PS:
POST提交请求报文头编码类型,表单enctype属性:
1) application/x-www-form-urlencoded: 默认值,只要是能输出网页的服务器端环境都可以
2) multipart/form-data: 上传二进制数据,只有使用multipart/form-data ,才能完整的传递文件数据,进行上传操作