ajax技术的js代码封装


ajax整个流程大概就是创建XMLHttpRequest()对象,然后指定请求方式和地址,然后监听状态变化,如果请求成功执行请求操作,反之请求超时执行对应的失败操作。对于jsp或者说请求的servlet来说就是验证用户名和密码之后返回成功与否的状态,然后根据状态做出对应的操作。

json对象转字符串

function  obj2gson(obj) {//js的函数只需要return就可以了,并不需要写返回值
    //为了增加ajax代码的通用性,直接在obj刚传进来的时候就创建一个键值对进行赋值
    obj.t=(new Date).getTime();//将时间戳参数传递进入json对象中
    var res=[];//声明一个结果属组用于存放obj的键值对
    for(var key in obj)
    { //对于encodeURIComponent()用于将中文转化为数字、字母、ascii、下划线等
        res.push(encodeURIComponent(key)+'='+encodeURIComponent(obj[key]));//实际上通过[]声明的属组更像C++的vector
    }
    //最后利用javascript自带的函数将json格式转化为gson格式
    return res.join('&');//最后将res结果向量转化为我们想要的格式
}

ajax的功能封装

//封装ajax功能
function ajax(url,success,error,obj,timeout) {//其中obj就是前端传递给后端的参数,timeout参数就是请求多久的时候才终端操作
    //首先需要写一个函数将obj如下格式
    /*如下格式称为json格式
    {
        usrname: xxxxxx,
        password: xxxxxx
    }转化为username=xxx&password=xxxxx的网页地址格式以便数据端进行验证
    * */
    var gson=obj2gson(obj);
    //将url和传递的参数转化为真正的url参数
    url=url+'?'+gson;
    console.log(url);
    //将转化好
    //使用ajax技术的步骤
    /*第一步,创建xmlhttp对象*/
    var xmlhttp;
    //让ajax适用于尽可能多的浏览器
    if (window.XMLHttpRequest)
    {// code for IE7+, Firefox, Chrome, Opera, Safari
        xmlhttp=new XMLHttpRequest();
    }
    else
    {// code for IE6, IE5
        xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
    }
    //第二步,指定请求的地址
    // xmlhttp.open('POST',"ajax.jsp",true); //请求servlet处理
    // xmlhttp.open('POST','a.txt',true);//请求文本内容
    // xmlhttp.open('POST',url+'?t='+Math.random(),true);//防止ie缓存,低版本的ie每次访问的url都必须不一样
    xmlhttp.open('GET',url,true);//每次的时间都不一样
    console.log(new Date().getTime());
    //第三步,发送请求
    xmlhttp.send();
    //第四步,监听状态变化
    xmlhttp.onreadystatechange=function (ev) {
        if(xmlhttp.readyState===4)
        {
            //如果访问没有超时xmlhttp返回的状态码就是4,但是在进行异步请求的时候需要将后面的timer关掉
            clearInterval(timer);//将生成的timer参数去除
            if(xmlhttp.status>=200&&xmlhttp.status<300||xmlhttp.status===304)
            {
                //执行ajax成功之后执行的操作
                success(xmlhttp);
            }
            else
            {
                //执行ajax失败之后执行的操作
                error(xmlhttp);
            }
        }
    }
    //判断外界是否传入了超时时间
    if(timeout){
        const timer = setInterval(function () {
            console.log("中断请求");
            xmlhttp.abort();//中断ajax请求之后直接执行error回调
            clearInterval(timer);//只要执行了一次回调就清除掉定时器
        }, timeout);
        //其实上面的回调函数特别神奇,非常像C#的回调函数
        //由于函数中是一个线程从上到下进行执行,所以当执行完success回调时出错然后超过了3秒就自动关闭ajax请求
    }
}

测试ajax封装代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>ajax_test</title>
    <script src="ajax.js"></script><!--可以通过手动拖动的方式拖动js文件引入文件-->
    <script type="text/javascript">
        window.onload=function (ev) {
            //初始化之后就生成对应的响应函数
            var btn=document.querySelector("button");//按照选择器获取对象

            btn.onclick=function () {
                url='a.txt';//实际上javascript以及matlab和python都是弱类型得语言
                //上面的问题就是正常情况下的url都会携带许许多多的参数比如http:localhost:8080?username=xxx&password=xxxxx
                //针对上面这种方式可以直接传入
                /*下面这种格式
                {
                 username: haha,
                 password: 12345678
                }
                当然上面这种格式可以观看学校教务网登录网页的代码进行操作,原理十分相似
                * */
                var obj={
                    username: 'lin',
                    password: '5201314Lc????'
                }
                //当用户点击button按钮的时候执行的操作
                ajax('a.txt',function (xmlhttp) {
                    //该函数为回调函数,这大概就是js里面回调函数定义的方式
                    //在另外一边先声明有这个函数对象,然后给回调函数赋予参数
                    alert(xmlhttp.responseText);
                },function (xmlhttp) {
                    alert('ajax操作执行失败');
                },obj,3000);//添加时间请求自动失败的参数
            }
        };
    </script>
</head>
<body>
    <button>click me</button>
</body>
</html>

合并POST请求操作

在这里插入图片描述
在这里插入图片描述

jquery版本的最终js封装

//封装ajax功能
//function ajax(url,success,error,obj,timeout,method) {//其中obj就是前端传递给后端的参数,timeout参数就是请求多久的时候才终端操作,method代表请求的方式
function ajax(data){ //传入一个json格式的对象(键值对的方式存在)
    //首先需要写一个函数将obj如下格式
    /*如下格式称为json格式
    {
        usrname: xxxxxx,
        password: xxxxxx
    }转化为username=xxx&password=xxxxx的网页地址格式以便数据端进行验证
    * */
    var gson=obj2gson(data["obj"]);//根据obj键查找值

    //将转化好
    //使用ajax技术的步骤
    /*第一步,创建xmlhttp对象*/
    var xmlhttp;
    //让ajax适用于尽可能多的浏览器
    if (window.XMLHttpRequest)
    {// code for IE7+, Firefox, Chrome, Opera, Safari
        xmlhttp=new XMLHttpRequest();
    }
    else
    {// code for IE6, IE5
        xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
    }
    //将url和传递的参数转化为真正的url参数、
    if(data["method"]==='GET')
    {
        data["url"]=data["url"]+'?'+gson;//只有GET请求才将参数拼接到url后面,POST请求由于不是采用显示的拼接,所以ajax有其独特的处理的方式
        // 第二步,指定请求的地址
        xmlhttp.open(data['method'],data['url'],true);//每次的时间都不一样
        //第三步,发送请求
        xmlhttp.send();
    }else {
        data['url']=data['url'];//url保持不变
        xmlhttp.open(data['method'],url,true)
        xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");//固定的格式
        xmlhttp.send(gson);//这就是唯一的区别,参数需要用send函数传出
    }

    //第四步,监听状态变化
    xmlhttp.onreadystatechange=function (ev) {
        if(xmlhttp.readyState===4)
        {
            if(xmlhttp.status>=200&&xmlhttp.status<300||xmlhttp.status===304)
            {
                //执行ajax成功之后执行的操作
                (data['success'])(xmlhttp);
            }
            else
            {
                //执行ajax失败之后执行的操作
                (data['error'])(xmlhttp);
            }
        }
    }
    //判断外界是否传入了超时时间
    if(data['timeout']){
        const timer = setInterval(function () {
            console.log("中断请求");
            xmlhttp.abort();//中断ajax请求之后直接执行error回调
            clearInterval(timer);//只要执行了一次回调就清除掉定时器
        }, data['timeout']);
        //其实上面的回调函数特别神奇,非常像C#的回调函数
        //由于函数中是一个线程从上到下进行执行,所以当执行完success回调时出错然后超过了3秒就自动关闭ajax请求
    }
}

function  obj2gson(obj) {//js的函数只需要return就可以了,并不需要写返回值
    //为了增加ajax代码的通用性,直接在obj刚传进来的时候就创建一个键值对进行赋值
    obj.t=(new Date).getTime();//将时间戳参数传递进入json对象中
    var res=[];//声明一个结果属组用于存放obj的键值对
    for(var key in obj)
    { //对于encodeURIComponent()用于将中文转化为数字、字母、ascii、下划线等
        res.push(encodeURIComponent(key)+'='+encodeURIComponent(obj[key]));//实际上通过[]声明的属组更像C++的vector
    }
    //最后利用javascript自带的函数将json格式转化为gson格式
    return res.join('&');//最后将res结果向量转化为我们想要的格式
}

封装的ajax测试(可用php或者jsp或者文本)

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>ajax_test</title>
    <script src="ajax.js"></script><!--可以通过手动拖动的方式拖动js文件引入文件-->
    <script type="text/javascript">
        window.onload=function (ev) {
            //初始化之后就生成对应的响应函数
            var btn=document.querySelector("button");//按照选择器获取对象

            btn.onclick=function () {
                url='a.txt';//实际上javascript以及matlab和python都是弱类型得语言

                var data={
                    obj: {
                        username: 'lin',
                        password: '5201314Lc????'
                    },
                    timeout: 5000,
                    success: function (xmlhttp) {
                        alert(xmlhttp.responseText);
                    },
                    error: function (xmlhttp) {
                        alert(xmlhttp.status);
                    },
                    method: "GET",
                    url: 'a.txt'
                };
                //当用户点击button按钮的时候执行的操作
                ajax(data);//添加时间请求自动失败的参数
            }
        };
    </script>
</head>
<body>
    <button>click me</button>
</body>
</html>

利用原生js封装ajax的要点

  • 明白ajax五步骤,主要从ajax原生js教程
  • 然后需要注意访问方式的问题
  • 接下来你需要注意中文翻译的问题(只有这样才能添加到url中encodeURIComponent)
  • 接下来你需要理解的就是jquery版本的ajax传入的是一个json格式的对象,所谓的json就仅仅是单纯的键值对而已嘛
  • 还有就是请求时间过长需要终端请求
  • 最有技术含量的一点就是防止ie缓存让每次的url都变化,两种方式t=new Date.getTime()或者使用t=math.random()函数进行创建随机值

jquery中封装的ajax的简单使用

首先需要自己去官网下载jquery的js封装版本,jquery下载地址可能网速有点慢哟。
在这里插入图片描述
使用ajax的话你就需要去jquery的官网去寻找教程,jquery帮助手册的官网地址
在这里插入图片描述

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>ajax_test</title>
    <script src="jquery-3.5.1.js"></script>
    <script type="text/javascript">
        window.onload=function (ev) {
            //初始化之后就生成对应的响应函数
            var btn=document.querySelector("button");//按照选择器获取对象
            btn.onclick=function () {
                $.ajax({
                    type: "POST",
                    url: "a.txt",
                    data: "username=xiongerzi&password=5201314",
                    success: function(msg){
                        alert( "Data Saved: " + msg );
                    },
                    error: function (xmlhttp) {
                        alert(xmlhttp.status);//返回状态码
                    },
                    timeout: 3000
                });
            }
        };
    </script>
</head>
<body>
    <button>click me</button>
</body>
</html>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值