var HTTP = {};
//下面是一个创建 XMLHttpRequest 对象工厂函数列表
HTTP._factories = [
function() { return new XMLHttpRequest(); },
function() { return new ActiveXObject("Msxml2.XMLHTTP"); },
function() { return new ActiveXObject("Microsoft.XMLHTTP"); }
];
//当工厂函数调用之后,在这里存储返回结果
HTTP._factory = null;
//创建并返回 XMLHttpRequest 对象
HTTP.newRequest = function() {
if(HTTP._factory !=null ) return HTTP._factory();
for(var i = 0; i < HTTP._factories.length; i++) {
try
{
var factory = HTTP._factories[i];
var request = factory();
if (request != null)
{
HTTP._factory = factory;
return request;
}
}
catch (e)
{
continue;
}
}
//如果到这里没有工厂函数创建成功,抛出异常
HTTP._factory = function() {
throw new Error("XMLHttpRequest not support");
}
HTTP._factory();//抛出错误
};
//使用XMLHttpRequest来获取指定的URL的内容使用一个HTTP GET请求。当respoonse到来时,通过它(纯文本)来指定的回调函数
HTTP.getText = function(url, callback) {
var request = HTTP.newRequest();
request.onreadystatechange = function() {
if(request.readyState == 4 && request.status == 200)
callback(request.responseText);
}
request.open("GET", url);
request.send(null);
}
//用来接收XML文档,并将其解析后的表示传递给一个回调函数
HTTP.getXML = function(url, callback) {
var request = HTTP.newRequest();
request.onreadystatechange = function() {
if(request.readyState == 4 && request.status == 200)
callback(request.responseXML);
}
request.open("GET", url);
request.send(null);
}
/**
*使用一个HTTP HEAD请求获取指定的URL的headers。当headers到达,用HTTP.parseHeaders()解析它,把结果传给回调函数。
*如果服务器返回一个错误代码,调用指定的errorHandler函数。如果没有指定错误句柄,将null传递给该回调函数。
*
*/
HTTP.getHeaders = function(url, callback, errorHandler) {
var request = HTTP.newRequest();
request.onreadystatechange = function() {
if(request.readyState == 4) {
if(request.status == 200) {
callback(HTTP.parseHeaders(request));
}
else{
if(errorHandler) errorHandler(request.status, request.statusText);
else callback(null);
}
}
}
request.open("HEAD", url);
request.send(null);
};
/**
*从一个XMLHttpRequest对象解析响应头,作为一个新对象的属性名和属性值返回header的名和值
*
*/
HTTP.parseHeaders = function(request) {
var headerText = request.getAllResponseHeaders(); //从服务器返回文本
var headers = {}; //这里是返回值
var ls = /^\s*/; //前面空格正则表达式
var ts = /\s*$/; //后面空格正则表达式
//把headers分割为数组
var lines = headerText.split("\n");
for(var i = 0; i < lines.length; i++){
var line = lines[i];
if(lines.length == 0) continue; //数组为空,跳过
//以冒号分割line,去掉空格
var pos = line.indexOf(":");
var name = line.substring(0, pos).replace(ls, "").replace(ts, "");
var value = line.substring(pos+1).replace(ls, "").replace(ts, "");
//将 name/value 对,存入javascript对象
headers[name] = value;
}
return headers;
};
//向指定的url发送一个HTTP POST请求,用对象的属性名和属性值作为请求体,根据它的内容类型解析服务器的响应,
//通过结果值回调函数,如果一个http错误发生时,调用指定的errorHandler功能,如果没有指定错误处理程序返回null
HTTP.post = function(url, values, callback, errorHandler) {
var request = HTTP.newRequest();
request.onreadystatechange = function() {
if(request.readyState == 4) {
if(request.status == 200) {
callback(HTTP._getResponse(request));
}
else {
if(errorHandler) errorHandler(request.status, request.statusText);
else callback(null);
}
}
}
request.open("POST", url);
//头信息告诉服务器如何解释请求的主体
request.setRequestHeader("Content-type","application/x-www-form-urlencoded");
//编码对象的属性和值,并将它们发送为请求的主体
request.send(HTTP.encodeFormData(values));
};
//编码 属性名称/值对 的一个对象就好像他们是来自html表单,使用 application/x-www-form-urlencoded 格式
HTTP.encodeFormData = function(data) {
var pairs = [];
var regexp = /%20/g; //匹配编码后的空格
for(var name in data) {
var value = data[name].toString();
//首先创建属性名/值对,并编码它们.全球函数encodeURIComponent几乎是我们想要的,但它编码空格为为% 20,而不是"+"。我们必须用String.replace()解决.
var pair = encodeURIComponent(name).replace(regexp,"+") + '=' + encodeURIComponent(value).replace(regexp,"+");
pairs.push(pair);
}
return pairs.join('&');
};
HTTP._getResponse = function(request) {
//检查服务器返回的内容类型
switch(request.getResponseHeader("Content-Type")) {
case "text/xml":
//如果它是一个XML文档,使用解析文档对象
return request.responseXML;
case "text/json":
case "text/javascript":
case "application/javascript":
case "application/x-javascript":
//如果响应是javascript代码,或一个json编码的值,调用eval()在文本“解析”到一个javcascript值
//注意:只有jacascript代码是来自受信任的服务器,才这样做。
return eval(request.responseText);
default:
//否则,把响应作为普通文本并返回字符串
return request.responseText;
}
};
//接收返回的内容
function doFun(content) {
}
//错误句柄函数
function errorFun(stat,statext) {
alert("状态:" + stat + "\n" + "错误:" + statext);
}
使用:
//提交表单,调用POST方法
var uname = document.getElementById("username");
var usex = document.getElementById("sex");
var formdata = {'username':'tom','sex':'男'};
HTTP.post("./test.php",formdata, doFun, errorFun);
//请求获取指定的URL的headers
HTTP.getHeaders("./a.html", doFun, errorFun);