⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 23-2 xmlhttp.js

📁 JAVASCRIPT完全自学手册,中源码的验证修订实例
💻 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 + -