ajax

一.ajax的概念

//A
      //阻塞 非阻塞  同步 异步
      //同步:
      //异步:
      //J
      //X

      //优势:局部刷新
      /* 
    <person>
        <name>huliangliang</name>
        <age>20</age>
    </person>
    {name:"hliangliange",age:20}
     */
Ajax,是 Asynchronous JavaScript + XML 的简写。指一种创建交互式网页应用的网页开发的技术。
通过异步模式,提升了用户体验。优化了浏览器和服务器之间的传输,减少不必要的数据往返,减少了带宽占用。Ajax引擎在客户端运行,承担了一部分本来由服务器承担的工作,从而减少了大量用户下的服务器负载。
Ajax最大的特点就是局部刷新。
Ajax 技术核心是 XMLHttpRequest 对象(简称 XHR)
创建Ajax对象
    new XMLHttpRequest(); 
    new ActiveXObject('Microsoft.XMLHTTP')     //IE6
open()
xhr.open('get', 'demo.php', true); //对于 demo.php 的 get 请求,false 同步
三个参数: 要发送的请求类型   (get 、post)、请求的 URL 和表示是否异步
Post:xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); xhr.send(data);
发送请求      send()      
接收服务器返回的信息        onreadystatechange
readyState
0  请求未初始化	1 服务器连接己建立
2  请求已接收	3 处理请求,响应中
4  响应就绪
status         HTTP 状态码
常见状态码
200 - 请求成功
301 -Moved Permanently 资源(网页等)被永久转移到其它URL
304 -Not Modified 使用缓存文档
404 - 请求的资源(网页等)不存在
500 - 内部服务器错误
状态码分类
1**信息,服务器收到请求,需要请求者继续执行操作	2**成功,操作被成功接收并处理
3**重定向,需要进一步的操作以完成请求	4**客户端错误,请求包含语法错误或无法完成请求
5**服务器错误,服务器在处理请求的过程中发生了错误

二.ajax的使用

<script>
      //1.创建ajax实例
      /* var xhr = new XMLHttpRequest();
      var xhr = new ActiveXObject("Microsoft.XMLHTTP"); */
      //兼容性
      if (window.XMLHttpRequest) {
        var xhr = new XMLHttpRequest();
      } else {
        var xhr = new ActiveXObject("Microsoft.XMLHTTP");
      }
      //2.准备工作 请求数据  接口url 请求类型type

      xhr.open("get", "data.json", true);

      //3.发送请求
      xhr.send();
      //4.取响应数据
      xhr.onreadystatechange = function () {
        if (xhr.readyState == 4) {
          if (xhr.status == 200) {
            //数据过来之后,如何处理,是根据需要来定,可能需要1行代码实现,也可能很多很多行代码实现
            console.log(xhr.responseText);
          } else {
            console.log("加载失败,请重试");
          }
        }
      };
    </script>

三.封装ajax

<script>
      //只针对于get请求
      function ajax(url, fnSuccess, fnError) {
        if (window.XMLHttpRequest) {
          var xhr = new XMLHttpRequest();
        } else {
          var xhr = new ActiveXObject("Microsoft.XMLHTTP");
        }

        xhr.open("get", url);
        xhr.send();
        xhr.onreadystatechange = function () {
          if (xhr.readyState == 4) {
            if (xhr.status == 200) {
              var data = xhr.responseText;
              fnSuccess(data);
            } else {
              fnError();
            }
          }
        };
      }
    </script>

四.测试封装函数

data.json文件内容是[1,2,3]
ajax.js就是上面三的代码
<ul></ul>
    <script src="ajax.js"></script>
    <script>
      var oUl = document.querySelector("ul");
      ajax("data.json", foo, bar);
      //成功时的处理函数foo
      function foo(a) {
        a = JSON.parse(a);
        var str = "";
        for (var i = 0; i < a.length; i++) {
          str += `<li>${a[i]}</li>`;
        }
        oUl.innerHTML = str;
      }
      function bar() {
        alert("失败了");
      }
    </script>

五.post请求

<input type="text" name="username" />
    <input type="button" value="提交" />
    <script>
      var aInput = document.querySelectorAll("input");
      aInput[1].onclick = function () {
        //1.创建ajax实例
        /* var xhr = new XMLHttpRequest();
      var xhr = new ActiveXObject("Microsoft.XMLHTTP"); */
        //兼容性
        if (window.XMLHttpRequest) {
          var xhr = new XMLHttpRequest();
        } else {
          var xhr = new ActiveXObject("Microsoft.XMLHTTP");
        }
        //2.准备工作 请求数据  接口url 请求类型type

        xhr.open("post", "05_test.php", true);
        xhr.setRequestHeader(
          "Content-type",
          "application/x-www-form-urlencoded"
        );
        //3.发送请求
        xhr.send("username=" + aInput[0].value);
        //4.取响应数据
        xhr.onreadystatechange = function () {
          if (xhr.readyState == 4) {
            if (xhr.status == 200) {
              //数据过来之后,如何处理,是根据需要来定,可能需要1行代码实现,也可能很多很多行代码实现
              console.log(xhr.responseText);
            } else {
              console.log("加载失败,请重试");
            }
          }
        };
      };
    </script>
<?php
//echo "123";
$name = $_POST["username"];
echo "hello".$name;
?>

六.ajax完整封装

<script>
      //1.既能适应get请求也能适应post请求
      //2.既能处理不带数据的请求也能处理附加数据的请求
      /* 
    参数:type 请求方式 get/post 必传
        url 请求地址  必传
        data 附加的数据(向后台传递的数据)
        success 请求成功时的回调函数 必传
        error 请求失败时的回调函数
    */

      //向服务端发送get请求,如果需要附加数据,这个数据放到url后面 demo.php?username=aaa&password=111
      //向服务端发送post请求,如果需要附加数据,这个数据放到请求体里,具体体现在xhr.send('username=aaa&password=111');

      //{username:"aaa",password:1111}

      function ajax(type, url, data, success, error) {
        // 注意 无论是get还是post 都有相同部分代码
        if (window.XMLHttpRequest) {
          var xhr = new XMLHttpRequest();
        } else {
          var xhr = new ActiveXObject("Microsoft.XMLHTTP");
        }
        //将{username:"aaa",password:111}变成username=aaa&password=111
        var str = "";
        for (var i in data) {
          str += i + "=" + data[i] + "&";
        }
        //将结尾的&替换成空字符
        str = str.replace(/&$/, "");

        //在不同的地方加判断
        if (type == "get") {
          xhr.open("get", url + "?" + str);
          xhr.send();
        }
        if ((type = "post")) {
          xhr.open("post", url);
          xhr.setRequestHeader(
            "Content-type",
            "application/x-www-form-urlencoded"
          );
          xhr.send(str);
        }

        xhr.onreadystatechange = function () {
          if (xhr.readyState == 4) {
            if (xhr.status == 200) {
              var data = xhr.responseText;
              success(data);
            } else {
              error();
            }
          }
        };
      }
    </script>

七.测试完整的ajax

<body>
    <script src="ajax01.js"></script>
    <script>
      ajax({
        url: "07_test.php",
        success: function (data) {
          console.log(data);
        },
        data: { username: "admin" },
        type: "get",
      });
    </script>
  </body>
<?php
$name = $_REQUEST["username"];
echo "111".$name;
//echo "111";
?>
function ajax(obj) {
  // 注意 无论是get还是post 都有相同部分代码
  if (window.XMLHttpRequest) {
    var xhr = new XMLHttpRequest();
  } else {
    var xhr = new ActiveXObject("Microsoft.XMLHTTP");
  }
  //将{username:"aaa",password:111}变成username=aaa&password=111
  var str = "";
  for (var i in obj.data) {
    str += i + "=" + obj.data[i] + "&";
  }
  //将结尾的&替换成空字符
  str = str.replace(/&$/, "");

  //在不同的地方加判断
  //toLowerCase()将字母转小写toUpperCase()将字母转大写
  if (obj.type.toLowerCase() == "get") {
    if (str == "") {
      xhr.open("get", obj.url);
    } else {
      xhr.open("get", obj.url + "?" + str);
    }
    xhr.send();
  }
  if (obj.type.toLowerCase() == "post") {
    xhr.open("post", obj.url);
    xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
    xhr.send(str);
  }

  xhr.onreadystatechange = function () {
    if (xhr.readyState == 4) {
      if (xhr.status == 200) {
        var data = xhr.responseText;
        obj.success(data);
      } else {
        if (obj.error) {
          obj.error();
        }
      }
    }
  };
}

八.回调函数

<script>
      //作为一个函数的参数进行传递,并在该函数内部通过指针(函数名)进行调用的函数,通常,调用是在某个条件满足时
      function foo(fn) {
        fn();
      }
      function bar() {}
      foo(bar);
</script>

九.事件委托

<style>
      li {
        background-color: red;
        margin: 10px 0;
      }
    </style>
  </head>
  <body>
    <ul>
      <li>1</li>
      <li>2</li>
      <li>3</li>
      <li>4</li>
      <li>5</li>
    </ul>
    <input type="button" value="more" />
    
    <script src="ajax01.js"></script>
    <script>
      let oUl = document.querySelector("ul");
      let oBtn = document.querySelector("input");
      /* let aLi = document.querySelectorAll("li");
      for (let i = 0; i < aLi.length; i++) {
        aLi[i].onclick = function () {
          console.log("a");
        };
      } */

      oUl.onclick = function (e) {
        //console.log("a");
        var evt = e || event;
        var _target = evt.target || evt.srcElement;
        if (_target.tagName.toLowerCase() == "li") {
          console.log("a");
        }
      };
      oBtn.onclick = function () {
        ajax({
          type: "get",
          url: "09_data.json",
          success: function (data) {
            data = JSON.parse(data);
            data.forEach((item) => {
              let oLi = document.createElement("li");
              oLi.innerText = item;
              oUl.appendChild(oLi);
            });
          },
        });
      };
    </script>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值