美文网首页
Ajax的理解与实现

Ajax的理解与实现

作者: 喑宝儿 | 来源:发表于2021-05-28 18:53 被阅读0次
1、XMLHttpRequest对象(xhr):浏览器提供的JS对象,可以请求服务器上的数据。
2、使用xhr发送get请求

(1)创建xhr对象:一个请求的主体

(2)调用xhr.open()函数,参数分别为:请求类型和请求地址

(3)调用send(),发起请求

(4)监听事件:onreadystatechange(请求状态被改变时)

  • 请求状态:readyState(4)
  • 响应状态:status(200)
var xhr = new XMLHttpRequest()
xhr.open(请求类型, URL地址)
xhr.send()
xhr.onreadystatechange = function() {
  if (xhr.readyState == 4 && xhr.status == 200) {
    console.log(xhr.responseText)
  }
}
3、xhr对象的readyState属性:当前Ajax请求所处的状态
0 UNSENT XMLHttpRequest对象已被创建,但未调用open方法
1 OPENED open方法已调用
2 HEADERS_RECEIVED send方法已调用,响应头已经被接收
3 LOADING 数据接受中,此时response属性中已经包含部分数据
4 DONE Ajax请求完成,数据已经彻底完成或失败
4、使用xhr对象发起带参数的get请求

(1)为URL地指定参数即可,URL拼接到后面的参数被称为“查询字符串”

(2)查询字符串参数的格式为:在URL之后添加问号(?),参数以键值对方式存在(name=zs),多个参数键值对之间使用&符号进行分隔(name=zs&age=18)

(3)get请求方式的本质,需要携带参数时,都是以查询字符串的方式提交参数

var xhr = new XMLHttpRequest()
xhr.open('get', '请求路径?id=1')
xhr.send()
xhr.onreadystatechange = function() {
  if (xhr.readyState == 4 && xhr.status == 200) {
    console.log(xhr.responseText)
  }
}
5、URL编码(URL只包括英文字母、符号、数字)

(1)中文需要编码(转义)

(2)编码原则:使用安全字符(英文字符等)表示不安全字符(中文等),中文字符使用英文字符表示的话是三组%

(3)对URL编码与解码

  • 编码:encodeURI(要编码的内容)

  • 解码:decodeURI(要解码的内容)

  • 浏览器会自己对中文进行编码和解码

var str = '床前明月光'
str1 = encodeURI(str)
console.log(str1)  // %E5%BA%8A%E5%89%8D%E6%98%8E%E6%9C%88%E5%85%89

str2 = decodeURI(str1)
console.log(str2)  // 床前明月光
6、使用xhr发起post请求

(1)创建xhr对象

(2)调用open()函数,指定请求方式和URL地址

(3)调用setRequestheader(),设置Content-Type属性(固定写法,必须写在open之后)

(4)xhr.send(),指定要发送的数据

var xhr = new XMLHttpRequest()
xhr.open('post', '请求路径')
xhr.setRequestheader('Content-Type', 'application/x-www-form-urlencoded')
xhr.send('数据=值&数据=值)
xhr.onreadystatechange = function() {
  if (xhr.readyState == 4 && xhr.status == 200) {
    console.log(xhr.responseText)
  }
}
7、数据交换格式

服务器端返回的数据格式是字符串,为了更好的提取返回的信息,返回的字符串有一些特定的格式:XML、JSON

  • XML:标签格式
  • JSON:像数组、对象的格式
8、XML可扩展的标记语言

HTML和XML没有关系

HTML是网页内容的载体,XML是用来传输数据的,是数据的载体

<note>
  <to>ls</to>
  <from>zs</from>
  <heading>通知</heading>
  <body>开会</body>
</note>
  • XML缺点:格式臃肿,和数据无关代码多,传输效率低;在JS中解析XML比较麻烦
9、JSON(本质是字符串,是一种具有对象或者数组格式的字符串,也是一种轻量级的文本数据交换格式,更小更快更易解析)

(1)JSON的两种结构:

数组&字符串(key必须用英文双印包裹,value只有数字、字符串、布尔值、null、数组、对象6种类型);数组取值也只有这6种类型

(2)JSON语法注意事项

属性名必须使用双引号包裹;字符串都必须使用双引号;JSON中不能写注释;JSON最外层必须是数组或对象格式;JSON中不允许有undefined和函数等数据

(3)(序列化)JSON字符串转化为JS对象:JSON.parse(json字符串)

var str = '{"a": "hello", "b": "world"}'
console.log(JSON.parse(str))  // {a: "hello", b: "world"}

(4)(反序列化)JSON对象转化为JSON字符串:JSON.stringify(js对象)

var str = {a: "hello", b: "world"}
console.log(JSON.stringify(str))  // {"a":"hello","b":"world"}
10、自己封装简易Ajax
function ajax(options) {
  var xhr = new XMLHttpRequest()
  var qs = resolveData(options.data)

  if (options.method.toUpperCase() === 'GET') {
    xhr.open(options.method, options.url + (options.data ? '' : '?' + qs))
    xhr.send()
  } else if (options.method.toUpperCase() === 'POST') {
    xhr.open(options.method, options.url)
    xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded')
    xhr.send(qs)
  }
  
  xhr.onreadystatechange = function () {
    if (xhr.readyState === 4 && xhr.status === 200) {
      var result = JSON.parse(xhr.responseText)
      options.success(result)
    }
  }
}


function resolveData(data) {
  var arr = []
  for (let k in data) {
    arr.push(k + '=' + data[k])
  }
  return arr.join('&')
}
11、XMLHttpRequest Level2

(1)新功能:可以设置HTTP请求时限;可使用FormData对象管理表单数据;可以上传文件;可以获取数据传输的进度信息

(2)设置http请求时限(timeout属性)

// 设置请求时限为3000毫秒,如果超过3000毫秒,默认请求失败
xhr.timeout = 3000
// 请求超时后,会触发超时回调函数,告诉用户请求超时
xhr.ontimeout = function(event) {
  alert('请求超时了')
}

(2)FormData对象管理表单数据

// post请求
// 创建FormData实例
var fd = new FormData()
// 向FormData中手动追加数据
fd.append('name', 'zs')
fd.append('age', '20')
// ……(发送请求的准备工作)

// 发送请求传数据直接传入fd
xhr.send(fd)
/** 直接获取表单数据 */
var fd = new FormData(form表单的DOM元素)
xhr.send(fd)
var fd = new FormData()
// 向fd中添加数据
fd.append('name', 'zs')
// fd.get(数据名)  获取表单fd中对应的值
console.log(fd.get('name')) // zs
// 给一个键值对添加多个值
fd.append('name', 'ls')
// fd中一个数据有多个值时,fd.get(数据名)获取到第一个值
console.log(fd.get('name')) // zs
// fd中获取同一个数据的多个值时:fd.getAll(数据名)
console.log(fd.getAll('name')) // ['zs', 'ls']
// 使用set可重置fd中对应数据的值
fd.set('name', 'ww')
console.log(fd.get('name')) // ww
// 删除fd中某个元素
fd.delete('name')
console.log(fd.get('name')) // null

(3)上传文件功能:

定义UI结构;

验证是否选择了文件;

向FormData中追加文件;

使用xhr进行上传文件请求;

监听onreadystatechange

  • 获取表单提交的文件:dom.files,如果有文件选中,则长度不为0

(4)显示文件上传进度:监听xhr.upload.onprogress事件

e.lengthComputable 若为true,才可计算长度

e.loaded 已经传输的字符

e.total 需传输的总字节

传输进度 = Math.ceil(e.loaded / e.total * 100) + '%'

(5)jquery实现文件上传

上传文件时必须要设置两个参数:

// 是否转化为查询字符串
processData: false,
// 发送到服务器端的数据类型
contentType: false,

可用ajaxStart和ajaxStop设置加载效果

  • ajaxStart():请求开始时运行的函数(只能被$(document)调用)

  • ajaxStop():请求完成时运行的函数(只能被$(document)调用)

也可用beforeSend和complete代替,更好用

12、axios:网络数据请求,比jquery更轻量,只专注于网络请求

(1)axios发起get请求

axios.get('url', { params: { /*参数*/ } }).then(callback)

(2)axios发起post请求

axios.post('url', { data: { /*参数*/ } }).then(callback)

(3)直接使用axios发送请求

axios({
  method: 请求方式,
  url: 请求的URL地址,
  data: 请求发送的数据
}).then(function(res) {
  /* 数据处理 */
})

相关文章

  • Ajax的理解与实现

    1、XMLHttpRequest对象(xhr):浏览器提供的JS对象,可以请求服务器上的数据。 2、使用xhr发送...

  • ajax

    一、ajax概念: 异步与同步 实现 ajax:1.各种类库和框架实现 后端jsonp处理: 例如: echo ...

  • 原生js实现ajax及get post方法

    @拭目以待:首发于原生js实现ajax及get post方法 ajax原生实现,含 post与get方法。原码如下...

  • 【JS】由ECMA规范学习ajax和promise

    什么是异步操作? Ajax 异步JavaScript与XML(AJAX)是一个专用术语,用于实现在客户端脚本与服务...

  • Ajax核心四步操作

    AJAX 引入:你是如何理解AJAX的? AJAX(Asynchronous Javascript And XML...

  • jQuery-ajax-get()方法

    jQuery ajax-get方法 通过ajax的get请求来改变div里面的文本内容;与load方法实现的效果差...

  • ajax学习总结

    1、什么是ajax? ajax是一种可以不刷新页面,而实现与服务端通信的的方式,使用ajax的主要方式是XMLHt...

  • ajax异步模式下实现同步和等待loading效果(jQuery

    ajax异步模式下实现同步和等待loading效果(jQuery同步Ajax带来的UI线程阻塞问题及解决办法)在与...

  • Ajax异步请求[17.7.10]

    Ajax异步请求 Ajax全称为Asynchronous Javascript and XML。通过Ajax实现了...

  • react 第四章—— ajax

    1.理解: React本身只关注于界面, 并不包含发送ajax请求的代码前端应用需要通过ajax请求与后台进行交互...

网友评论

      本文标题:Ajax的理解与实现

      本文链接:https://www.haomeiwen.com/subject/kzzssltx.html