Ajax基础

Google Suggest

  • AJAX(Asynchronous JavaScript and XML),最早出现在 2005 年的 Google Suggest
  • 浏览器端进行网络编程(发送请求,接收响应)的技术方案
  • 它使我们可以通过JavaScript直接获取服务端最新的内容而不必重新加载页面
  • 让web更加能够接近桌面应用的用户体验

AJAX

  • AJAX就是浏览器提供的一套api,可以通过JavaScript调用,从而实现通过代码控制请求和响应,实现通过JavaScript进行网络编程
  • XML:最早在用户端和服务端之间传递数据时所采用的数据格式

应用场景

  • 按需获取数据
  • 对用户数据校验
  • 自动更新页面内容
  • 提升用户体验,无刷新的体验

体验ajax

  • 使用jQuery中封装的ajax,快速体验带来的效果
  • 免费接口:

https://jsonplaceholder.typicode.com/

例如:

<script>
    // jQuery 中的 Ajax 方法
    $.ajax({
      url : "https://jsonplaceholder.typicode.com/users",
      type: "GET",
      dataType : "json",
      data : {"id" : 1},
      success : function(data){
        console.log(data);
      }
    })
  </script>

原生Ajax

发送ajax请求步骤

  • 创建XMLHTTPRequest类型的对象
  • 准备发送,打开与一个网址之间的链接
  • 执行发送动作
  • 指定xhr状态变化事件处理函数
<script>
    // 1.创建一个 XMLHttpRequest 类型的对象  --- 相当于打开了一个浏览器
    var xhr = new XMLHttpRequest();
    // 2.打开一个与网址之间的连接  --- 相当于在地址栏输入网址
    xhr.open("GET","https://jsonplaceholder.typicode.com/users");
    // 3.通过连接发送一次请求 --- 相当于点击回车或者超链接
    xhr.send(null);
    // 4.指定 xhr 状态变化事件处理函数   --- 相当于处理网页呈现后的操作
    xhr.onreadystatechange = function () {
      // 通过判断 xhr 的 readyState ,确定此次请求是否完成
      if (this.readyState === 4) {
        console.log(this.responseText)
      }
    }
  </script>

XMLHttpRequest 类型对象

  • AJAX API 中核心提供的是一个XMLHttpRequest 类型,所有的 AJAX 操作都需要使用到这个类型。
    var xhr = new XMLHttpRequest();
  • IE6 兼容
    xhr = new ActiveXObject("Microsoft.XMLHTTP");
  // 1.创建一个 XMLHttpRequest 类型的对象 
    var xhr = null;
    // 兼容写法
    if (window.XMLHttpRequest) {
      // 标准浏览器
      xhr = new XMLHttpRequest();
    } else {
      // IE 6 浏览器
      xhr = new ActiveXObject("Microsoft.XMLHTTP");
    }

open() 方法开启请求

  • 本质上 XMLHttpRequest 就是 JavaScript 在 Web 平台中发送 HTTP 请求的手段,所以我们发送出去的请求仍然是 HTTP 请求,同样符合 HTTP 约定的格式。
  • 语法:xhr.open(method, url)
  • method:要使用的HTTP方法,比如「GET」、「POST」、「PUT」、「DELETE」、等。
  • url:要向其发送请求的 URL 地址,字符串格式。

setRequestHeader() 方法设置请求头

  • 此方法必须在 open() 方法和 send() 之间调用。
    GET方法没必要使用请求头
  • 语法:xhr.setRequestHeader(header, value);
  • header: 一般设置 “Content-Type” ,传输数据类型,即服务器需要我们传送的数据类型
  • value: 具体的数据类型,常用 "application/x-www-form-urlencoded" 和"application/json"。

send() 方法发送请求

  • 用于发送 HTTP 请求
  • 语法:xhr.send(body)
  • body:在XHR请求中要发送的数据体,根据请求头中的类型进行传参。
  • 如果是 GET 方法,无需设置数据体,可以传 null 或者不传参。
// 2.open() 方法开启请求
    // xhr.open("GET","https://jsonplaceholder.typicode.com/users?id=1");
    xhr.open("POST","https://jsonplaceholder.typicode.com/users");
    // 设置请求头
    // 一般 get 方法不需要设置,而 post 方法必须设置
    xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
    // 3.send() 方法发送一次请求
    // 如果是 get 方法请求,不需要再 send 中传参数,它如果想传参数,直接写在网址上
    // xhr.send(null);
    xhr.send("name=harry&age=19");
    
    xhr.onreadystatechange = function () {
      // 通过判断 xhr 的 readyState ,确定此次请求是否完成
      if (this.readyState === 4) {
        console.log(this.responseText)
      }
    }

readyState 属性

readyState 属性返回一个 XMLHttpRequest 代理当前所处的状态,由于 readystatechange 事件是在 xhr 对象状态变化时触发(不单是在得到响应时),也就意味着这个事件会被触发多次,所以我们有必要了解每一个状态值代表的含义:



过程梗概
  • 一般我们都是在 readyState 值为 4 时,执行响应的后续逻辑。
xhr.onreadystatechange = function() {
 if (this.readyState === 4) 
{ // 后续逻辑...... 
} };

同步和异步

  • 同步:一个人在同一个时刻只能做一件事情,在执行一些耗时的操作(不需要看管)不去做别的事,只是等待
  • 异步:在执行一些耗时的操作(不需要看管)去做别的事,而不是等待

ajax实现

  • xhr.open() 方法第三个参数要求传入的是一个 boolean 值,其作用就是设置此次请求是否采用异步方式执行
  • 默认为 true 异步,如果需要同步执行可以通过传递 false 实现
  • 如果采用同步方式执行,则代码会卡死在xhr.send() 这一步

建议:

  • 为了让这个事件更加可靠(一定触发),在发送请求send()之前,一定是先注册readystatechange
  • 不论是同步或者是异步都能触发成功
  • 了解同步模式就行,不要使用同步模式

xml数据格式

  • 数据描述手段
  • 老掉牙的东西,现在的项目基本不用了
  • 淘汰原因:冗余太多

JSON数据格式

  • JavaScript object Notation,JavaScript对象表示法
  • 也是一种数据描述手段,类似于JavaScript字面量方式
  • 服务端采用JSON格式返回数据,客户端按照JSON格式解析数据

JSON 格式的数据,与 js 对象的区别

1.JSON 数据不需要存到变量中
2.结束时不需要写分号
3.JSON 数据中的属性名必须加引号

{
  "name": "tom",
  "age": 19,
  "hobby": ["novel","sing"]
}

JSON对象

  • 内部有两个方法
  • JSON.stringify(参数):将参数转换为JSON格式的字符串
  • JSON.parse(参数):转换为对象,就可以使用其中的属性和方法了

注意:

  • 不管是 JSON 也好,还是 XML,只是在 AJAX 请求过程中用到,并不代表它们与 AJAX 之间有必然的联系,它们只是数据协议罢了。
  • 不管服务端是采用 XML 还是采用 JSON 本质上都是将数据返回给客户端。
  • 服务端应该根据响应内容的格式设置一个合理的 Content-Type

json-server

  • 本地搭建一个临时服务器
  • json-server 是一个 Node 模块,运行 Express 服务器,你可以指定一个 json 文件作为api 的数据源。
  • 也就是说,可以使用它快速的搭建一个web服务器
  • 网址:

https://github.com/typicode/json-server

使用指令安装json-server

npm install -g json-server

在vscode终端下启动json-server并且监听json文件

json-server --watch db.json

显示如下

json数据

如果启动json-server报错,并且报错为禁止脚本运行,参照以下

https://blog.csdn.net/Q_do_it/article/details/107785076

原生ajax具体方法-GET

  • 通常在一次GET请求过程中,参数传递都是通过URL地址中的'?'参数传递
  • 一般在 GET 请求中,无需设置请求头
  • 无需设置响应体,可以传 null 或者干脆不传
<script>
    var xhr = new XMLHttpRequest();
    // 发送 GET 请求
    xhr.open("GET", "http://localhost:3000/users?age=19");
    xhr.send(null);
    xhr.onreadystatechange = function () {
      if (this.readyState === 4) {
        console.log(this.responseText);
      }
    }
  </script>

原生ajax具体方法-POST

  • POST 请求过程中,都是采用请求体承载需要提交的数据。
  • 需要设置请求头中的 Content-Type,以便于服务端接收数据
  • 需要提交到服务端的数据可以通过 send 方法的参数传递
var xhr = new XMLHttpRequest();
    // post 请求
    xhr.open("POST","http://localhost:3000/users");
    // 设置请求头
    // xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
    xhr.setRequestHeader("Content-Type","application/json");
    // xhr.send("name=lily&age=19&class=2");
    // xhr.send(`{
    //   "name": "lulu",
    //   "age": 18,
    //   "class": 2
    // }`);
    xhr.send(JSON.stringify({
      "name": "harry",
      "age": 18,
      "class": 1
    }));
    xhr.onreadystatechange = function () {
      if (this.readyState === 4) {
        console.log(this.responseText);
      }
    }

处理响应数据渲染

  • 客户端中拿到请求的数据过后最常见的就是把这些数据呈现到界面上。
  • 如果数据结构简单,可以直接通过字符串操作(拼接)的方式处理
  • 但是如果数据过于复杂,字符串拼接维护成本太大,就不推荐了
  • 可以使用模版引擎或者 ES6 提供的模板字符串
<body>
  <table border="1" id="box">
    <tr>
      <th>学号</th>
      <th>姓名</th>
      <th>年龄</th>
      <th>班级</th>
    </tr>
    
  </table>
  <script>
    // 获取元素
    var box = document.getElementById("box")
    var xhr = new XMLHttpRequest();
    // 发送 GET 请求
    xhr.open("GET", "http://localhost:3000/users");
    xhr.send(null);
    xhr.onreadystatechange = function () {
      if (this.readyState === 4) {
        // 讲获取的响应体的字符串转为对象
        var data = JSON.parse(this.responseText)
        console.log(data);
        var str = "";
        // 循环遍历数组
        for (var i = 0 ; i < data.length ;i++) {
          // 进行字符串拼接 
          // str += "<tr><td>" + data[i].id + "</td><td>" + data[i].name + "</td><td>" + data[i].age + "</td><td>" + data[i].class + "</td></tr>";
          // 使用 模板字符串 进行拼接
          str += `<tr>
            <td>${data[i].id}</td>
            <td>${data[i].name}</td>
            <td>${data[i].age}</td>
            <td>${data[i].class}</td>
          </tr>`
        }
        box.innerHTML += str;
      }
    };
  </script>
</body>

封装AJAX库

  • 这里主要是为了了解封装的过程,一般情况在开发中都是使用第三方提供的 AJAX 库,因为它们可能更加严谨。
  • 为了在后续的开发过程中可以更方便的使用这套 API,一般的做法都是将其封装到一个函数中以便调用。

提取参数

  • 参数1:string,method表示请求方法
  • 参数2:string,url 表示地址
  • 参数3:Object,params 请求参数
  • 参数4:function,done 请求完成后执行的回调函数

封装函数

 function ajax(method, url, params, done) {
      // 统一将方法中的字母转大写,便于后面判断
      method = method.toUpperCase();
      // 书写 IE 6 的兼容
      var xhr = window.XMLHttpRequest 
      ? new XMLHttpRequest() 
      : new ActiveXObject("Microsoft.XMLHTTP");
      // 将对象格式的参数转为 urlencoded的格式
      var pairs = [];
      for (var k in params) {
        pairs.push(k + "=" + params[k]);
      }
      var str = pairs.join("&");
      // 判断是否是 get 方法,需要更改 url 的值
      if (method === "GET") {
        url += "?" + str;
      }
      // 创建打开一个连接
      xhr.open(method, url);
      var data = null;
      // 如果是 post 方法,需要设置请求头,还有请求体
      if (method === "POST") {
        xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
        data = str;
      }
      xhr.send(data);
      // 执行回调函数
      xhr.onreadystatechange = function () {
        if (this.readyState !== 4) return;
        // 执行外部传进来的回调函数即可
        // 需要用到响应体
        done(JSON.parse(this.responseText));
      }
    }

封装完毕之后可以单独建立一个JS文件以供后面调用

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,029评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,238评论 3 388
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,576评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,214评论 1 287
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,324评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,392评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,416评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,196评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,631评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,919评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,090评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,767评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,410评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,090评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,328评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,952评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,979评论 2 351

推荐阅读更多精彩内容

  • AjaxStudyNote (E:\Video_Tutorials\Java自学视频\尚硅谷JavaEE培训\6W...
    小小小小小小小小小小銀阅读 306评论 0 2
  • AJAX 一、同步交互与异步交互 客户端想服务器端发送请求,直到服务器端进行响应,这个过程中,用户是不能做任何其他...
    我是渐渐呀阅读 362评论 0 1
  • ### AJAX是什么 AJAX =异步JavaScript和XML(json)。通过在后台与服务器进行少量数据交...
    蘩蕐皆成空阅读 371评论 0 0
  • AJAX 概念: 异步javascript和XML(json). 作用:进行数据交换,使网页实现异步更新,可以只对...
    行不离书阅读 167评论 0 0
  • AJAX(Asynchronous Javascript And XML) 概念:无需加载整个网页就可更新部分网页...
    nanamii阅读 310评论 1 0