原生 ajax 封装

振振有辞
• 阅读 5292

一、AJAX 简介

  • AJAX 全称为 Asynchronous Javascript And XML,就是异步的 JS 和 XML。
  • 通过 AJAX 可以在浏览器中向服务器发送异步请求,最大的优势:无刷新获取数据。
  • AJAX 不是新的编程语言,不是新的一门独立的技术,而是一种使用现有标准的新方法。

二、AJAX 的工作原理

  • Ajax 的工作原理相当于在用户和服务器之间加了一个中间层(Ajax 引擎),使用户操作与服务器响应异步化。

三、AJAX 的特点

  • AJAX 的优点

    1. 可以无需刷新页面而与服务器端进行通信。
    2. 允许你根据用户事件来更新部分页面内容。
  • 缺点

    1. 没有浏览历史,不能回退
    2. 存在跨域问题
    3. SEO 不友好

四、基本使用

// 1.创建XMLHttpRequest对象
let xhr
if (window.XMLHttpRequest) {
  xhr = new XMLHttpRequest()
} else if (window.ActiveObject) {
  // 兼容IE6以下版本
  xhr = new ActiveXobject('Microsoft.XMLHTTP')
}

// 2.设置请求信息
xhr.open('get', 'http://localhost:3000/test_get')

// 3.发送请求
xhr.send() // get请求不传body参数,只有post请求使用
/*
      4.接收响应
        - xhr.responseXML 接收xml格式的响应数据
        - xhr.responseText 接收文本格式的响应数据
*/
xhr.onreadystatechange = function () {
  /*
          xhr.readyState 可以用来查看请求当前的状态
            0: 对应常量UNSENT,表示XMLHttpRequest实例已经生成,但是open()方法还没有被调用。
            1: 对应常量OPENED,表示send()方法还没有被调用,仍然可以使用setRequestHeader(),设定HTTP请求的头信息。
            2: 对应常量HEADERS_RECEIVED,表示send()方法已经执行,并且头信息和状态码已经收到。
            3: 对应常量LOADING,表示正在接收服务器传来的body部分的数据,如果responseType属性是text或者空字符串,responseText就会包含已经收到的部分信息。
            4: 对应常量DONE,表示服务器数据已经完全接收,或者本次接收已经失败了
        */
  if (xhr.readyState == 4) {
    let status = xhr.status
    if ((status >= 200 && status < 300) || status == 304) {
      options.success && options.success(xhr.responseText, xhr.responseXML)
    } else {
      options.error && options.error(status)
    }
  }
}

五、解决 IE 缓存问题

  • 问题:在一些浏览器中(IE),由于缓存机制的存在,ajax 只会发送的第一次请求,剩余多次请求不会在发送给浏览器而是直接加载缓存中的数据。
  • 解决方式:浏览器的缓存是根据 url 地址来记录的,所以我们只需要修改 url 地址即可避免缓存问题
xhr.open('get', 'http://localhost:3000/test_get' + Date.now())

六、AJAX 封装

// 格式化请求参数
function formatParams(data) {
  let arr = []
  for (let name in data) {
    arr.push(encodeURIComponent(name) + '=' + encodeURIComponent(data[name]))
  }
  arr.push(('v=' + Math.random()).replace('.', ''))
  return arr.join('&')
}
function ajax(options) {
  options = options || {} // 调用函数时如果options没有指定,就给它赋值{},一个空的Object
  options.method = (options.method || 'GET').toUpperCase() // 请求格式GET、POST,默认为GET
  options.dataType = options.dataType || 'json' // 响应数据格式,默认json
  options.timeout = options.timeout || 30000
  let params = formatParams(options.data) // options.data请求的数据
  let xhr
  // 考虑兼容性
  if (window.XMLHttpRequest) {
    xhr = new XMLHttpRequest()
  } else if (window.ActiveObject) {
    // 兼容IE6以下版本
    xhr = new ActiveXobject('Microsoft.XMLHTTP')
  }

  // 启动并发送一个请求
  if (options.method == 'GET') {
    xhr.open('get', options.url + '?' + params, true)
    xhr.send(null)
  } else if (options.method == 'POST') {
    xhr.open('post', options.url, true)
    // 设置表单提交时的内容类型
    // Content-type数据请求的格式
    xhr.setRequestHeader('Content-type', 'application/x-www-form-urlencoded')
    xhr.send(params)
  }

  // 设置有效时间
  setTimeout(function () {
    if (xhr.readySate != 4) {
      xhr.abort()
    }
  }, options.timeout)
  /*
    接收
    options.success成功之后的回调函数  options.error失败后的回调函数
    xhr.responseText,xhr.responseXML  获得字符串形式的响应数据或者XML形式的响应数据
  */
  xhr.onreadystatechange = function () {
    if (xhr.readyState == 4) {
      let status = xhr.status
      if ((status >= 200 && status < 300) || status == 304) {
        options.success && options.success(xhr.responseText, xhr.responseXML)
      } else {
        options.error && options.error(status)
      }
    }
  }
}
//基本的使用实例
ajax({
  url: 'http://localhost:3000/test_get',
  method: 'get',
  data: {
    name: 'name',
    age: 24,
  },
  success: function (data) {
    console.log(data, 'asdasdsa')
  },
})

七、get/post

  • 可以使用前面封装的 ajax 函数
function get(url, data, callback) {
  ajax({
    url,
    method: 'get',
    data,
    success(result) {
      callback(result)
    },
  })
}
function post(url, data, callback) {
  ajax({
    url,
    data,
    method: 'post',
    success(result) {
      callback(result)
    },
  })
}

// 测试 get
get('http://localhost:3000/test_get', { name: 'name', age: 24 }, function (
  data
) {
  console.log(data, 'get')
})
// 测试 post
post('http://localhost:3000/test_post', { name: 'name', age: 24 }, function (
  data
) {
  console.log(data, 'post')
})
点赞
收藏
评论区
推荐文章
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
Wesley13 Wesley13
4年前
java将前端的json数组字符串转换为列表
记录下在前端通过ajax提交了一个json数组的字符串,在后端如何转换为列表。前端数据转化与请求varcontracts{id:'1',name:'yanggb合同1'},{id:'2',name:'yanggb合同2'},{id:'3',name:'yang
Wesley13 Wesley13
4年前
java第五周
AJAX的工作原理及其工作原理:1.定义及工作原理  AJAXAsynchronousJavaScriptandXML(异步的JavaScript和XML)。AJAX不是新的编程语言,而是一种使用现有标准的新方法。AJAX不需要任何浏览器插件,但需要用户允许JavaScript在浏览器上执行。  AJAX是一种用于
Stella981 Stella981
4年前
AjaxPro.dll,asp.net 前台js调用后台方法(无刷新)
1、什么是AjaxAjax是异步Javascript和XML(AsynchronousJavaScriptandXML)的英文缩写。"Ajax"这个名词的发明人是JesseJamesGarrett,而大力推广并且使Ajax技术炙手可热的是Google。Ajax的核心理念在于使用XMLHttpRequest对象发送异步请求。
Stella981 Stella981
4年前
Ajax各个参数的说明
Ajax各个参数的说明$.ajax({     url: "http://www.hzhuti.com",    //请求的url地址     dataType: "json",   //返回格式为json     async: true, //请求是否异步,默认为异步,这也是ajax重要特性   
Stella981 Stella981
4年前
AJAX与Django
AJAX什么是AJAX?AJAX不是JavaScript的规范,它的缩写:AsynchronousJavaScriptandXML,意思就是用JavaScript执行异步网络请求。提交任务之后,不原地等待,直接执行下一行代码,任务的返回通过回调机制。局部刷新,不整体刷新,而是界面莫个地方局部刷新AJAX原理
Stella981 Stella981
4年前
Django框架 之 Ajax
Django框架之Ajax浏览目录AJAX准备知识AJAX与XML的比较AJAX简介jQuery实现的ajaxAJAX参数AJAX请求如何设置csrf\_token序列化
Easter79 Easter79
4年前
SpringBoot2.x服务器端主动推送技术
一.服务端推送常用技术介绍  服务端主流推送技术:websocket、SSE等  1.客户端轮询:ajax定时拉取后台数据    js  setInterval定时函数  ajax异步加载 定时向服务器发送请求    服务器压力会较大  2.服务端主动推送:websocket《推荐使用》    全双工即双向通讯,本质上是一个
Stella981 Stella981
4年前
Django的日常
\toc\Django的日常AJAXAJAX简介首先AJAX是一种无需重新加载整个网页的前提下,能够更新部分网页的技术,他并不是一种新的编程语言,而是一种使用现有标准的新方法,是基于原生JavaScript开发的,他可以用于创建快速动态网页.AJAX最大的特点就是局部刷新以及异步提交,局部刷新
Stella981 Stella981
4年前
Ajax快速入门
最近需要使用ajax,json传数据,快速学习了下ajax,把基本的东西拿出来分享一下,打算以问题的形式来进行文章的编写~go!(一)什么是Ajax?Ajax是一种无需加载整个网页,快速刷新局部网页的技术。Ajax不是新的编程语言,而是一些老技术的融合。(二)Ajax用到了什么技术?异步数据获取技术:使用XMLHttpReques
Stella981 Stella981
4年前
Ajax异步请求
Ajax即"AsynchronousJavascriptAndXML"(异步JavaScript和XML),是指一种创建交互式网页应用的网页开发技术。Ajax异步JavaScript和XML(标准通用标记语言的子集)。通过在后台与服务器进行少量数据交换,Ajax可以使网页实现异步更新。这意味着可以在不重新加载整个网页的情况