XHR工厂的实现

  ajax这种常见的开发模式已经遍布我们日常的开发之中了,ajax本质还是采用一种轮询的模式,就是隔一段时间去发送一次http请求,获取数据,然后显示在页面之上,当然,ajax比起新兴的WebScoket肯定是差了一截,WebScoket基于握手协议,是一种全双工的通信。

  目前,很多javascript库都实现了对ajax完善的支持,像jQuery, Ext, Mootools, prototype等。平时是不是就简单的调用一下$.ajax()或者$.post()就轻松的实习了一次ajax请求了呢?如果你过于依赖jQuery等类库的话,你可能会忽略ajax的原生实现。下面我来谈谈ajax的原生实现。

  ajax中的核心对象是XMLHttpRequest。像Firefox、 chrome、 opera、 safari等浏览器可以直接通过new XMLHttpRequest()创建,IE6及IE6以下不支持这种方式创建,但是可以通过new ActiveXObject()创建。常见的HTTP状态码中,200表示请求已经发送成功,readyState一共有5种状态,0表示未连接,1表示打开连接,2表示发送请求,3表示交互,4表示完成交互并接手响应。了解了这些预备知识,我们就可以实现一个XHR工厂了。

/**
 * XHR Factory, use simple factory patten
 * It handle ajax create, request, send and etc
 * Written by liufeng cheng 
 * update date: 2014/7/10
 * call example:
   window.onload = function(){
	    var xhrFactory = new XhrFactory();
	    var callback = {
	        success:function(responseText,responseXML){alert("Success:" + responseXML);},
	        failure:function(statusCode){alert("Failure" + statusCode);}
	    };
	    myHandler.request('GET','innerHTML.xml',callback);
	};
 */
var XhrFactory = function(){};

XhrFactory.prototype = {
	//ajax create,request,send and etc
    request:function(method,url,callback,postVars){
        var xhr = this.createXhrObject();
        xhr.onreadystatechange = function(){
            if(xhr.readyState != 4) return;
            (xhr.status == 200) ? 	 
            callback.success(eval("(" + xhr.responseText + ")"), xhr.responseXML):
            callback.failure(xhr.status);
        };
        xhr.open(method,url,true);
        if(method != "POST") postVars = null;
        xhr.send(postVars);
    },
    // return a xhr object in different case
    createXhrObject:function(){
        var methods = [
            function(){return new XMLHttpRequest();},
            function(){return new ActiveXObject('Msxml2.XMLHttp');},
            function(){return new ActiveXObject('Microsoft.XMLHttp');}
        ];
        for(var i = 0; i < 3; i++){
            try{
                methods[i]();
            }catch(e){
                continue;
            }
            this.createXhrObject = methods[i]();
            return methods[i]();
        }
        throw new Error("Error!");
    }
}

  

  

posted @ 2014-05-27 12:03  地狱火之歌  阅读(513)  评论(0编辑  收藏  举报