1.什么是 ajax

        ajax的出现刚好解决了传统方法的缺陷,ajax是一种用于创建快速动态网页的技术。通过在后台与服务器进行少量数据交换,ajax可以使i网页实现异步更新。这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新。

2.XMLHttpRequest 对象

        XMLHttpRequest 对象是 ajax 的基础,XMLHttpRequest 用于在后台与服务器交换数据。也是实现页面更新的核心部分。

3.五步使用法

        1.创建 XMLHttpRequest 对象

        2.使用 open 方法设置和服务器的交互信息

        3.设置发送的数据

        4.注册事件

        5.更新界面

下面是 get 请求和 post 请求的例子

get请求:

// 步骤一:创建异步对象
    var xhr = new XMLHttpRequest()
    // 步骤二:注册事件 onreadystatechange 当ajax请求完成后 会触发该事件
    xhr.onreadystatechange = function () {
      if (xhr.readyState == 4 && xhr.status == 200) {
        var res = xhr.response // 接收响应结果
      }
    }
    // 步骤三:设置请求的url参数,参数一是请求的类型,参数二是请求的url,可以带参数,动态传递参数startName到服务端
    xhr.open('get', 'http://www.aaaaaaa/getmessage?id=1&username=小甜甜')
    // 步骤四:发送请求
    xhr.send()

post请求:

// 步骤一:创建异步对象
    var xhr = new XMLHttpRequest()

    // 步骤二:注册事件 onreadystatechange 当ajax请求完成后 会触发该事件
    xhr.onreadystatechange = function () {
      if (xhr.readyState == 4 && xhr.status == 200) {
        var res = xhr.response // 接收响应结果
      }
    }
    // 步骤三:调用 open 设置请求方式及请求的 url 地址
    xhr.open('post', 'http://www.aaaaaaa/addmessage')
    // 步骤四:设置请求头
    xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded")
    // 步骤五:发送请求
    xhr.send('name=cat&age=18')

4.封装成方法

01-测试这个封装的方法

// 测试这个封装的函数'
    let baseURL = 'http://www.aaaaaaa'
    ajax({
      method: 'GET',
      url: baseURL + '/getmessage',
      data: {
        id: 11
      },
      success: function (res) {
        console.log(res);
      }
    })

02-封装的方法

// 封装ajax/
    function ajax(options) {
      // 1.创建
      var xhr = new XMLHttpRequest()
      // 2.绑定事件
      xhr.onreadystatechange = function () {
        if (xhr.readyState == 4 && xhr.status == 200) {
          let obj = JSON.parse(xhr.response)
          options.success(obj)
        }
      }
      // 处理参数 Object => String
      let qs = objectToString(options.data)

      // 判断请求方式
      if (options.method.toUpperCase() == 'GET') {
        // 3.设置请求方式和资源路径
        xhr.open('GET', options.url + '?' + qs)
        // 4.发送
        xhr.send()

      } else if (options.method.toUpperCase() == 'POST') {
        // 3.设置请求方式和资源路径 + 请求头
        xhr.open('GET', options.url + '?' + qs)
        xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded")
        // 4.发送
        xhr.send()
      }
    }
    // 封装函数把对象转换成字符串
    let objectToString = (obj) => Object.keys(obj).map((item) => item + '=' + obj[item]).join('&')

注释:

1.onreadystatechange:存有处理服务器响应的函数,每当 readyState 改变时,onreadystatechange 函数就会被执行。

2.readyState:存有服务器响应的状态信息。

  • 0: 请求未初始化(代理被创建,但尚未调用 open() 方法)
  • 1: 服务器连接已建立(open方法已经被调用)
  • 2: 请求已接收(send方法已经被调用,并且头部和状态已经可获得)
  • 3: 请求处理中(下载中,responseText 属性已经包含部分数据)
  • 4: 请求已完成,且响应已就绪(下载操作已完成)