使用原生js封装Ajax异步请求

第一种方式;

function createXMLHttpRequest() {
    var request = false;
    if (window.XMLHttpRequest) {
        request = new XMLHttpRequest();
        if (request.overrideMimeType) {
            request.overrideMimeType("text/xml");
        }

    } else if (window.ActiveXObject) {
        var versions = ['Microsoft.XMLHTTP', 'MSXML.XMLHTTP', 'Msxml2.XMLHTTP.7.0',
            'Msxml2.XMLHTTP.6.0',
            'Msxml2.XMLHTTP.5.0', 'Msxml2.XMLHTTP.4.0', 'MSXML2.XMLHTTP.3.0', 'MSXML2.XMLHTTP'
        ];

        for (var i = 0; i < versions.length; i++) {
            try {
                request = new ActiveXObject(versions[i]);
                if (request) {
                    return request;
                }

            } catch (exception) {
                request = false;
                console.error(exception.error);
            }

        }

    }
    return request;
}

/*
returnType:返回值类型
HTML----返回的是文本,默认参数
XML ----返回的是XML对象
JSON ---- 返回的是JSON对象
传入时不区分大小写

isAsync:是否为ajax异步请求,默认为true
true ---->使用ajax异步请求
false ---->使用ajax同步请求
*/
function Ajax(returnType, isAsync) {
    var ajaxObj = new Object();
    ajaxObj.targetUrl = '';
    ajaxObj.sendString = '';

    if (typeof (isAsync) == 'undefined') {
        ajaxObj.async = true;//默认采用ajax异步请求
    } else {
        ajaxObj.async = isAsync;
    }

    ajaxObj.returnType = returnType ? returnType.toUpperCase() : "HTML";//设置返回值类型
    ajaxObj.callbackfunction = null;//回调函数
    ajaxObj.ff;
    ajaxObj.createXMLHttpRequest = function () {
        var request = false;
        if (window.XMLHttpRequest) {
            ajaxObj.ff=true;
            request = new XMLHttpRequest();
            if (request.overrideMimeType) {
                request.overrideMimeType("text/xml");
            }

        } else if (window.ActiveXObject) {
            ajaxObj.ff=false;
            var versions = ['Microsoft.XMLHTTP', 'MSXML.XMLHTTP', 'Msxml2.XMLHTTP.7.0',
                'Msxml2.XMLHTTP.6.0',
                'Msxml2.XMLHTTP.5.0', 'Msxml2.XMLHTTP.4.0', 'MSXML2.XMLHTTP.3.0', 'MSXML2.XMLHTTP'
            ];

            for (var i = 0; i < versions.length; i++) {
                try {
                    request = new ActiveXObject(versions[i]);
                    if (request) {
                        return request;
                    }

                } catch (exception) {
                    request = false;
                    console.error(exception.error);
                }
            }
        }
        return request;
    }

    ajaxObj.XMLHttpRequest=ajaxObj.XMLHttpRequest();
    
    ajaxObj.processHandle=function(){
        if(ajaxObj.XMLHttpRequest.readyState==4){
            ajaxObj.ff=false;
            if(ajaxObj.XMLHttpRequest.status == 200){
                if(ajaxObj.returnType == "HTML"){
                    ajaxObj.callbackfunction(ajaxObj.XMLHttpRequest.responseText);
                }else if(ajaxObj.returnType == "JSON"){
                    ajaxObj.callbackfunction(eval('('+ajaxObj.XMLHttpRequest.responseText+')'));
                }else if(ajaxObj.returnType == "XML"){
                    ajaxObj.callbackfunction(ajaxObj.XMLHttpRequest.responseXML);
                }
            }
        }

    }

  /*
    GET请求方法:
    targetUrl:请求的服务器目标地址,在URL中传递请求参数. 
    http://localhost:8080/server.php?key1=value1&&key2=value2
    callbackfunction:回调函数,可选。 需要一个参数(服务器端返回的数据:XML对象、JSON对象、文本)
    */

    ajaxObj.get=function(targetUrl,callbackfunction){
        ajaxObj.targetUrl=targetUrl;
        if(callbackfunction){
            ajaxObj.XMLHttpRequest.onreadystatechange=ajaxObj.processHandle;
            ajaxObj.callbackfunction=callbackfunction;
        }

        if(window.XMLHttpRequest){
            ajaxObj.XMLHttpRequest.open('GET',ajaxObj.targetUrl,ajaxObj.async);
            ajaxObj.XMLHttpRequest.send(null);
        }else{
            ajaxObj.XMLHttpRequest.open('GET',ajaxObj.targetUrl,ajaxObj.async);
            ajaxObj.XMLHttpRequest.send();
        }

        if(!ajaxObj.async && ajaxObj.ff){
            ajaxObj.processHandle();
        }
    }



    /*
    POST请求方法:
    targetUrl:请求的目标地址
    sendString:字符串数据("key1=value1&&key2=value2","{key1:value1,key2:value2}")
    callbackfunction:回调函数,可选。 需要一个参数(服务器端返回的数据:XML对象、JSON对象、文本)
    
    */
    ajaxObj.post=function(targetUrl,sendString,callbackfunction){
        ajaxObj.targetUrl=targetUrl;

        if(typeof(sendString) == "object"){
            var str="";
            for(var pro in sendString){
                str+=pro+"="+sendString[pro]+"&";
            }
            ajaxObj.sendString=str.substring(0,str.length-1);
        }else{
            ajaxObj.sendString=sendString;
        }

        if(callbackfunction){
            ajaxObj.XMLHttpRequest.onreadystatechange=ajaxObj.processHandle;
            ajaxObj.callbackfunction=callbackfunction;
        }

        request.open("POST",targetUrl, ajaxObj.async);
        request.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
        request.send(sendString);

        if(!ajaxObj.async && ajaxObj.ff)
                ajaxObj.processHandle();
    }
        return ajaxObj;//将封装的对象返回
}

第二种封装方式:

//模拟jquery方式,封装js原生的ajax请求
 var request= (function $(){
    var ajaxObj=window.XMLHttpRequest?new XMLHttpRequest():new ActiveXObject('Microsoft.XMLHTTP');
    if(!ajaxObj){
        throw new Error('您的浏览器不支持异步发起HTTP请求!');
    }

    function _doAjax(option){

        var option=option || {},
            type=(option.type || 'GET').toUpperCase(),
            async=option.async || true,//默认为异步请求
            url=option.url,
            data=option.data || null,
            error=option.error || function(){},
            success=option.success || function(){},
            complete=option.complete || function(){} ;
            if(!url){
                throw new Error('您没有填写URL');
            }

            ajaxObj.open(type,url,async);
            type === "POST" && ajaxObj.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
            ajaxObj.send(type==="GET"?null:formatDatas(data));


            ajaxObj.onreadystatechange=function(){
                if(ajaxObj.readyState === 4 && ajaxObj.status === 200){
                    success(JSON.parse(ajaxObj.responseText));//调用成功回调函数
                }
            }
        }

        function formatDatas(obj){//将json对象转换为字符串数据("key1=value1&key2=value2.....")
            if(typeof(obj) == "object"){
                var str='';
                for(var key in obj){
                    str+=key+"="+obj[key]+'&';
                }
                return str.replace(/&$/,'');//正则替换最后一个&
            }
        }
    return{
        ajax:function(option){//option:JSON对象   支持post/get请求 
            _doAjax(option);
        },
        post:function(url,data,callbackfunction){//post请求方式
            _doAjax({
                type:"POST",
                url:url,
                data:data,
                success:callbackfunction
            });
        },
        get:function(url,callbackfunction){//get请求方式
            _doAjax({
                type:"GET",
                url:url,
                success:callbackfunction
            });
        }
    }
})();//立即执行函数

测试案例:
Ajax请求:
在这里插入图片描述
Post请求方式:
在这里插入图片描述
Get请求方式:
在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值