📄 23-2 xmlhttp.js
字号:
//=================================
// xmlhttp object start
//---------------------------------
function xmlhttp(){
// declare all the private variable
var aryArgu, aryOnPropertyChange_AttachedEvents, aryRequestHeaders, blnAsyn, objRequest, objSelf, objThat, strMethod, strProtocol, strToBeSend, strUID, strUrl;
// declare all the private functions
var defaultEvent_onreadystatechange, getXMLRequester, init, realEvent_onreadystatechange, uid;
// declare public variable
this.blnSendDefaultHeader=false;
this.readyState=0;
this.responseText="";
this.responseXML="";
this.status=-1;
// public event
this.onreadystatechange=defaultEvent_onreadystatechange;
// public method
this.attachEvent=function(eventHandle,functionHandle){
var eventHandle=String(eventHandle).toLowerCase();
switch(eventHandle){
case "onreadystatechange":
if(this.onreadystatechange!=defaultEvent_onreadystatechange){
this.onreadystatechange=defaultEvent_onreadystatechange;
aryOnPropertyChange_AttachedEvents=new Array();
}
aryOnPropertyChange_AttachedEvents.push(functionHandle);
return(true);
break;
default:
return("Not reallized yet.");
break;
}
}
this.deleteRequestHeader=function(strName){
delete aryRequestHeaders[strName];
}
this.detachEvent=function(eventHandle,functionHandle){
var eventHandle=String(eventHandle).toLowerCase();
switch(eventHandle){
case "onreadystatechange":
if(this.onreadystatechange!=defaultEvent_onreadystatechange){
this.onreadystatechange=defaultEvent_onreadystatechange;
aryOnPropertyChange_AttachedEvents=new Array();
return(true);
}
for(var i=0;i<aryOnPropertyChange_AttachedEvents.length;i++){
if(aryOnPropertyChange_AttachedEvents[i]==functionHandle){
aryOnPropertyChange_AttachedEvents.splice(i,1);
break;
}
}
return(true);
break;
default:
return("Not reallized yet.");
break;
}
}
this.flush=function(){
try{ this.readyState=objRequest.readyState; }catch(e){}
try{ this.responseText=objRequest.responseText; }catch(e){}
try{ this.responseXML=objRequest.responseXML; }catch(e){}
try{ this.status=objRequest.status; }catch(e){}
}
this.getAllResponseHeaders=function(){
return(objRequest.getAllResponseHeaders());
}
this.getAttribute=function(strName,strRef){
switch(strName){
case "allHeaders":
return(objRequest.getAllResponseHeaders());
case "asyn":
return(blnAsyn);
case "header":
return(objRequest.getResponseHeader(strRef));
case "method":
return(strMethod);
case "protocol":
return(strProtocol);
case "readyState":
return(objRequest.readyState);
case "responseBody":
return(objRequest.responseBody);
case "responseText":
return(objRequest.responseText);
case "responseXML":
return(objRequest.responseXML);
case "send": case "sendString": case "strSend":
return(strToBeSend);
case "status":
return(objRequest.status);
case "uid":
return(strUID);
case "url":
return(strUrl);
default:
return(false);
}
}
this.getResponseHeader=function(strHeaderName){
return(objRequest.getResponseHeader(strHeaderName));
}
this.init=init;
this.open=function(method,url,asyn){
var theURL;
strMethod=String(method).toUpperCase()=="POST"?"POST":"GET";
strUrl=String(url);
blnAsyn=String(asyn).toLowerCase()=="false"?false:true;
strProtocol=strUrl.match(/http:\/\//i)?"http":"other";
theURL=strUrl;
//if(strProtocol=="http")theURL=strUrl+(strUrl.indexOf(".")==-1?"\/":"")+(strUrl.indexOf("?")==-1?"?":"&")+uid()+"=true";
objRequest.open(strMethod,theURL,blnAsyn);
}
this.reset=init;
this.send=function(strSend){
strToBeSend=String(strSend);
for(var i in aryRequestHeaders){
objRequest.setRequestHeader(i,aryRequestHeaders[i]);
}
if(this.blnSendDefaultHeader){
objRequest.setRequestHeader("Content-Length",strToBeSend.length);
}
objRequest.onreadystatechange=realEvent_onreadystatechange;
objRequest.send(strToBeSend);
}
this.setRequestHeader=function(strName,strValue){
aryRequestHeaders[strName]=strValue;
}
// private functions
function defaultEvent_onreadystatechange(){}
function getXMLRequester(){
var xmlhttp_request = false;
try{
if( window.ActiveXObject ){
for( var i = 5; i > -1; i-- ){
try{
if( i == 2 ){
xmlhttp_request = new ActiveXObject( "Microsoft.XMLHTTP" );
}else{
xmlhttp_request = new ActiveXObject( "Msxml2.XMLHTTP." + i + ".0" );
}
break;
}catch(e){
xmlhttp_request = false;
}
}
}else if( window.XMLHttpRequest ){
xmlhttp_request = new XMLHttpRequest();
}
}catch(e){
xmlhttp_request = false;
}
return xmlhttp_request;
}
function init(){
// init private variable
aryArgu=new Array();
aryOnPropertyChange_AttachedEvents=new Array();
aryRequestHeaders=new Array();
blnAsyn=true;
objRequest=getXMLRequester();
objSelf=this;
objThat=this;
strMethod="GET";
strProtocol="unknown";
strResponseText="";
strToBeSend="";
strUID=strUID?strUID:uid();
strUrl="";
// init public variable
this.blnSendDefaultHeader=false;
// regist this object to window
window[strUID]=this;
}
function realEvent_onreadystatechange(){
objThat.flush();
if(objThat.onreadystatechange==defaultEvent_onreadystatechange){
for(var i=0;i<aryOnPropertyChange_AttachedEvents.length;i++){
try{
if(typeof(aryOnPropertyChange_AttachedEvents[i])=="function"){
aryOnPropertyChange_AttachedEvents[i].call(objThat);
}else if(typeof(aryOnPropertyChange_AttachedEvents[i])=="string"){
eval(aryOnPropertyChange_AttachedEvents[i]);
}
}catch(e){xmlhttp_handle_err("004"+e.description)}
}
}else{
try{
if(typeof(objThat.onreadystatechange)=="function"){
objThat.onreadystatechange();
}else if(typeof(objThat.onreadystatechange)=="string"){
eval(objThat.onreadystatechange);
}
}catch(e){xmlhttp_handle_err("005"+e.description)}
}
}
function uid(){
return("u"+(new Date()).getTime().toString(35)+parseInt(Math.random()*999999).toString(35));
}
// do init
this.init();
}
//--------------------------------
// xmlhttp object end
//================================
//################################ Section Break ######################
//============================================
// multi-threads xmlhttp object start
//--------------------------------------------
function multiThreads_xmlhttp(intThreadsCount){
// define the const
var MAX_THREADS=20;
// declare all the private variable
var aryThreads, intCurrentTaskID, intThreadsCount, intCheckingTimeoutHandle, objThat, strReadyState, strStatus;
// public variable
this.tasks=new Array();
this.tasks._push=this.tasks.push;
this.tasks.push=function(strMethod,strUrl,blnAsyn,aryHeaders,strSend,intMaxErr,onloadsuccess,onloadfail,blnWait){
var newTask=new task(strMethod,strUrl,blnAsyn,aryHeaders,strSend,intMaxErr,onloadsuccess,onloadfail,blnWait);
this._push(newTask);
return(newTask);
}
// public functions
this.debug=function(){
xmlhttp_handle_err(intCurrentTaskID);
}
this.getThreadsCount=function(){
var j=0;
for(var i=0;i<intThreadsCount;i++)if(!aryThreads[i].occupied)j++;
return(j);
}
this.init=init;
this.start=function(){
var obj, curTask;
if(intCurrentTaskID+1>=this.tasks.length){return;}
obj=getAvailibleThread();
if(!obj)return;
intCurrentTaskID++;
curTask=this.tasks[intCurrentTaskID];
startTask(curTask, obj);
}
// private functions
function checkTask(){
}
function event_onreadystatechange(){
if(this.readyState==4){
var curTask=this.boundTask;
if(this.status==200||this.status==0){
try{
if(typeof(curTask.onloadsuccess)=="function"){
curTask.onloadsuccess.call(this);
}else if(typeof(curTask.onloadsuccess)=="string"){
eval(curTask.onloadsuccess);
}
}catch(e){xmlhttp_handle_err("006"+e.description);}
this.threads.start();
}else{
curTask.errTimes++;
if(curTask.errTimes<curTask.intMaxErr){
startTask(curTask,this);
}else{
try{
if(typeof(curTask.onloadfail)=="function"){
curTask.onloadfail.call(this);
}else if(typeof(curTask.onloadfail)=="string"){
eval(curTask.onloadfail);
}
}catch(e){xmlhttp_handle_err("007"+e.description)}
this.threads.start();
}
}
this.occupied=false;
}
}
function getAvailibleThread(){
for(var i=0;i<intThreadsCount;i++)if(!aryThreads[i].occupied)return(aryThreads[i]);
return(false);
}
function init(){
aryThreads=new Array();
intCurrentTaskID=-1;
intThreadsCount=parseInt(intThreadsCount);
if(isNaN(intThreadsCount))intThreadsCount=5;
intThreadsCount=intThreadsCount<1?1:(intThreadsCount>MAX_THREADS?MAX_THREADS:intThreadsCount);
for(var i=0;i<intThreadsCount;i++)aryThreads[i]=new xmlhttp();
// public variable
this.tasks=new Array();
this.tasks._push=this.tasks.push;
this.tasks.push=function(strMethod,strUrl,blnAsyn,aryHeaders,strSend,intMaxErr,onloadsuccess,onloadfail,blnWait){
var newTask=new task(strMethod,strUrl,blnAsyn,aryHeaders,strSend,intMaxErr,onloadsuccess,onloadfail,blnWait);
this._push(newTask);
return(newTask);
}
objThat=this;
}
function startTask(curTask, obj, forceStart){
if(!obj||!curTask)return;
if(obj.occupied&&(!forceStart))return;
obj.boundTask=curTask;
obj.threads=objThat;
obj.occupied=true;
try{
obj.open(curTask.strMethod,curTask.strUrl,curTask.blnAsyn);
}catch(e){
obj.occupied=false;
try{
if(typeof(curTask.onloadfail)=="function"){
curTask.onloadfail.call(obj,e);
}else if(typeof(curTask.onloadfail)=="string"){
eval(curTask.onloadfail);
}
}catch(e){xmlhttp_handle_err("001"+e.description)}
objThat.start();
}
for(var i in curTask.aryHeaders)obj.setRequestHeader(i,curTask.aryHeaders[i]);
obj.onreadystatechange=event_onreadystatechange;
try{
obj.send(curTask.strSend);
}catch(e){
obj.occupied=false;
try{
if(typeof(curTask.onloadfail)=="function"){
curTask.onloadfail.call(obj,e);
}else if(typeof(curTask.onloadfail)=="string"){
eval(curTask.onloadfail);
}
}catch(e){xmlhttp_handle_err("002"+e.description)}
objThat.start();
}
}
function task(strMethod,strUrl,blnAsyn,aryHeaders,strSend,intMaxErr,onloadsuccess,onloadfail,blnWait){
this.strMethod=String(strMethod);
this.strUrl=String(strUrl);
this.blnAsyn=String(blnAsyn).toLowerCase()=="false"?false:true;
this.aryHeaders=typeof(aryHeaders)=="object"?aryHeaders:(new Array());
this.strSend=String(strSend);
this.errTimes=0;
this.intMaxErr=parseInt(intMaxErr);
this.intMaxErr=isNaN(this.intMaxErr)?1:(this.intMaxErr<1?1:(this.intMaxErr>7?7:this.intMaxErr));
this.onloadsuccess=typeof(onloadsuccess)=="function"?onloadsuccess:function(){};
this.onloadfail=typeof(onloadfail)=="function"?onloadfail:function(){};
this.blnWait=String(blnWait).toLowerCase()=="true"?true:false;
}
// do init
this.init();
}
function xmlhttp_handle_err(strErr){
//alert(strErr);
// do nothing here
}
//--------------------------------------------
// multi-threads xmlhttp object end
//============================================
////////////////////////////////////////////////////////////////
/////////////////// File End //////////////////////////
////////////////////////////////////////////////////////////////
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -