zoukankan      html  css  js  c++  java
  • ajax原理(原生js详解)

    什么是ajax?

    AJAX即”Asynchronous Javascript And XML“(异步JavaScript和XML),是指一种创建交互式网页应用的网页开发技术。

    通过在后台与服务器进行少量数据交换,AJAX可以是网页实现异步更新。这就意味着可以在不重新加载整个网页的情况下,对网页的某部分进行局部更新。

    如何使用AJAX?

    第一步:创建一个异步调用对象

    1 let xhr = new XMLHttpRequest();

    第二步:创建一个新的‘HTTP’请求

    1 xhr.open('get','http://shujvjiekou.php',true);

    参数一:请求方式(get/post/put...);参数二:请求地址(接口地址);参数三:是否异步

    第三步:发送解析,不涉及传输数据的话,参数为空。

    1 xhr.send();

    在send过程中要进行5步操作

    第一步:请求初始化(open没有调用)。                         就绪状态码表示为0

    第二步:请求已经建立,但是还没有发送。                    就绪状态码表示为1

    第三步:请求已经发送,准备处理。                               就绪状态码表示为2

    第四步:请求处理,获取内容的基本信息。                     就绪状态码表示为3

    第五步:请求响应全部完成,响应服务器的一切内容。   就绪状态码表示为4

    第四步:取到接口数据。

     1 xhr.onreadystatechange = function () {
     2             if (xhr.readyState == 4) {//就绪码为4,代表请求相应完成
     3                 if (xhr.status === 200) {//http状态码为200时(连接成功)
     4                     let data = JSON.parse(xhr.responseText);//获取接口返回的数据。类型是字符串。并将json格式字符串转换为对象
     5                 }else {
     6                     //抛错
     7                     throw new Error('接口地址有误' + xhr.status);//.status   http状态码
     8                 }
     9             }
    10         }

    如果向后端传输数据?

    1.如果是通过get方式,那么我们可以把数据放在请求地址中,将数据用“?”连接。

    需要注意的是,如果传输数据是一个对象,那么我们需要对对象进行处理。

     1 function objtostring(obj) {
     2             if (Object.prototype.toString.call(obj).slice(8, -1) === 'Object') {
     3                 let arr = [];
     4                 for (let attr in obj) {
     5                     arr.push(attr + '=' + obj[attr])//[a=1, b=2 ,c=3]
     6                 }
     7                 return arr.join('&');////a=1&b=2&c=3
     8             } else {
     9                 throw new Error('你输入的不是对象格式');
    10             }
    11         }

    2.如果是通过post传输,我们需要注意的是,必须要设置请求头!

    1 xhr.setRequestHeader('content-type', 'application/x-www-form-urlencoded');

    传输的数据放在send里面。

    用原生js封装一个简单的ajax

     1         //ajax四部曲
     2         function $ajax(obj) {
     3             //判断传输的数据是否是对象
     4             function objtostring(obj) {
     5                 //定义一个空数组
     6                 let arr = [];
     7                 if (Object.prototype.toString.call(obj).slice(8, -1) === 'Object') {
     8                     for (let value in obj) {
     9                         arr.push(value + '=' + obj[value]);
    10                     }
    11                     return arr.join('&');//将数组转换成由&拼接的字符串;
    12                 } else {
    13                     throw new Error('你输入的不是一个纯粹的对象');
    14                 }
    15             }
    16 
    17             let ajax = new XMLHttpRequest();
    18 
    19             //设置传输方式默认为get
    20             obj.type = obj.type || 'get';
    21 
    22 
    23             //设置传输地址,让地址不能为空;
    24             if (!obj.url) {
    25                 throw new Error("接口地址不能为空");
    26             }
    27 
    28             //设置是否异步
    29             if (obj.async === 'false' || obj.async === false) {
    30                 obj.async = false;
    31             } else {
    32                 obj.async = true;
    33             }
    34 
    35 
    36             //如果传输数据时,要对get和post方式进行不同的兼容处理
    37             if (obj.data) {//判断是否传输数据
    38                 //如果传输数据时
    39                 if (Object.prototype.toString.call(obj.data).slice(8, -1) === 'Object') {//判断传输数据是否为对象
    40                     obj.data = objtostring(obj.data);
    41                 } else {//不是对象
    42                     obj.data = obj.data;
    43                 }
    44             }
    45 
    46             //如果传输数据存在,且传输方式为get时
    47             if (obj.data && obj.type === 'get') {
    48                 obj.url += '?' + obj.data;
    49             }
    50 
    51             ajax.open(obj.type, obj.url, obj.async);
    52 
    53             //如果传输数据存在,且传输方式为post时
    54             if (obj.data && obj.type == 'post') {
    55                 ajax.setRequestHeader('content-type', 'application/x-www-form-urlencoded');
    56                 ajax.send(obj.data);
    57             } else {
    58                 ajax.send();
    59             }
    60 
    61             //当obj.async没有设置异步时,就是同步,无需监听;当设置异步时,就必须监听
    62             if (obj.async) {//异步时
    63                 ajax.onreadystatechange = function () {
    64                     if (ajax.readyState === 4) {//请求成功
    65                         if (ajax.status === 200) {//接口地址正确
    66                             //当对象中有success属性,且该属性类型为函数
    67                             obj.success && typeof obj.success === 'function' && obj.success(ajax.responseText);
    68                         } else {
    69                             obj.error && typeof obj.error === 'function' && obj.error('接口地址有误' + ajax.status);
    70                         }
    71                     }
    72                 }
    73             } else {//同步时
    74                 if (ajax.status === 200) {
    75                     obj.success && typeof obj.success === 'function' && obj.success(ajax.responseText);
    76                 } else {
    77                     obj.error && typeof obj.error === 'function' && obj.error('接口地址有误' + ajax.status);
    78                 }
    79             }
    80 
    81         }

    调用:

     1         $ajax({
     2             type:'get',
     3             url:'http://phpget.php',
     4             data:{
     5                 username:'zhangsan'
     6             },
     7             async:true,
     8             success:function(str){
     9                 console.log(JSON.parse(str));
    10             },
    11             error:function(e){
    12                 console.log(e);
    13             }
    14         })

    此原生js只适合去理解ajax,如果项目中使用的话,最好还是使用框架中的一些简易操作。

    比如:jQuery中,引入后直接调用就可以。

     1     $.ajax({
     2             type: 'post',//请求类型,默认get
     3             url: 'http://data.php',//接口地址
     4             data: {//传输数据
     5                 username:'zhangsan'
     6             },
     7             async: true,//默认异步
     8             dataType: 'json',//数据类型  JSON就会生成一个JavaScript对象
     9         }).done(function (d) {//请求成功
    10             console.log(d);
    11         }).fail(function (err) {//请求失败
    12             console.log(err);
    13         })
  • 相关阅读:
    阶梯博弈
    hihoCoder #1199 : Tower Defense Game ——(树型dp)
    2016 China-Final-F题 ——(SA+二分)
    ACM之路(20)—— Splay初探
    2016 ICPC China-Final 现场赛总结
    【Interleaving String】cpp
    【Best Time to Buy and Sell Stock III 】cpp
    【Maximal Rectangle】cpp
    【palindrome partitioning II】cpp
    【Maximum Subarray 】cpp
  • 原文地址:https://www.cnblogs.com/yznotes/p/12717709.html
Copyright © 2011-2022 走看看