Asynchronous JavaScript And XML : (异步的 JavaScript 和 XML)

213 阅读5分钟

Asynchronous JavaScript And XML: ajax

  • Ajax概念: 前端程序和后端程序交换方式;
  • Ajax的特点: 可以实现动态不刷新(局部刷新);也就是所说的局部数据交互(没有页面跳转);
  • Ajax的作用:ajax是一种用于创建快速动态网页的技术,通过在后台与服务器进行少量数据交换,ajax可以使网页实现异步更新;

Ajax基本语法:

  1. Ajax使用的是面向对象的编程方式: 通过内置构造函数 创建ajax实例化对象,通过ajax实例化对象的函数方式执行对应的程序;
1.创建ajax实例化对象;
2.设定请求方式 设定请求url地址;
3.如果是post方式需要设定请求头格式:
4.发送设定好的请求;
5.接收请求结果;

Ajax常用属性和方法:

      onabort: 表示请求中断后要处理的事。和 xhr.abort() 一起使用。

      ontimeout: 表示请求的超时,执行的方法。和timeout设定的事件一起使用。

      response: 响应的主体内容。

      responseText: 响应的具体内容是字符串,一般是 json 字符串

      responseXML: 响应的具体内容是文档。

      status: http 的状态码。

      statusText: 状态码描述

      withCredentials:表示是否允许跨域。

      getAllResponseHeaders:获取所有响应头信息。

      xhr.open():打开URL请求。

      xhr.send():表示发送 ajax。

      setRequestHeader(): 设置请求头。这个属性在必须在xhr.open()后面
        

Ajax请求- get请求方式:

get方式:
  <button>发送请求</button>
  <script>
  
   const oBtn = document.querySelector('button'); //  获取button标签
   
      oBtn.addEventListener('click' , ()=>{       // 点击 button标签时 触发 ajax 程序
      
      const xhr = new XMLHttpRequest();           // 1, 创建 ajax 实例化对象对象 
            console.log( xhr );
            
       xhr.open( 'get' , 'http://localhost:8888/test/first' );  // 2, 设定请求方式 和 url地址
       
          xhr.send(); // 4, 发送请求
          
           xhr.addEventListener('load' , ()=>{    // 5, 接收响应体结果
             console.log( xhr.response ); 
             // 当 ajax请求 都执行结束 触发的函数程序
             // 其中 xhr.response 和 xhr.responseTex  存储解析的响应报文中存储的响应体内容;
             // 也就是 xhr.response 和 xhr.responseText 存储的是后端响应的内容
             // 从 http的响应报文中 解析出 响应体数据 存储到 ajax实例化对象的属性中 
         
            })
      })
      
 总结:
   请求方式 请求地址 携带参数 参数名称 都是后端程序决定的;

                1,  使用 内置构造函数创建ajax实例化对象
                    const xhr = new XMLHttpRequest();
                        普通浏览器

                    const xhr = new ActiveXObject('Microsoft.XMLHTTP');
                        低版本IE浏览器
        
                2,  使用 open() 方法 设定 请求方式 请求url地址

                    xhr.open( '请求方式' , '请求的url地址' );

                3,  如果 post方式 需要设定请求头格式

                4,  使用 send() 方法 发送 设定好的 请求

                    xhr.send();

                5,  ajax是异步程序 当 ajax请求结束 触发执行函数程序

                    xhr.addEventListener( 'load' , ()=>{
                        请求结束 触发执行的函数程序
                    })
  </script>
  

Ajax状态码:

   Ajax实例化对象.readyState:
     Ajax状态码 :
                    0   表示只是创建了ajax实例化对象
                    1   表示ajax实例化对象设定了 open 以及 请求头
                    2   表示ajax实例化对象执行了 send 发送了请求
                    3   表示ajax请求结束了 接收了 响应报文
                    4   表示ajax从 响应报文中解析了响应体数据,存储到 ajax实例化对象的 response 和 responseText 中

                    当 ajax状态码 是 4 时 表示 请求结束 并且 解析完成了 响应体数据
Ajax实例化对象.status:
                http状态码:
                   100-199 提示信息 – 表示请求正在处理  
                   200-299 成功 – 表示请求正常处理完毕  
                   300-399 [重定向]要完成请求必须进行更进一步的处理  
                   400-499 客户端错误 – 请求有语法错误或请求无法实现  
                   500-599 服务器端错误 – 服务器处理请求出错。

Ajax-get方式携带参数:

  • get方式携带参数: 携带参数的语法形式和超链接携带参数的语法形式完全相同;是浏览器地址栏携带参数的语法形式;
  总结:
     ajax实例化对象.open( 'get' , 'url地址?键名=键值&键名=键值...' );
                    参数键值对 和 url地址 之间 使用 ?问号 间隔
                    多个键值对 之间 使用 & 符号间隔

Ajax-get方式携带参数:

    姓名:<input type="text"><br>
    年龄:<input type="number"><br>
    <button>发送请求</button>
    <script>
        //  获取button标签
        const oBtn = document.querySelector('button');
        //  获取input标签对象
        const oIptName = document.querySelectorAll('input')[0];
        const oIptAge = document.querySelectorAll('input')[1];
        
        //  添加点击事件:
        oBtn.addEventListener('click' , ()=>{
            // 1,创建ajax实例化对象
            const xhr = new XMLHttpRequest();

            // 2,设定open()
            // url地址后携带参数
            xhr.open( 'get' , `http://localhost:8888/test/third?name=${oIptName.value}&age=${Number(oIptAge.value)}`);  
            //在 设定 open() 方法时 在 参数2 也就是 请求的url地址后携带参数             

            // 3,如果是post方式设定请求头格式

            // 4,设定send()
            xhr.send();

            // 5,请求结束 执行的函数程序
            xhr.addEventListener( 'load' , ()=>{
                // 解析的响应体内容
                console.log( xhr.response );
                
            })
        })

<script>
  

Ajax请求- post请求方式:

  • post设定请求头的**目的:**是为了可以正常解析携带的参数
  • post方式请求头的固定格式: xhr.setRequestHeader( 'Content-Type' , 'application/x-www-form-urlencoded' );
  • post方式携带参数的方式: post方式在send( );函数方法中设定携带的参数;
  • post方式携带参数的语法形式: 键值对形式,多个键值对之间使用& 符号间隔,特别注意post方式没有问号;
post方式:
<body>
      姓名:<input type="text"><br>
      年龄:<input type="number"><br>
      <button>发送请求</button>

    <script>
        //获取button标签对象
        const oBtn = document.querySelector("button");
        //获取input标签对象
        const oIptName = document.querySelectorAll("input")[0];
        const oIptAge = document.querySelectorAll("input")[1];

        //给button标签添加点击事件
        oBtn.addEventListener("click",()=>{
        
            //1.使用内置构造函数创建实例化对象
            const xhr = new XMLHttpRequest();
            //2.设定open()
            xhr.open('post', 'http://localhost:8888/test/fourth');
            
            //3.如果是post 则需要写请求头格式
            xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded")//post方式 请求头的设定 是固定的语法形式
            
            //4.send() 发送请求
            // xhr.send(`name=${oIptName.value }&age=${Number(oIptAge.value)}`);
            xhr.send(`name=${oIptName.value}&age=${Number( oIptAge.value )}`);
            //5.接收请求()
            xhr.addEventListener("load",()=>{
                console.log(xhr.response);
            })
            
        })
            </script>
</body>

Ajax封装函数:

外部文件:

// 封装的ajax请求函数
function myAjax( resObj = { } ){
    // 设定默认值对象 
    const valObj = {
        type:'get', //get 或者 post;
        data:'', //传入的参数
        url:'', // URL 地址
    };

    // 如果 实参对象中 data属性 存储的是对象形式 { name:'张三' , age:18 }
    // 需要 转化为 键值对字符串形式  'name=张三&age=18'
    if( typeof( resObj.data ) === 'object' ){
        // 定义空字符串 存储 结果 
        let str = '' ;

        // 循环遍历 携带参数对象 也就是 resObj.data 中 存储的对象 
        for( let key in resObj.data ){
            // key 是 对象的键名 也就是 name  age ...
            // resObj.data[key] 是 对象的键值 也就是 张三 18 ...
            str += `&${key}=${resObj.data[key]}` ;
        }

        // 将拼接好的字符串 赋值给 resObj.data 存储 
        // 也就是将 原始存储的对象 覆盖成 拼接好的字符串 
        resObj.data = str.substr(1);
    }


    // 循环遍历默认值对象 
    for( let key in valObj ){
        // 使用 默认值对象中的键名 去 实参对象中调用数据
        if( resObj[key] !== undefined ){
            // 如果调用结果不是undefined 证明 实参对象中 有默认值数据 
            // 将实参对象中的数据 覆盖 默认值对象中的数据
            valObj[key] = resObj[key];
        }
    }


    // 创建ajax实例化对象
    const xhr = new XMLHttpRequest() ;

    // 根据请求类型执行不同的 设定步骤
    // 判断 get/post 请求方式 要统一大小写
    if( valObj.type.toLowerCase() === 'get' ){
        // 设定open()

        // 如果 携带参数也就是valObj.data 是 空字符串 证明没有携带参数 
        // 那么 open()方法 参数2 只设定 请求的url地址

        // 如果 携带参数也就是valObj.data 不是 空字符串 证明需要携带参数 
        // 那么 open()方法 参数2 请求的url地址 拼接问号 拼接 携带参数

        // xhr.open( 'get' , valObj.data === '' ? valObj.url : valObj.url + '?' + valObj.data );

        xhr.open( 'get' , valObj.data === '' ? valObj.url : `${valObj.url}?${valObj.data}` );

        // 设定send()发送请求携带参数
        xhr.send();



    }else if( valObj.type.toLowerCase() === 'post' ){
        // 设定open()
        xhr.open( 'post' , valObj.url );

        // 固定的请求头设定
        xhr.setRequestHeader( 'Content-Type' , 'application/x-www-form-urlencoded' );

        // 设定send() 如果有参数携带参数
        xhr.send( valObj.data );
    }

    // 接收请求结果
    xhr.addEventListener( 'load' , ()=>{
        console.log( xhr.response );
    })

}

json字符串 :

  • 概念: 所谓的json字符串是一种特殊的字符串,用于不同计算机语言交互数据使用;
  • 原因是:不同的计算机程序 数据结果语法不同;
  • 例如: JavaScript 语法与PHP 语法:
 JavaScript 中 数组存储对象:
                    [
                        { id:1 , name:'张三' , age:18 , sex:'男' },
                        { id:2 , name:'李四' , age:19 , sex:'女'},
                        { id:3 , name:'王五' , age:20 , sex:'保密'},
                    ]
                  
  PHP 中 数组存储数组
                    [
                        [ 'id' => 1 , 'name' => '张三' , 'age' => 18 , 'sex' => '男' ],
                        [ 'id' => 2 , 'name' => '李四' , 'age' => 19 , 'sex' => '女' ],
                        [ 'id' => 3 , 'name' => '王五' , 'age' => 20 , 'sex' => '保密' ],
                    ]
                    
 如果PHP程序直接将数组存储数据的数据结构返回给JavaScript程序时,此时JavaScript程序它自己不能直接并且正确的识别 PHP程序返回的数据;
 
 此时,将PHP的数组存储的数据可以通过 Json字符串转化成字符串后,再返回给前段JavaScript程序;
 这个时候前段JavaScript程序就可以识别 Json字符串,再将Json字符串还原成JavaScript可以使用的数据结构;
 
  • JavaScript中 操作json字符串的方法 :
 JSON.parse( json字符串 )
                    将 json字符串 转化为 对应的JavaScript数据结构
 JSON.stringify( js数据结构 )
                    将 JavaScript数据结构 转化为 对应的 json字符串