第一种方式;
function createXMLHttpRequest() {
var request = false;
if (window.XMLHttpRequest) {
request = new XMLHttpRequest();
if (request.overrideMimeType) {
request.overrideMimeType("text/xml");
}
} else if (window.ActiveXObject) {
var versions = ['Microsoft.XMLHTTP', 'MSXML.XMLHTTP', 'Msxml2.XMLHTTP.7.0',
'Msxml2.XMLHTTP.6.0',
'Msxml2.XMLHTTP.5.0', 'Msxml2.XMLHTTP.4.0', 'MSXML2.XMLHTTP.3.0', 'MSXML2.XMLHTTP'
];
for (var i = 0; i < versions.length; i++) {
try {
request = new ActiveXObject(versions[i]);
if (request) {
return request;
}
} catch (exception) {
request = false;
console.error(exception.error);
}
}
}
return request;
}
/*
returnType:返回值类型
HTML----返回的是文本,默认参数
XML ----返回的是XML对象
JSON ---- 返回的是JSON对象
传入时不区分大小写
isAsync:是否为ajax异步请求,默认为true
true ---->使用ajax异步请求
false ---->使用ajax同步请求
*/
function Ajax(returnType, isAsync) {
var ajaxObj = new Object();
ajaxObj.targetUrl = '';
ajaxObj.sendString = '';
if (typeof (isAsync) == 'undefined') {
ajaxObj.async = true;//默认采用ajax异步请求
} else {
ajaxObj.async = isAsync;
}
ajaxObj.returnType = returnType ? returnType.toUpperCase() : "HTML";//设置返回值类型
ajaxObj.callbackfunction = null;//回调函数
ajaxObj.ff;
ajaxObj.createXMLHttpRequest = function () {
var request = false;
if (window.XMLHttpRequest) {
ajaxObj.ff=true;
request = new XMLHttpRequest();
if (request.overrideMimeType) {
request.overrideMimeType("text/xml");
}
} else if (window.ActiveXObject) {
ajaxObj.ff=false;
var versions = ['Microsoft.XMLHTTP', 'MSXML.XMLHTTP', 'Msxml2.XMLHTTP.7.0',
'Msxml2.XMLHTTP.6.0',
'Msxml2.XMLHTTP.5.0', 'Msxml2.XMLHTTP.4.0', 'MSXML2.XMLHTTP.3.0', 'MSXML2.XMLHTTP'
];
for (var i = 0; i < versions.length; i++) {
try {
request = new ActiveXObject(versions[i]);
if (request) {
return request;
}
} catch (exception) {
request = false;
console.error(exception.error);
}
}
}
return request;
}
ajaxObj.XMLHttpRequest=ajaxObj.XMLHttpRequest();
ajaxObj.processHandle=function(){
if(ajaxObj.XMLHttpRequest.readyState==4){
ajaxObj.ff=false;
if(ajaxObj.XMLHttpRequest.status == 200){
if(ajaxObj.returnType == "HTML"){
ajaxObj.callbackfunction(ajaxObj.XMLHttpRequest.responseText);
}else if(ajaxObj.returnType == "JSON"){
ajaxObj.callbackfunction(eval('('+ajaxObj.XMLHttpRequest.responseText+')'));
}else if(ajaxObj.returnType == "XML"){
ajaxObj.callbackfunction(ajaxObj.XMLHttpRequest.responseXML);
}
}
}
}
/*
GET请求方法:
targetUrl:请求的服务器目标地址,在URL中传递请求参数.
http://localhost:8080/server.php?key1=value1&&key2=value2
callbackfunction:回调函数,可选。 需要一个参数(服务器端返回的数据:XML对象、JSON对象、文本)
*/
ajaxObj.get=function(targetUrl,callbackfunction){
ajaxObj.targetUrl=targetUrl;
if(callbackfunction){
ajaxObj.XMLHttpRequest.onreadystatechange=ajaxObj.processHandle;
ajaxObj.callbackfunction=callbackfunction;
}
if(window.XMLHttpRequest){
ajaxObj.XMLHttpRequest.open('GET',ajaxObj.targetUrl,ajaxObj.async);
ajaxObj.XMLHttpRequest.send(null);
}else{
ajaxObj.XMLHttpRequest.open('GET',ajaxObj.targetUrl,ajaxObj.async);
ajaxObj.XMLHttpRequest.send();
}
if(!ajaxObj.async && ajaxObj.ff){
ajaxObj.processHandle();
}
}
/*
POST请求方法:
targetUrl:请求的目标地址
sendString:字符串数据("key1=value1&&key2=value2","{key1:value1,key2:value2}")
callbackfunction:回调函数,可选。 需要一个参数(服务器端返回的数据:XML对象、JSON对象、文本)
*/
ajaxObj.post=function(targetUrl,sendString,callbackfunction){
ajaxObj.targetUrl=targetUrl;
if(typeof(sendString) == "object"){
var str="";
for(var pro in sendString){
str+=pro+"="+sendString[pro]+"&";
}
ajaxObj.sendString=str.substring(0,str.length-1);
}else{
ajaxObj.sendString=sendString;
}
if(callbackfunction){
ajaxObj.XMLHttpRequest.onreadystatechange=ajaxObj.processHandle;
ajaxObj.callbackfunction=callbackfunction;
}
request.open("POST",targetUrl, ajaxObj.async);
request.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
request.send(sendString);
if(!ajaxObj.async && ajaxObj.ff)
ajaxObj.processHandle();
}
return ajaxObj;//将封装的对象返回
}
第二种封装方式:
//模拟jquery方式,封装js原生的ajax请求
var request= (function $(){
var ajaxObj=window.XMLHttpRequest?new XMLHttpRequest():new ActiveXObject('Microsoft.XMLHTTP');
if(!ajaxObj){
throw new Error('您的浏览器不支持异步发起HTTP请求!');
}
function _doAjax(option){
var option=option || {},
type=(option.type || 'GET').toUpperCase(),
async=option.async || true,//默认为异步请求
url=option.url,
data=option.data || null,
error=option.error || function(){},
success=option.success || function(){},
complete=option.complete || function(){} ;
if(!url){
throw new Error('您没有填写URL');
}
ajaxObj.open(type,url,async);
type === "POST" && ajaxObj.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
ajaxObj.send(type==="GET"?null:formatDatas(data));
ajaxObj.onreadystatechange=function(){
if(ajaxObj.readyState === 4 && ajaxObj.status === 200){
success(JSON.parse(ajaxObj.responseText));//调用成功回调函数
}
}
}
function formatDatas(obj){//将json对象转换为字符串数据("key1=value1&key2=value2.....")
if(typeof(obj) == "object"){
var str='';
for(var key in obj){
str+=key+"="+obj[key]+'&';
}
return str.replace(/&$/,'');//正则替换最后一个&
}
}
return{
ajax:function(option){//option:JSON对象 支持post/get请求
_doAjax(option);
},
post:function(url,data,callbackfunction){//post请求方式
_doAjax({
type:"POST",
url:url,
data:data,
success:callbackfunction
});
},
get:function(url,callbackfunction){//get请求方式
_doAjax({
type:"GET",
url:url,
success:callbackfunction
});
}
}
})();//立即执行函数
测试案例:
Ajax请求:
Post请求方式:
Get请求方式: