原生 ajax 封装

一、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')
})
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 使用原生 JavaScript 封装 ajax 可以这样做: ``` function ajax(method, url, data, success) { var xhr = new XMLHttpRequest(); xhr.open(method, url, true); xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); xhr.onreadystatechange = function() { if (xhr.readyState == 4) { if (xhr.status == 200) { success(xhr.responseText); } else { console.error(xhr.statusText); } } }; xhr.send(data); } ``` 使用方式: ``` ajax( "POST", "/login", "username=admin&password=123456", function(responseText) { console.log(responseText); } ); ``` 其中,method 为请求的方法(POST 或 GET),url 为请求的地址,data 为请求的数据,success 为请求成功时的回调函数。 ### 回答2: 原生js封装Ajax主要由以下几个步骤: 1. 创建一个XMLHttpRequest对象。可以使用var xhr = new XMLHttpRequest();语句来创建一个XMLHttpRequest对象。 2. 设置请求的方法和URL。使用xhr.open(method, url, async)方法来设置请求的方法、URL和是否异步,其中method为请求方法(例如GET或POST),url为请求的URL,async表示是否异步(true为异步,false为同步)。 3. 设置请求的头部信息。使用xhr.setRequestHeader(header, value)方法来设置请求头部信息,可根据需要设置Content-Type、Authorization等等。 4. 监听请求状态变化。使用xhr.onreadystatechange = function(){}语句监听请求状态的变化,当请求状态发生变化时,执行相应的处理。 5. 发送请求。使用xhr.send(data)方法发送请求,其中data为请求的数据,可以为null或者是一个字符串。 6. 处理返回结果。在监听请求状态变化的函数中,根据请求的状态和返回的结果进行相应的处理。例如,当请求状态为4且状态码为200时,表示请求成功,可以通过xhr.responseText获取响应的数据。 7. 销毁XMLHttpRequest对象。请求完成后,使用xhr = null;语句将XMLHttpRequest对象置为空,以便释放内存。 通过以上步骤,就可以封装一个基本的Ajax函数。可以根据需要添加错误处理、超时设置、数据格式转换等功能,以满足不同场景的需求。 ### 回答3: 在原生JavaScript封装Ajax可以通过XMLHttpRequest来实现。下面是一个简单的Ajax封装函数的示例: ```javascript function ajax(method, url, data, callback) { var xhr = new XMLHttpRequest(); xhr.onreadystatechange = function() { if (xhr.readyState === 4 && xhr.status === 200) { callback(xhr.responseText); } }; xhr.open(method, url, true); if (method === 'POST') { xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); } xhr.send(data); } ``` 上述函数接受四个参数:请求方法(method)、请求URL(url)、请求数据(data)和回调函数(callback)。其中,method参数可以是'GET'或者'POST',url参数是请求的目标URL,data参数是要发送的数据(如果是'POST'请求),callback参数是请求成功后要执行的回调函数。 函数内部创建了一个XMLHttpRequest对象,并通过onreadystatechange事件监听请求的状态变化。当请求状态为4且状态码为200时,表示请求已完成,可以获取到返回的数据,此时调用回调函数。 使用open方法打开请求,参数为请求方法、URL和是否异步请求。如果是POST请求,还需要调用setRequestHeader方法设置请求头的Content-Type。 最后,调用send方法发送请求数据。根据请求方法不同,send方法的参数也不同。 通过上述封装,可以方便地使用原生JavaScript进行Ajax请求,并根据请求结果执行相应的操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值