原生JavaScript封装ajax

从服务器取数据需要几步?
  1. 创建一个ajax对象;
  2. 连接到服务器;
  3. 告诉服务器要哪个东西,(发送请求);
  4. 接收返回值;
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>GuoYu-ajax</title>
</head>
<body>
    <input type="button" value="读取" id="btn1">

    <script type="text/javascript">
        var oBtn = document.getElementById('btn1');
        oBtn.onclick = function() {
            //1,创建一个ajax,IE6
            //var oAjax = new ActiveXObject('Microsoft.XMLHTTP');
            //1,创建一个ajax,非IE6
            //var oAjax = new XMLHttpRequest();
            /*
                同步:一件一件来
                异步:多个事情一起做,ajax天生就为异步而生,除非你网速快的很,同步也可以
            */
            /*
                js中:
                1,用没有定义的变量  -- 报错;
                2,用没有定义的属性  --  undefined;
                所以,有时候为了避免报错,使用window.做前缀。
            */

            if (window.XMLHttpRequest) {
                var oAjax = new XMLHttpRequest();
            } else {
                var oAjax = new ActiveXObject('Microsoft.XMLHTTP');
            }


            //2,连接服务器,open(方法, 文件名, 同步/异步);
            oAjax.open('GET', './zepto.js');




            //3,发送请求
            oAjax.send();





            /*4,接收返回的东西,ajax发送请求后,干其他的事去了,
                等到返回了以后再处理,返回后以事件的形式来处理数据,
                onreadystatechange就是跟服务器交互的时候发生的事件
            */
            /*
                reayState:
                0:未初始化,还没调用open()方法;
                1:载入,已经调用open()方法,正在发送请求;
                2:载入完成,send()方法完成,浏览器已经收到全部响应内容(数据可能是加密的,压缩的,ajax还没法用);
                3:解析,正在解析响应内容(解析的是服务端返回的数据);
                4:完成,响应内容解析完成,可以在客户端调用了。完成不代表成功,比如读取出错了,文件不存在等等
                怎么进一步判断是成了还是败了呢,status:状态码!
            */
            oAjax.onreadystatechange = function() {
                //我怎么知道跟服务器交互的过程完没完呢?readyState:浏览器和服务器交互到哪一步了
                if (oAjax.readyState == 4) {
                    if (oAjax.status == 200) {
                        alert('success');
                        alert(oAjax.responText);//弹出zepto.js文件内容
                    } else {
                        alert('failed');
                        alert(oAjax.status);
                    }
                }
            };


        };
    </script>
</body>
</html>

zepto.js是真实存在于本目录中的,会alert出success,如果换成个不存在的文件,比如zepto1.js,则会弹出failed和404


ajax.js

以上的代码要封装成一个ajax函数以供调用,每次要读的文件肯定不同,不可能都是zepto.js,所以这是一个参数,每个人读到文件要做的事情不一样,所以,需要一个success的回调,把oAjax.responseText返回数据传进去,失败了,error,需要因为什么原因失败了,所以,oAjax.status当参数传递一下

function params(data) {
    var arr = [];
    for(var i in data) {
        arr.push(encodeURIComponent(i) + '=' + encodeURIComponent(data[i]));
    }
    return arr.join('&');
}

function ajax(obj) {
    var xhr = new XMLHttpRequest();
    // obj.url = obj.url + '?rand='+Math.random();
    obj.data = params(obj.data);
    if (obj.type === 'get') {
        obj.url += obj.url.indexOf('?')==-1 ? '?'+obj.data : '&'+obj.data;
    }
    alert(obj.url);
    if(obj.async === true) {
        xhr.onreadystatechange = function() {
            if(xhr.readyState == 4) {
                if(xhr.status == 200) {
                    obj.success(xhr.responseText);
                } else {
                    console.error('errNumber: '+xhr.status+', errMessage: ' + xhr.statusText);
                }
            }
        };
   }
    xhr.open(obj.type, obj.url, obj.async);
    if (obj.type === 'post') {
        xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
        xhr.send(obj.data);
    } else {
        xhr.send(null);
    }
    if(obj.async === false) {
        if(xhr.status == 200) {
            obj.success(xhr.responseText);
        } else {
            console.error('errNumber: '+xhr.status+', errMessage: ' + xhr.statusText);
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值