Skip to content

原生 AJAX 的异步请求

AJAX 是 Asynchronous JavaScript And XML 的缩写,即异步 JavaScript 和 XML 技术,并不是一门新的语言或技术,可以在无需重新加载整个网页的情况下,实现更新部分网页。

一、创建 XMLHttpRequest 对象

js
// 创建自定义变量,用于存储 XMLHttpRequest 对象的实例
let xmlhttp;
// 避免浏览器不兼容
if (window.XMLHttpRequest) {
  // IE7+、Firefox、Chrome、Safari 以及 Opera
  xmlhttp = new XMLHttpRequest();
} else {
  // IE5、IE6
  xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
}

二、请求

js
//  打开请求
xmlhttp.open("GET", "./data/data.txt", true);
// xmlhttp.open(method, url, async);
// method 	请求的类型,如常用的 get 和 post
// url 		处理响应文件的路径
// async	是否使用异步处理,布尔数据类型

// 发送请求
xmlhttp.send();

三、响应

js
// 字符串形式的响应数据
xmlhttp.responseText;

// XML形式的响应数据
xmlhttp.responseXML;

四、onreadystatechange 事件

  • onreadystatechange:监测 XMLHTTP 请求的状态(readyState)信息事件,一旦 readyState 发生改变即调用该事件。
  • readyState 请求状态表如下:
状态含义
0请求未初始化
1服务器连接已建立
2请求已接收
3请求处理中
4请求已完成,且响应已就绪
  • status 状态码:
状态码含义
200“OK”
304未修改
403禁止
404未找到页面
500内部服务器错误

需要了解更多的状态码信息不妨观看: HTTP_请求信息与响应信息

  • 结合使用
js
xmlhttp.onreadystatechange = function () {
  if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
    // 这里是异步之后的执行的内容
  }
};

五、小案例

js
<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Demo</title>
    <script src="js/index.js"></script>
    <!-- <script type="module" src="js/mian.js"></script> -->
  </head>

  <body></body>

    <script>
    "use strict";
    /*
      读取本地 json 文件的数据
	  1.读取 data.txt 中的内容
   	  2.打印在 body 节点上
	*/
    const xhr = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject("Microsoft.XMLHTTP");

    // 这里的 url 是需要读取的文件路径
    xhr.open("GET", "./data/data.json", true);
    xhr.send();
    xhr.onreadystatechange = function () {
      if (xhr.readyState == 4 && xhr.status == 200) {
        if (xhr.status == 200) {
          // 把响应的内容打印在 body 上
          document.body.innerHTML = xhr.responseText;
        }
      }
    };
  </script>
</html>

注: 运行 AJAX 的时候需要在服务器环境上才可以运行,不然会报错,这里可以在 vscode 添加 live server 插件,并使用该插件运行代码即可。

Released under the MIT License.