一个ajax通用函数(xmlhttprequest封装)

来源:互联网 发布:网络学英语 编辑:程序博客网 时间:2024/06/06 06:32
var ajax = function(options){
    options 
= {
        type        : options.type          
|| 'POST',
        url         : options.url           
|| '',
        timeout     : options.timeout       
|| 5000,
        onComplete  : options.onComplete    
|| function(){},
        onError     : options.onError       
|| function(){},
        onSuccess   : options.onSuccess     
|| function(){},
        data        : options.data          
|| ''
    }

    
if(typeof XMLHttpRequest === 'undefined'){
        XMLHttpRequest 
= function(){
            
return new ActiveXObject(
                navigator.userAgent.indexOf(
'MSIE 5'>= 0 ?
                    
'Microsoft.XMLHTTP' : 'Msxml2.XMLHTTP'
            );
        }
    }
    
    
var xml = new XMLHttpRequest();
    
    xml.open(options.type,options.url,
true);
    
var timeoutLength = options.timeout;
    
var requestDone = false;

    setTimeout(
function(){
        requestDone 
= true;
    },timeoutLength);

    xml.onreadystatechange 
= function(){
        
if(xml.readyState == 4 && !requestDone){
            
if(httpSuccess(xml)){
                options.onSuccess(httpData(xml,options.type));
            }
else{
                options.onError();
            }
            options.onComplete();
            xml 
= null;
        }
    };

    xml.send();

    
var httpSuccess = function(r){
        
try{
            
return !r.status && location.protocol == "file:"
                
|| (r.status >= 200 && r.status < 300)
                
|| r.status == 304
                
|| navigator.userAgent.indexOf('Safari'>= 0 && typeof r.status == 'undefined';
        }
catch(e){}
        
return false;
    }

    
var httpData = function(r,type){
        
var ct = r.getResponseHeader("content-type");
        
var data = !type && ct.indexOf('xml'>= 0 ;
        data 
= type == 'xml' || data ? r.responseXML : r.responseText;

        
if(type == 'script'){
            eval.call(window,data);
            
return data;
        }
    }
}

var serialize = function(a){
    
var s = [];
    
if(a.constructor == Array){
        
for(var i = 0 ; i < a.length ; i++){
            s.push(a[i].name 
+ '=' + encodeURIComponent(a[i].value));
        }
    }
else{
        
for(var j in a){
            s.push(j 
+ '=' + encodeURIComponent(a[j]));
        }
    }
    
return s.join('&');
}
0 0