原生ajax

1、什么是ajax

  ajax是Asynchronous Java and XML的缩写,是一种异步请求数据的web开发技术,在不需要重新刷新页面的情况下,ajax通过异步请求加载后台数据,并在网页上呈现出来

2、ajax使用场景

  异步请求:登录、列表页、详情页、搜索下拉框……页面中涉及到数据的都用到ajax去请求后端数据

3、ajax原理

  ①浏览器让xhr去服务器要点儿数据

  ②浏览器接着干别的事

  ③xhr去服务器请求数据

  ④服务器放回数据给xhr

  ⑤xhr通知浏览器数据拿回来了

  ⑥浏览器就收到xhr请求的数据渲染页面,整个过程中页面在没有刷新的情况下完成

4、readyState状态码和status状态码

  readyState:返回当前文档的载入状态

    0:未初始化,还没有调用 send() 方法

    1:载入,已调用 send() 方法,正在发送请求

    2:载入完成,send() 方法执行完成,已经接收到全部响应内容

    3:交互,正在解析响应内容

    4:完成,响应内容解析完成,可以在客户端调用了

  

  status:http状态码

    1xx:信息性状态码,表示接收的请求正在处理

    2xx:成功状态码,表示请求正常处理

    3xx:重定向状态码,表示需要附加操作来完成请求

    4xx:客户端错误状态码,表示服务器无法处理请求

    5xx:服务器错误状态码,表示服务器处理请求出错

5、get和post传参

    // get请求时参数接在地址栏后面
    let xhr=new XMLHttpRequest()
    xhr.open('GET','http://xxxxx/list?page=5')
    xhr.send()
    // post请求时参数在send()中传递
    let xhr=new XMLHttpRequest()
    xhr.open('POST','http://xxxxx/list')
    xhr.send('page=5&pageSize=10')

6、原生js封装ajax

复制代码
    function ajax(options) {
      options = options || {}  // 调用函数时如果options没有指定,就给它赋值{},一个空的Object
      options.type = (options.type || 'GET').toUpperCase() // 请求格式GET、POST,默认为GET
      options.dataType = options.dataType || 'json' // 响应数据格式,默认json
      var params = formatParams(options.data) // options.data请求的数据
      var xhr
      //考虑兼容性
      if (window.XMLHttpRequest) {
        xhr = new XMLHttpRequest()
      } else if (window.ActiveObject) {//兼容IE6以下版本
        xhr = new ActiveXobject('Microsoft.XMLHTTP')
      }
      xhr.addEventListener('load', handleFn) // Firefox 支持 load 事件
      xhr.addEventListener('readystatechange', handleFn) // IE 支持 readystatechange 事件
      //启动并发送一个请求
      if (options.type == 'GET') {
        xhr.open('GET', options.url + '?' + params, true)
        xhr.send(null)
      } else if (options.type == 'POST') {
        xhr.open('post', options.url, true)
        xhr.setRequestHeader('Content-type', 'application/x-www-form-urlencoded') // Content-type数据请求的格式
        xhr.send(params)
      }
      // 设置有效时间
      setTimeout(function () {
        if (xhr.readySate != 4) {
          xhr.abort()
        }
      }, options.timeout)
      // 接收
      function handleFn() {
        if (xhr.readyState == 4) {
          var status = xhr.status
          if (status >= 200 && status < 300 || status == 304) {
            options.success && options.success(xhr.responseText, xhr.responseXML) // options.success成功之后的回调函数    xhr.responseText,xhr.responseXML  获得字符串形式的响应数据或者XML形式的响应数据
          } else {
            options.error && options.error(status) // options.error失败后的回调函数
          }
        }
      }
    }

    //格式化请求参数
    function formatParams(data) {
      var arr = []
      for (var name in data) {
        arr.push(encodeURIComponent(name) + '=' + encodeURIComponent(data[name]))
      }
      arr.push(('v=' + Math.random()).replace('.', ''))
      return arr.join('&')
    }
复制代码

使用:

复制代码
    ajax({
      url: 'https://api.apiopen.top/getJoke',
      type: 'get',
      data: {
        // username:'username',
        // password:'password'
      },
      dataType: 'json',
      timeout: 5000,
      // contentType: 'application/json',
      success: function (data) {
        console.log(data)
      },
      error: function (e) {
        console.error(e)
      }
    })
复制代码

 

7、promise封装简易版ajax

复制代码
      function ajax(url) {
        const promise = new Promise((res, rej) => {
          const xhr = new XMLHttpRequest()
          xhr.open('get', url, true) // true表示为异步请求
          xhr.onreadystatechange = function () {
            if (xhr.readyState === 4) {
              if (xhr.status === 200) {
                res(JSON.parse(xhr.responseText))
              } else {
                rej(new Error('请求失败'))
              }
            }
          }
          xhr.send(null)
        })
        return promise
      }
复制代码

  使用:

    同目录下新建data.json

{
  "name": "xx",
  "age": 18
}

    调用函数,then方法中接收

      const url = './data.json'
      ajax(url).then((data) => {
        console.log(data)
      })

     使用async/await

      const fn = async () => {
        const url = 'https://api.apiopen.top/getJoke'
        const { code, message, result } = await ajax(url)
        console.log(code, message, result)
      }
      fn()

 

posted @   吴小明-  阅读(303)  评论(0编辑  收藏  举报
编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 提示词工程——AI应用必不可少的技术
· 字符编码:从基础到乱码解决
· 地球OL攻略 —— 某应届生求职总结
点击右上角即可分享
微信分享提示