- 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);
|