建一个XMLHttpRequest对象池(转)

资料来源:http://edu.chinaz.com/Get/Program/Xml/0512281013448163744.asp
原文作者:不详
转载说明:这是从网络上找到的代码,没有经过测试。这部分的代码除了本身的作用之外,还可以用来参考学习在JS中如何使用类、oop。尤其是对我以前开发的仿网易消息类有很好的借鉴作用。所以在我的博客里面转载一下。

在ajax应用中,通常一个页面要同时发送多个请求,如果只有一个XMLHttpRequest对象,前面的请求还未完成,后面的就会把前面的覆盖掉,如果每次都创建一个新的XMLHttpRequest对象,也会造成浪费。解决的办法就是创建一个XMLHttpRequset的对象池,如果池里有空闲的对象,则使用此对象,否则将创建一个新的对象。
下面是我最近写的一个简单的类:

/ **  
 
*  XMLHttpRequest Object Pool 
 
*  
 
*  @author    legend  < legendsky@hotmail.com >  
 
*  @link      http: // www.ugia.cn/?p=85 
  *  @Copyright www.ugia.cn 
 
*/   
     
var  XMLHttp  =  
    _objPool: [], 
     
    _getInstance: 
function () 
    

        
for (var i = 0; i < this._objPool.length; i ++
        

            
if (this._objPool[i].readyState == 0 || this._objPool[i].readyState == 4
            

                
return this._objPool[i]; 
            }
 
        }
 
     
        
// IE5中不支持push方法 
        this._objPool[this._objPool.length] = this._createObj(); 
     
        
return this._objPool[this._objPool.length - 1]; 
    }

     
    _createObj: 
function () 
    

        
if (window.XMLHttpRequest) 
        

            
var objXMLHttp = new XMLHttpRequest(); 
     
        }
 
        
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 
                

                    
var objXMLHttp = new ActiveXObject(MSXML[n]); 
                    
break
                }
 
                
catch(e) 
                

                }
 
            }
 
         }
           
     
        
// mozilla某些版本没有readyState属性 
        if (objXMLHttp.readyState == null
        

            objXMLHttp.readyState 
= 0
     
            objXMLHttp.addEventListener(
"load"function () 
                

                    objXMLHttp.readyState 
= 4
     
                    
if (typeof objXMLHttp.onreadystatechange == "function"
                    

                        objXMLHttp.onreadystatechange(); 
                    }
 
                }
,  false); 
        }
 
     
        
return objXMLHttp; 
    }

     
    
// 发送请求(方法[post,get], 地址, 数据, 回调函数) 
    sendReq: function (method, url, data, callback) 
    

        
var objXMLHttp = this._getInstance(); 
     
        
with(objXMLHttp) 
        

            
try 
            

                
// 加随机数防止缓存 
                if (url.indexOf("?"> 0
                

                    url 
+= "&randnum=" + Math.random(); 
                }
 
                
else 
                

                    url 
+= "?randnum=" + Math.random(); 
                }
 
     
                open(method, url, 
true); 
     
                
// 设定请求编码方式 
                setRequestHeader(’Content-Type’, ’application/x-www-form-urlencoded; charset=UTF-8’); 
                send(data); 
                onreadystatechange 
= function () 
                

                    
if (objXMLHttp.readyState == 4 && (objXMLHttp.status == 200 || objXMLHttp.status == 304)) 
                    

                        callback(objXMLHttp); 
                    }
 
                }
 
            }
 
            
catch(e) 
            

                alert(e); 
            }
 
        }
 
    }
 
}
;  

示例: 
< script type = " text/javascript "  src = " xmlhttp.js " ></ script >  
< script type = " text/javascript " >  
function  test(obj) 

    alert(obj.statusText); 
}
 
     
XMLHttp.sendReq(’GET’, ’http:
// www.ugia.cn/wp-data/test.htm’, ’’, test); 
XMLHttp.sendReq(’GET’, ’http: // www.ugia.cn/wp-data/test.htm’, ’’, test); 
XMLHttp.sendReq(’GET’, ’http: // www.ugia.cn/wp-data/test.htm’, ’’, test); 
XMLHttp.sendReq(’GET’, ’http: // www.ugia.cn/wp-data/test.htm’, ’’, test); 
     
alert(’Pool length:’ 
+  XMLHttp._objPool.length); 
</ script >   
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值