版权所有:刺桐红-技术工作室 蓝文雄
声明:分享类型的文章均为我们工作室为了项目需求封装的工具类,本着分享合作的信念,其中如有错误,欢迎来信交流
lwx707@hotmail.com 2008-08-21
//Ajax请求文件
//针对不同浏览器的XMLHttpRequest对象数组
factories = [
function(){return new XMLHttpRequest();},
function(){return new ActiveXObject("Msxml2.XMLHTTP");},
function(){return new ActiveXObject("Microsoft.XMLHTTP");}
];
///创建XMLHttpRequest
///成功返回对象,失败抛出异常
function newRequest()
{
for(var i=0;i<factories.length;i++){
try{
var factory=factories[i];
var request=factory();
if(request!=null){
return request;
}
}
catch(e){
throw new Error("创建XMLHttpRequest对象发生异常:"+e);
}
}
}
///发送get请求
///url:请求目的地及其传递参数("/ashx/user.ashx?id=1&userName='+userName")
///callback:请求成功回调函数,接受两个参数model,other(可选)
///errorHandler:请求异常处理函数,接受两个参数request.status,request.statusText
///other:可选项,配合callback为了扩展,例如国家列表的获取使用这个参数传递鼠标位置pos
function get_request(url,callback,errorHandler,other)
{
var request=newRequest();
request.onreadystatechange=function()
{
if(request.readyState==4)
{
if(request.status==200)
{
callback(get_response(request),other); //请求正常
}
else
{
if(errorHandler) errorHandler(request.status,request.statusText); //请求异常
else callback(null);
}
}
}
request.open("GET",url);
request.send(null);
}
///发送post请求
///url:请求目的地
///callback:请求成功回调函数,接受两个参数:服务器数据,other(可选)
///values:请求体参数,格式:"id=1&userName"+userName;
///errorHandler:异常处理函数,接受两个参数request.status,request.statusText;
///other:可选项,配合callback为了扩展,例如国家列表的获取使用这个参数传递鼠标位置pos
function post_request(url,callback,values,errorHandler,other)
{
var request=newRequest();
request.onreadystatechange=function()
{
if(request.readyState==4)
{
if(request.status==200)
{
callback(get_response(request),other); //请求正常
}
else
{
if(errorHandler) errorHandler(request.status,request.statusText); //请求异常
else callback(null);
}
}
}
request.open("POST",url);
//指定请求格式,并且设置请求头部信息
request.setRequestHeader("Content-Length",values.length);
request.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
request.send(values);
};
///发送head请求,这个请求项目中除非特殊情况基本不会用到
///url:请求目的地
///callback:请求成功回调函数,接受两个参数:服务器数据
///errorHandler:可选项,异常处理函数,接受两个参数request.status,request.statusText,如果未指定 callback(null);
function head_request(url,callback,errorHandler)
{
var request=newRequest();
request.onreadystatechange=function()
{
if(request.readyState==4)
{
if(request.status==200)
{
callback(parseHeaders(request)); //请求正常,parseHeaders函数托管响应
}
}
else
{
if(errorHandler) errorHandler(request.status,request.statusText); //请求异常
else callback(null);
}
}
request.open("HEAD",url);
request.send(null);
};
///解析请求头部信息,未经过解析,因为是在发送head请求用到
function parseHeaders(request)
{
var headerText=request.getAllResponseHeaders(); //获取头部键值数组
var headers={}; //返回值
var ls=/^\s*/; //正则表达式
var ts=/\s*$/;
var lines=headerText.split("\n");
for(var i=0;i<lines.length;i++)
{
var line=lines[i];
if(line.length==0) continue; //忽略空行,否则开始解析
var pos=line.indexOf(':');
var name=line.substring(0,pos).replace(ls,"").replace(ts,"");
var value=line.substring(0,pos+1).replace(ls,"").replace(ts,"");
headers[name]=value; //填充返回值
}
return headers;
};
/// 解析服务器数据格式
/*
1、request.responseText,默认文本形式解析;
2、request.responseXML,xml形式解析
3、eval(request.responseText),JavaScript(json)形式解析,安全性问题
*/
function get_response(request)
{
switch(request.getResponseHeader("Content-Type"))
{
case "text/xml":
return request.responseXML;
case "text/json":
case "text/javascript":
case "application/javascript":
case "application/x-javascript":
return eval(request.responseText);
default:
return request.responseText;
}
}