ajax入门和封装(五)

Ajax

  • 即Asynchronous Javascript And XML(异步JavaScript和XML),
  • 是一种js常用与异步通信的技术。也是指一种创建交互式网页应用的网页开发技术。(也可以做同步通信,对讲机)
    异步通信,依赖服务器,发请求出去,前端不受通信流程影响

同步异步

  1. 同步:指的是事件按先后顺序依次进行,步骤之间存在依赖关系,不能颠倒,如,买菜,洗菜,切菜,烧菜
  2. 异步:典型场景:烧水,听歌,玩手机,事件彼此 之间可以同时进行,事件并不被其他事件干扰或等待,事件之间不管谁先结束,烧水,看报纸,喝茶
  3. 通信步骤
  • 准备信纸————创建通信对象
var xhr = new XMLHttpRequest();
- 在早期IE版本中,使用ActiveXObject创建对象
  • 写信————通信初始化
xhr.open("get","data.json",true);
  • 送信发信————发送
xhr.send();
  • 收到回信————监听
xhr.onreadystatechange =function(){
    if(readyState ==4){
        console.log(xhr.responseText);
    }
}
  • 读信————取值

异步通信,依赖服务器,发请求出去,前端不受通信流程影响

ajax的详细通信步骤,ajax通信,大量的通用方法

  1. 创建通信对象 使用XMLHttpRequest实例,通常变量都用xhr名字
var xhr = new XMLHttpRequest(); //new+构造函数创建对象
  1. 初始化通信对象(发到哪里,怎么发,发给谁),使用open函数,open接收三个参数,第一个是通信类型get/post,第二个参数url请求地址,第三个参数,同步或异步,默认为true,表示异步。
xhr.open("get","data.json",true);
  1. 发送请求,使用send函数,从这里开始,表现异步,等下面的监听完成后,send才结束,会返回2
xhr.send();
console.log(111);
        xhr.onreadystatechange = function(){ 
        //拿到数据
            if(xhr.readyState ==4){
            if(xhr.readyState ==4 || xhr.readyState ==3){
                console.log(xhr.responseText);
                        }
                    }
  • 3的状态时,数据不大,一次接收到了,可能拿出来,可能数据未接收完整
  • 4的状态一定能拿出数据
  • ajax请求数据通常放在xhr对象的responseText字段中
  • 使用onreadystatechange监听xhr对象readyState(注意大写)属性值0-4 ,标识整个通信过程,接收到变成3,接收完毕变成4

ajax核心通信步骤分为五部,我们可以通过跟踪通信对象readyState属性来判断通信状态和进度

  • 0到1是同步

readyState属性 记录当前通信进行到什么步骤,其状态值为0-4

  • 0:当通信对象创建完毕未初始化
  • 1:当使用open初始化通信对象后状态为1
  • 2:调用send发送请求后状态为2
  • 3:开始接收返回数据 状态为3
  • 4:表示数据接收完毕
  • 注意:ajax可以同步,只不过同步:必须在open步骤前面监听,不然监听不到了

get和post的区别

  • 报文:报文(message)是网络中交换与传输的数据单位,及站点一次性要发送的数据块。报文包含了将要发送的完整的数据信息,其长短很不一致,长度不限且可变。
  1. post在数据传量上,较比get要大,可以发送M级别的数据。而get只能发送k界别
  2. post数据在报文内部传输,较比get请求将参数拼接在url后面的方式,更安全
  3. get请求在处理请求时,速度会比post快,理论上快一倍

get方式传参,参数在url后以?键=值&键=值...的方式传递eg:?name=violet&age=23&sex=男

  • 用按钮ajax模拟get发送请求
<form action="" method= "get">
        姓名:<input type = "text" name= "name"/>
        年龄:<input type = "text" name= "age"/>
        性别:<input type = "text" name= "sex"/>
            <input type = "submit" value= "提交"/>
            <input type = "button" value= "ajax提交get"/> <!-- 用ajax传参 -->
            <input type = "button" value= "ajax提交post"/>
    </form>
document.querySelector("input[type =button]").onclick = function(){
        //创建通信对象
        var url = "data.json?",
            inputs = document.querySelectorAll("input[type=text]");
            for(var n= 0;n < inputs.length;n++){
                url +=inputs[n].name+"="+inputs[n].value+"&";
            }
                //截取多余&
                url = url.substr(0,url.length-1); //截掉最后一个多余的&
        var xhr = new XMLHttpRequest();
        //初始化通信对象
        xhr.open("get",url,true);
        //发送请求
        xhr.send();
        //输出返回值
        xhr.onreadystatechange = function(){
            console.log(xhr.responesText);
        }
    };

而post请求参数放在报文内部传递,ajax请求中post类型传参,将参数放在send函数实参形式传递

document.querySelectorAll("input[type =button]")[1].onclick = function(){
        //创建通信对象
        var url = "data.json",
            reqDate = {}, //上送空对象
            inputs = document.querySelectorAll("input[type=text]");

            for(var n= 0;n < inputs.length;n++){
                reqDate[inputs[n].name]=inputs[n].value;
                
            }
                
        var xhr = new XMLHttpRequest();
        //初始化通信对象
        xhr.open("post",url,true);
        //发送请求 post传参 参数会被转换为string上送给后台
        xhr.send(JSON.stringify(reqDate));
        //输出返回值
        xhr.onreadystatechange = function(){
            if(xhr.readyState ==4){
                var data = JSON.parse(xhr.responseText);
                console.log("我叫"+data.name+"我今年"+data.age);
            }
            
        };
    };

JSON 对象的使用,最主流的数据传输方式,就是JSON,多语言数据结构

  • json格式字符串:通用的轻量级数据格式,解析比xml更快(轻量级)
  • 四种通用格式:{"键":值} || [值,值] ||
    {"键":[值,值]} || [{"键":值,"键":值}]
  • JSON.parse();将标准的JSON字符串转换成对象,必须内层加上双引号,外层用单引号
console.log(JSON.parse('{"name":"tom","age":28}')); //输出对象
  • JSON.stringify()将js对象转换成JSON字符串
console.log(JSON.stringify({"name":"tom","age":28})); //输出字符串{"name":"tom","age":28}
  • 一个对象转化成字符串长度是15
  • .json文件中不能加注释,否则报语法错误
  • encodeURIComponent(转码) 和 decodeURIComponent(变成中文)
  • utf-8,数字表示用几位来表示中文,4位都不支持中文
  • utf-16,数字表示用16位表示一个字符

ajax封装

  • ajax请求函数
  • @param:type 请求方式
  • @param:url 请求地址
  • @param:isAnsy 是否异步
  • @param:sendData 上送数据 {key:value}
  • @param:callback 返回数据,它的参数就是返回值
function postReq (type, url, isAnsy,sendData,callback){
            // 创建通讯对象
            var xhr = createXHr();
            // 根据请求方式处理上送数据
            if(type.toLowerCase() == "get"){
                // 将对象性数据转换为queryString结构
                url += "?";
                for(var n in sendData){
                    url += n +"=" + sendData[n] + "&";
                }
                // 截取末尾多余&
                url = url.substr(0,url.length-1);   
                // 设置sendDate为空null
                sendDate = null;
            }else{
                // 将js对象类型数据转化为json格式的字符串
                sendData = JSON.stringify(sendData);
            }
            // 初始化通信对象
            xhr.open(type,url,isAnsy);
            // 发送请求
            xhr.send(sendData);

            // 监听请求返回状态
            xhr.onreadystatechange = function(){
                    // xhr对象status属性用于描述http通信状态  statusText 是对status的描述信息
                    if(xhr.status == 200 || xhr.status == 304 || (xhr.status>200 && xhr.status<300)){
                        // console.log(xhr);
                        if(xhr.readyState == 4){
                        var resData = JSON.parse(xhr.responseText);
                        callback && callback(resData);
                    }               
                }
            }
        }
try{
            console.log(abc);   //可能出现异常的代码
        }catch(e){
            console.log(e);   //异常事件处理   //异常出现时执行的代码
        }finally{
            console.log(33);  //无论是都会出现异常都要执行的代码
        }       
        console.log("aaaa");   //无论try中是否出现异常都不会影响后续代码执行

        // 创建一个兼容的xhr创建函数
        function createXHr(){
            绝大部分浏览器支持XMLHttpRequest
            if (typeof XMLHttpRequest == "function"){
                return new new XMLHttpRequest();
            }else{
                var strList = ["MSXML.XMLHttp.6.0","MSXML.XMLHttp.3.0","MSXML.XMLHttp", "Microsoft.XMLHTTP" //ie6];
                // 循环尝试创建xhr对象
                for(var n = 0; n < strList.length; n++){
                    // 使用try catch 防止错误参数
                    try{
                        var xhr = new ActiveXObject(strList[n]);
                        // 返回xhr对象
                        return xhr;
                    }catch(e){
                        console.log(e);
                    }
                }
            }
        }
  • html加载自上向下,自外向内优先级比自上向下高,

  • 加载就是标签节点,并不是

  • ajax的数据返回,如果要用数据有两种方法:

  • 第一种:直接将所有的东西放到请求数据函数里面

  • 第二种:声明全局变量,比如班级全局变量,数据全局变量,在请求函数里面赋值

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容