手动封装一个ajax

Posted 忆站

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了手动封装一个ajax相关的知识,希望对你有一定的参考价值。


我们尝试封装一个ajax,形如函数的形式。


首先我们创建ajax对象和构建默认配置

let xhrif (window.XMLHttpRequest) { xhr = new XMLHttpRequest()} else if (window.ActiveObject) { //兼容IE6以下版本 xhr = new ActiveXobject('Microsoft.XMLHTTP')}
let defaults = { type: 'get', url: '', data: { }, header: { // 表单默认的提交数据的格式 'Content-type': 'application/x-www-form-urlencoded', }, success: function () {}, error: function () {},}
 this.options = Object.assign(defaults, options)


最后我们处理发送请求:

  • 区分get和post请求传参格式

  • 请求时根据配置动态设置请求头信息

  • 处理响应,根据状态码区分

// 获取get参数形式function getParams(data) { let params = '' for (let item in data) { params += `${item}=${data[item]}&` } let length = params.length return params.substr(0, length - 1)}
let getStr = getParams(options.data)// 设置请求头部配置function setHeader (data) { for (let item in data) { xhr.setRequestHeader(item, data[item])  }}// 处理参数传递和方法if (options.type === 'get') { xhr.open('get', options.url + '?' + getStr, true) // setHeader(options.header) xhr.send()} else if (options.type === 'post') { xhr.open('post', options.url, true) setHeader(options.header) xhr.send(params)} else { options.error('暂不支持除get和post以外的请求') return}
xhr.onreadystatechange = function () { if (xhr.readyState === 4) { let status = xhr.status if ((status >= 200 && status < 300) || status == 304) { options.success(xhr.responseText, xhr.responseXML) } else { options.error(status) } }}


然后我们使用开头的图片代码请求服务器接口

// 服务器代码const express = require('express')const app = express()
app.get('/jsonp', function (req, res) { let name = req.query.name res.setHeader('Access-Control-Allow-Origin', 'http://127.0.0.1:8081') let data = { name: name, msg: '操作成功', state: 200  } res.send(data)})
app.listen(3000, () => { console.log('Server running at http://127.0.0.1:3000')})


最终代码如下:

function ajax(options) { let xhr if (window.XMLHttpRequest) { xhr = new XMLHttpRequest() } else if (window.ActiveObject) { //兼容IE6以下版本 xhr = new ActiveXobject('Microsoft.XMLHTTP') }
let defaults = { type: 'get', url: '', data: { }, header: { // 表单默认的提交数据的格式 'Content-type': 'application/x-www-form-urlencoded', }, success: function () {}, error: function () {}, }
// 合并配置项 this.options = Object.assign(defaults, options)
debugger // 获取get参数形式 function getParams(data) { let params = '' for (let item in data) { params += `${item}=${data[item]}&` } let length = params.length return params.substr(0, length - 1) } let getStr = getParams(options.data)

// 设置请求头部配置 function setHeader (data) { for (let item in data) { xhr.setRequestHeader(item, data[item]) }
} // 处理参数传递和方法 if (options.type === 'get') { xhr.open('get', options.url + '?' + getStr, true) setHeader(options.header) xhr.send() } else if (options.type === 'post') { xhr.open('post', options.url, true) setHeader(options.header) xhr.send(params) } else { options.error('暂不支持除get和post以外的请求') return }
xhr.onreadystatechange = function () { if (xhr.readyState === 4) { let status = xhr.status if ((status >= 200 && status < 300) || status == 304) { options.success(xhr.responseText, xhr.responseXML) } else { options.error(status) } } }}


以上是关于手动封装一个ajax的主要内容,如果未能解决你的问题,请参考以下文章

VSCode自定义代码片段14——Vue的axios网络请求封装

VSCode自定义代码片段14——Vue的axios网络请求封装

html PHP代码片段: - AJAX基本示例:此代码演示了使用PHP和JavaScript实现的基本AJAX功能。

回归 | js实用代码片段的封装与总结(持续更新中...)

AJAX相关JS代码片段和部分浏览器模型

Ajax方法封装