最简单的ajax

来源:互联网 发布:java 方法签名 throw 编辑:程序博客网 时间:2024/05/01 19:26
/**
对象只有get,post,特别直观
参数url input output option分别表示url,数据,显示内容的html控件ID,选项里设置超时处理等等
没详细测试,实际使用在tjzl.com用于discuz评分,但在那基础上修改后没测试
如果有建议请发到suxiang@126.com
*/

var suajax={};

//返回XMLHTTP的函数类型数据
suajax._factory = null; 

suajax._factories = [
    function() { return new XMLHttpRequest(); },
    function() { return new ActiveXObject("Msxml2.XMLHTTP"); },
    function() { return new ActiveXObject("Microsoft.XMLHTTP"); }
];

suajax.newRequest = function() {
    if (this._factory != null) return this._factory();

    for(var i = 0; i < this._factories.length; i++) {
        try {
            var factory = this._factories[i];
            var request = factory();
            if (request != null) {
                this._factory = factory;
                return request;
            }
        }
        catch(e) {
            continue;
        }
    }
    this._factory = function() {
        throw new Error("你的浏览器不支持XMLHTTP,请下载");
    }
    this._factory(); 
}


suajax._getFormData=function (form){
        if(1==document.forms.length){
                form=document.forms[0];
        }else{
                if(typeof form !='object'){
                        form=document.getElementById(form);
                }
        }

        if(!form || 'FORM'!=form.tagName){
                return (alert('debug form 对象不对'))
        }

        var es=form.elements;
        var num=es.length;
        var s='';
        for(st='',i=0;i<num;i++,st='&'){
                e=es[i];
                if(!e.name){
                        continue;
                }
                
                if('select-multiple'==e.type){
                        var mult=(e.name.indexOf(']')>0)?'':'[]';
        
                        for (var n=0; n<e.length; n++) {
                                var op=e.options[n];
                                if (op.selected) {
                                        s+=st+e.name+mult+'='+encodeURIComponent(op.value);
                                }
                        }
                        continue;
                }
                
                if('checkbox'==e.type || 'redio'==e.type){
                        if(!e.checked){
                                continue;
                        }
                }
                s+=st+e.name+'='+encodeURIComponent(e.value);
        }
        return s;
}

suajax._message=new Array('开始处理...','处理中...','处理出错');

suajax._show=function (output,text){
        var htmlNode;
        try{
                htmlNode=document.getElementById(output);
        }catch(e){}

        if( ! htmlNode || ! text )return;
        
        var tag=htmlNode.tagName;//tagname?type

        switch(tag){
                case 'INPUT'://input中有checkbox和redio情况,不能使用.value不过也用不到
                case 'TEXTAREA':
                case 'SELECT':
                        htmlNode.value =text;
                break;// 这样写不对,对调试有好处好找到问题所在
                case 'DIV':
                case 'P':
                case 'SPAN':
                case 'TD':
                        htmlNode.innerHTML= text;
                        break;
                default:
                        alert('debug 错误,检查tagName:'.tag);
          break;
        }
}

suajax._callback=function (request,output,timer){
        if(4==request.readyState  ){
                if (timer) clearTimeout(timer);//取消时钟
                if(200==request.status){
                        if(Function===output.constructor){
                                output(request.responseText);
                                return ;
                        }
                        if(String===output.constructor){
                                this._show(output , request.responseText);
                                return ;
                        }
                }else{
                        //这里执行 处理错误
                        this._show(output ,this._message[2]+request.status+request.statusText);
                }
        }else{
                this._show(output ,this._message[1]);
        }
}

suajax.post=function(url,input,output,options){
        var request = this.newRequest();
        var sendData=( typeof input=='string' && input.indexOf("=")>0) ? input : this._getFormData(input);
        var timer;

        if (options.timeout){
                timer = setTimeout(
                        function() {
                                request.abort();
                                if (options.timeoutHandler)
                options.timeoutHandler(url);
            } , options.timeout);
        }

        request.onreadystatechange=function (){
                suajax._callback(request,output,timer);
        };

        request.open("POST",url,true);
        request.setRequestHeader("Content-Type","application/x-www-form-urlencoded;"); 
        request.send(sendData);
        
}

suajax.get=function(url,output,options){
        var request = this.newRequest();
        var timer;
        url+=(url.indexOf('?')>-1) ? ('&t='+new Date().getTime()): ( '?t='+new Date().getTime() );
        
        if (options.timeout){
        timer = setTimeout(
                        function() {
                                request.abort();
                                if (options.timeoutHandler)
                options.timeoutHandler(url);
            } , options.timeout);
        }
        
        request.onreadystatechange =function (){
                suajax._callback(request,output,timer);
        };
        request.open("GET",url ); 
        request.send(null);
        
}

原创粉丝点击