var Bind = function(object, fun) { var args = Array.prototype.slice.call(arguments).slice(2); return function() { return fun.apply(object, args.concat(Array.prototype.slice.call(arguments))); } } var Request = function() { this.requestexe = this.getNewRequest(); this.action = 'get'; this.url = ''; this.ondone = null; this.onerror = null; this.headers = null; this.body = null; this.isstart = false; this.timer = null; this.paras = null; } Request.prototype = { count : 0, getNewRequest : function(){ try { return new ActiveXObject("Msxml2.XMLHTTP"); } catch(e) {} try { return new ActiveXObject("Microsoft.XMLHTTP"); } catch(e) {} try { return new XMLHttpRequest(); } catch(e) {} alert("XMLHttpRequest not supported"); return null; }, send : function(){ if(this.isstart) return; if(this.getCount() > 1){ setTimeout(Bind(this, this.send),500); return; } this.waitOne(); this.isstart = true; this.url = this.url + "&" + new Date().getTime().toString(); this.requestexe.open(this.action,this.url,true); if(this.headers){ for (var header in this.headers) { var val = headers[header]; if (typeof(val) !== "function") this.requestexe.setRequestHeader(header, val); } } if (this.action.toLowerCase() === "post") { if ((this.headers === null) || !headers['Content-Type']) { this.requestexe.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); } if (!this.body) { this.body = ""; } } var request = this; var httpexe = this.requestexe; this.requestexe.onreadystatechange = function(){ if(httpexe.readyState == 4){ clearTimeout(request.timer); Bind(request,request.releaseOne()); if(httpexe.status == 200){ if(typeof(request.ondone) === "function"){ request.ondone(httpexe,request.paras); } } else{ if(typeof(request.onerror) === "function"){ request.onerror(httpexe,request.paras); } } } } this.timer = setTimeout( function(){ request.requestexe.abort(); clearTimeout(request.timer); request.releaseOne(); },20000); this.requestexe.send(this.body); }, releaseOne: function(){ if(Request.prototype.count >= 0) Request.prototype.count--; }, waitOne:function(){ Request.prototype.count++; }, getCount:function(){ return Request.prototype.count; } } 在使用時如下: var request = new Request(); request.action = 'get'; request.url = 'requesturl'; request.ondone = function(result,paras){ var p = result.responseText; }; request.onerror = function(result,paras){ alert(result.status); }; request.paras = ''; request.send(); |
|