Chinaunix首页 | 论坛 | 博客
  • 博客访问: 673656
  • 博文数量: 132
  • 博客积分: 10060
  • 博客等级: 上将
  • 技术积分: 1732
  • 用 户 组: 普通用户
  • 注册时间: 2007-12-21 12:35
个人简介

迷惘的码农。

文章分类

全部博文(132)

文章存档

2013年(1)

2011年(2)

2010年(9)

2009年(41)

2008年(79)

我的朋友

分类: 系统运维

2008-07-04 11:57:40

这个写得更早了,那个时候还没做php,基本框架是别人的,我参考了一些其他的资料,在此基础上进行修改,感觉灵活性还不错,使用也简单,一直在用,没怎么修改过。



/**
 * XMLHttpRequest Object Pool
 *
 * @author legend
 * @link
 * @Copyright
 */


/*几个建议:
1、“对象池”的管理功能需要加强,比如池的容量。
2、“对象池”的内存回收需要加强,比如使用完毕的对象释放内存。
3、请求最好序列一下,以控制由于服务器延时或网络延时导致的先请求的后得到结果。
4、超时处理。
*/

var XMLHttp = {
     request: function(url, method, proc, error, data) {
         this.requestEx(url,method,proc,error,data,true,null,null);
     },

    // 发送请求(地址,方法[post,get,head],回调函数,错误处理函数,数据,异步,编码,字符集)

    requestEx: function (url, method, proc, error, data, asyn, encode, charset) {
        var xhr = this._getInstance();
        if(xhr == null) {
            alert("请求初始化失败!请稍后再试。");
            return;
        }
        if(!method) method = "GET";
        if(!asyn) method = true;
        if(!proc) proc = this.defaultProc;
        if(!error) error = this.defaultError;
        // 加随机数防止缓存

        url += (((url.indexOf("?")>0)?"&":"?")+"randnum=" + Math.random());
        // url += (((url.indexOf("?")>0)?"&":"?")+"timestamp=" + new Date().getTime());

        /*
        if (url.indexOf("?") > 0) // url += "&randnum=" + Math.random();
        url += "&timeStamp=" + new Date().getTime();
        else // url += "?randnum=" + Math.random();
        url += "?timeStamp=" + new Date().getTime();
        */

        try {
            xhr.open(method, url, asyn);
            // 设定请求编码方式

            if(encode) {
                var ct = (charset? encode+"; charset="+charset:encode);
                xhr.setRequestHeader('Content-Type', ct);
            }

            xhr.onreadystatechange = function () {
                if (xhr.readyState == 4 )
                    if(xhr.status == 200 || xhr.status == 304 || xhr.status == 0)
                    // 0:用于本地文件

                        proc(xhr);
                    else
                        error(null,xhr);
            };
            xhr.send(data);
        } catch(e) { error(e, xhr); }
    },
    // 用在弹出窗口被关闭窗口时

    cancelAll : function() {
        var _createObj = this._createObj;
        this._createObj = function() {
            return null;
        }
        for (var i=0; i < this._objPool.length; ++i) {
            this._objPool[i].abort();
        }
        this._createObj = _createObj;
    },

    ENC_FORM: "application/x-www-form-urlencoded",
    // 'application/x-www-form-urlencoded; charset=UTF-8'


    defaultProc: function(xhr) {
        alert(xhr.responseText);
    },

    defaultError: function(e, xhr) {
        var desp = ""
        if(e)
            desp += ("错误名称:" + e.name + "\r\n" +
                "错误编号:" + e.number + "\r\n" +
                "错误信息:" + e.message + "\r\n" +
                "错误描述:" + e.description);
        if(xhr && xhr.readyState)
            desp += ("\r\n" + "请求状态码:" + xhr.status +
                    "\r\n" + "请求状态描述:" + xhr.statusText);
        alert(desp);
    },

    _objPool: [],

    _getInstance: function () {
        var op = this._objPool;
        for (var i = 0; i < op.length; i ++) {
            if (op[i].readyState == 0 || op[i].readyState == 4)
                return op[i];
        }
        // IE5中不支持push方法

        op[op.length] = this._createObj();
        return op[op.length - 1];
    },

    _createObj: function () {
        var xhr = null;
        if (window.XMLHttpRequest) {
            xhr = new XMLHttpRequest();
            if(xhr.overrideMimeType)
                xhr.overrideMimeType("text/xml");
        } else {
            var MSXML = ['MSXML2.XMLHTTP.5.0', 'MSXML2.XMLHTTP.4.0',
                        'MSXML2.XMLHTTP.3.0', 'MSXML2.XMLHTTP', 'Microsoft.XMLHTTP'];
            for(var n = 0; n < MSXML.length; n ++) {
                try {
                    xhr = new ActiveXObject(MSXML[n]);
                    break;
                } catch(e) { }
            }
         }
        // mozilla某些版本没有readyState属性

        if (xhr && xhr.readyState == null) {
            xhr.readyState = 0;
            xhr.addEventListener("load", function () {
                    xhr.readyState = 4;
                    if (typeof xhr.onreadystatechange == "function")
                        xhr.onreadystatechange();
                }, false);
        }
        return xhr;
    }
};

阅读(1534) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~