目标
能够知道如何使用XMLHttpREquest发起Ajax请求
能够知道如何封装自己的Ajax函数
能够使用XMLHttpREquest Level 2中提供的新特性
能够知道jQuery中如何实现文件上传与loading效果
能够知道如何使用axios发起Ajax请求
1.XMLHttpREquest的基本使用
1.1 什么XMLHttpREquest
XMLHttpREquest(简称xhr)是浏览器提供的javascript对象,通过它,
可以请求服务器上的数据资源.之前所学的jQuery中的Ajax函数
xhr对象封装出来的
1.2使用xhr发起GET请求
步骤
1创建xhr对象
2调用xhr.open()函数
3调用xhr.send()函数
4监听xhr.onreadystatechange事件
//1创建xhr对象
var xhr = new XMLHttpRequest()
// 2调用xhr.open()函数
xhr.open('GET', 'http://www.liulongbin.top:3006/api/getbooks')
// 3调用xhr.send()函数
xhr.send()
// 4监听xhr.onreadystatechange事件
xhr.onreadystatechange = function () {
if (xhr.readyState === 4 && xhr.status === 200) {
// 获取服务器响应 readyState有四个状态 4表示成功
console.log(xhr.readyState);
}
}
readystate表示你发送ajax给服务器端是否成功
4代表服务器端成功接收
status表示服务器端收到你的ajax请求如何处理。
200代表服务器端处理ajax请求并且发送给你想要的数据
1.3 了解xhr对象的readyState属性
XMLHttpREquest对象的readyState属性,用来表示当前Ajax请求所处的状态.
每个Ajax请求必然处于以下状态中的一个:
值 状态 说明
0 UNSENT XMLHttpREquest对象已被创建 但未调用poen方法
1 OPENDED open()方法已经被调用
2 HEADERS_RECEIVED send()方法已经被调用,响应头也已经被接收
3 LOADING 数据接收中,此时response属性中已经包含部分数据
4 DONE Ajax请求完成,这意味着数据传输已经彻底完成或失败
1.4 使用xhr发起带参数的GET请求
使用xhr对象发起带参数的GET请求时,只需在调用xhr.open期间,为URL地址指定参数
xhr.open('GET', 'http://www.liulongbin.top:3006/api/getbooks'?id=1)
这种在URL地址后面拼接的参数,叫做查询字符串.
1.5 查询字符串
1. 什么是查询字符串
定义:查询字符串(URL参数)是指在URL的末尾加上用于向服务器发送信息的字符串(变量)
格式:将英文的?放在URL的末尾,然后加上参数=值,想加上多个参数的话,使用&符号进行分解
以这个形式,可以将想要发送给服务器的数据添加到URL中
不带参数的URL地址
http://www.liulongbin.top:3006/api/getbooks
带一个参数的URL地址
http://www.liulongbin.top:3006/api/getbooks?id=1
带两个参数的URL地址
http://www.liulongbin.top:3006/api/getbooks?id=1&bookname=西游记
2.GET请求携带参数的本质
无论使用$.ajax(),还是使用$.get(),又或者直接使用xhr对象发送GET请求,当需要携带参数的时候
本质上,都是直接将参数以查询字符串的形式,追加到URL地址的后面,发送到服务器的
1.6 URL编码与解码
1.什么是URL编码
URL地址中,只允许出现英文相关的字母、标点符号、数字。
在URL地址中不允许出现中文字符
如果URL需要包含中文这样的字符,则必须对中文字符进行编码(转义)
URL编码的原则:
使用安全的字符(没有特殊用途或者特殊意义的可以打印字符)去表示哪些不安全的字符
通俗URL编码原则:使用英文字符去表示非英文字符
例子:
http://www.liulongbin.top:3006/api/getbooks?id=1&bookname=西游记
经过URL编码之后,URL地址变成了如下格式;
http://www.liulongbin.top:3006/api/getbooks?id=1&bookname=%E8%A5%BF%E6%B8%B8%E8%AE%B0
2.如何对URL进行编码与解码
浏览器提供了URL编码与解码的API,分别是:
encodeURI()编码的函数
decodeURI()解码的函数
1.7 使用xhr发起POST请求
步骤:
1.创建xhr对象
2.调用xhr.open()函数
3.设置Content-Type属性(固定位置在在第三个)
4.调用xhr.send()函数,同时指定要发送的数据
5.监听xhr.onreadystatechange 事件
// 1.创建xhr对象
var xhr = new XMLHttpRequest()
// 2.调用open函数
xhr.open('POST', 'http://www.liulongbin.top:3006/api/adddbook')
// 3.设置 Content-Type属性
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoed')
// 4.调用send函数
xhr.send('bookname=水浒传&author=施耐庵&publisher=上海图书出版社')
// 5.监听事件
xhr.onreadystatechange = function () {
if (xhr.readyState === 4 && xhr.status === 200) {
console.log(xhr.responseText)
}
}
2.XML
1.什么是XML
XML的英文全称EXtensible Markup Language.即可扩能扩展标记语言
XML和HTML也是一种标记语言
<!DOCTYPE html> <note>
<html lang="en"> <to>ls</to>
<head> <from>zs</from>
<title>Document</title> <heading>通知</heading>
</head> <body>晚上开会</body>
</html>
HTML XML
2.XML和HTML的区别
XML和HTML虽然都是标记语言,但是两者之间没有任何关系
HTML被设计用来描述网页上的内容,是网页内容的载体
HTML被设计用来描述网页上的内容,是网页内容的载体
XML被设计用来传输和存储数据,是数据的载体
传输网页内容
服务器--------------->电脑
HTML
传输数据
服务器<--------------->电脑
XML
3. XML的缺点
<note>
<to>ls</to>
<from>zs</from>
<heading>通知</heading>
<body>晚上开会</body>
</note>
1.格式臃肿 和数据无关的代码多 体积大 传输效率低
2.在JS中解析XML比较麻烦
我的感觉:标签比数据还多
2.3JSON
1.什么是JSON
概念:JSON的英文全称JavaScript Object Notation,即JavaScript对象表示法。
JSON就是JavaScript对象和数组的字符串表示法,它使用文本表示一个JS对象或数组的信息
JSON的本质是字符串
作用:JSON是一种轻量级的文本数据交换格式,在作用上类似于XML,专门用于存储和传输数据
但是JSON比XML更小、更快、更易解析.
现状:JSON是在01年开始推广和使用的数据格式,到现在JSON成为了主流的数据交换格式
2.JSON的两种结构
JSON就是用字符串来表示Javascript的对象和数组。所有,JSON中包含对象和数组两种结构
通过两种结构的相互嵌套,可以表示各自复杂的数据结构
对象结构:在JSON中表示为{}括起来的内容.
数据结构为{key:value,key:value,....}的键值对结构。
key必须是使用英文的双引号包裹的字符串,
value的数据类型是数组、字符串、布尔值、null、数组、对象6种类型
{
name:'zx',
'age':20,
'gender':'男'
'address':undefined,
'hobby':["吃饭","吃饭","吃饭"]
'say':function(){
}
}
数据结构:数据结构在JSON中表示为[]括起来的内容。数据结构为["java","JS",30,true]
数组中数据的类型可以是数组、字符串、布尔值、null、数组、对象、
3.JSON语法注意事项
1.属性名必须使用双引号包裹
2.字符串类型的值必须使用双引号包裹
3.JSON中不允许使用单引号表示字符串
4.JSON中不能写注释
5.JSOn的最外层必须是对象或数组格式
6.不能使用undefined或函数作为JSON的值
JSON的作用:在计算机与网络之间存储和传输数据.
JSOn的本质:用字符串来表示Javascript对象数据或数组数据
4.JSON和JS对象的关系
JSON是JS对象的字符串表示法,它使用文本表示一个JS的信息,本质是一个字符串
这是一个对象
var obj={a:"Hello",b:"World"}
这是一个JSON字符串,本质是一个字符串
var json='{"a":"Hello","b":"World"}'
5.JSON和JS对象的互转
要实现从JSON字符串转换为JS对象,使用JSON.parse()方法:
var obj = JSON.parse("{"a":"Hello","b":"World"}")
结果是{a:"Hello",b:"World"}
要实现从JS对象转换为JSON字符串,使用JSON.stringify()方法:
var json=JSON.stringify({a:"Hello",b:"World"})
结果是'{"a":"Hello","b":"World"}'
6.序列化和反序列化
把数据对象转换为字符串的过程,叫做序列化,例如:调用JSON.stringify()函数的操作
把字符串转换为数据对象的过程,叫做反序列化,例如:调用JSON.parse()函数的操作
3.封装自己的Ajax函数
3.1 要实现的效果
function itheima(options) {
var xhr = new XMLHttpRequest()
var qs = resolveData(options.data)
// 传递过来的参数对象 转换为查询字符串
xhr.onreadystatechange = function () {
if (xhr.readyState === 4 && xhr.status === 200) {
var result = JSON.parse(xhr.responseText)
// 转换成JS对象
options.success(result)
}
}
}
3.2定义option参数选项
itheima()函数是自定义的Ajax函数,它接收一个配置对象作为参数,配置对象中可以配置如下属性
method 请求的类型
url 请求的URL地址
data 请求携带的数据
success 请求成功之后的回调函数
3.3处理data参数
需要把data对象,转化成查询字符串的格式,从而提交给服务器,因此提前定义resolveData函数
处理data参数
@param需要发送到服务器的数据
@returns返回拼接好的查询字符串
function itheima(options) {
var xhr = new XMLHttpRequest()
var qs = resolveData(options.data)
// 传递过来的参数对象 转换为查询字符串
xhr.onreadystatechange = function () {
if (xhr.readyState === 4 && xhr.status === 200) {
var result = JSON.parse(xhr.responseText)
// 转换成JS对象
options.success(result)
}
}
}
3.4 定义itheima函数
在itheima()函数中,需要创建xhr对象,并监听
function itheima(options) {
var xhr = new XMLHttpRequest()
var qs = resolveData(options.data)
// 传递过来的参数对象 转换为查询字符串
xhr.onreadystatechange = function () {
if (xhr.readyState === 4 && xhr.status === 200) {
var result = JSON.parse(xhr.responseText)
// 转换成JS对象
options.success(result)
}
}
}
3.5 判断请求的类型
不同的请求类型,对于xhr对象的不同操作,因此需要对请求类型进行if..else的判断
if (options.method.toUpperCase() === 'GET') {
// toUpperCase() 字母变大写功能 method只有两个值GET POST
// 发起GET请求
xhr.open(options.method, options.url + '?' + qs)
xhr.send()
} else if (options.method.toUpperCase() === 'POST') {
// 发起POST请求
xhr.open(options.method, options.url)
xhr.setRequestHeader('Content-type', 'application/-www-form-urlencoded')
xhr.
4.XMLHttpREquest Level2的新特性
4.1认识XMLHttpRequest Level2
1.旧版XMLHttpREquest的缺点
1.只支持文本数据的传输,无法用来读取和上传文件
2.传送和接收数据时,没有进度信息,只能提示有没有完成
2.XMLHttpREquest Level2的新功能
1.可以设置HTTP请求的时限
2.可以使用FormData对象管理表单数据
3.可以上传文件
4.可以获得数据传输的进度信息
4.2设置HTTP请求时限
Ajax操作很耗时,无法预知要花多少时间.网络慢要等很久
XMLHttpRequest对象,增加了timeout属性,可以设置HTTP请求的时限:
xhr.timeout = 3000
过了3000毫秒 就自动停止HTTP请求.timeout事件用来指定回调函数:
xhr.ontimeout = function (event){
alert("请求超时!")
}
4.3 FormData对象管理表单数据
Ajax操作往往用来提交表单数据.为了方便表单处理
HTML 新增一个FormData对象 可以模拟表单操作
// 1.创建FormData
var fd = new FormData()
// 2.调用append函数,向fd中追加数据
// 2/FormData 添加表单项
fd.append('uname', 'zs')
fd.append('upwd', '123456')
//创建XHR对象
var xhr = new XMLHttpRequest()
// 4.指定请求类型与URL地址
xhr.open("POST", 'http://www.liulongbin.top:3006/api/formdata')
xhr.send(fd)
// 5.直接提交FormData对象 与提交网页表单是一样的
xhr.onreadystatechange = function () {
if (xhr.readyState === 4 && xhr.status === 200) {
console.log(JSON.parse(xhr.responseText));
}
}
FormData对象获取网页表单的值
// 获取元素
var form = document.querySelector('#forml')
form.addEventListener('submit', function (e) {
//阻止表单默认提交行为 因为要做Ajax的形式提交数据
e.preventDefault()
//创建FormData 快速获取form里的表单数据
var fd = new FormData(form)
var xhr = new XMLHttpRequest()
xhr.open("POST", 'http://www.liulongbin.top:3006/api/formdata')
xhr.send()
xhr.onreadystatechange = function () {
if (xhr.readyState === 4 && xhr.status === 200) {
console.log(JSON.parse(xhr.responseText));
}
}
})
4.4 上传文件
新版XMLHttpRequest对象,不仅可以发送文本信息,还可以上传文件
步骤:
定义UI结构
验证是否选择了文件
向FormData中追加文件
使用xhr发起上传文件的请求
监听onreadystatechange事件
1.定义UI结构
<!-- 文件选择框 -->
<input type="file" name="" id="file1">
<!-- 上传文件的按钮 -->
<button id="btnUpload">上传文件</button>
<br />
<!-- img标签,来显示上传成功以后的图片 -->
<img src="" alt="" id="img" width="800">
2.验证是否选择了文件
// 获取文件上传
var btnUpload = document.querySelector('#btnUpload')
// 2.为按钮绑定单击事件处理函数
btnUpload.addEventListener('click', function () {
// 3.获取到用户选择的文件列表
var files = document.querySelector('#file1').files
if (files.length <= 0) {
return alert('请选择要上传的文件')
}
console.log('用户选择了待上传的文件');
})
3.向FormData中追加文件
var fd = new FormData()
// 将用户选择的文件,添加到FormData中
fd.append('avatar', files[0])
4.使用xhr发起上传文件的请求
创建xhr对象
var xhr = new XMLHttpRequest()
调用open 函数,指定请求类型与URL地址 其中,请求类型必须POST
xhr.open('POST', 'http://www.liulongbin.top:3006/api/formdata')
xhr.send(fd)
5.监听onreadystatechange事件
xhr.onreadystatechange = function () {
if (xhr.readyState === 4 && xhr.status === 200) {
var data = JSON.parse(xhr.responseText)
if (data.status === 200) { //上传文件成功
// 将服务器返回的图片地址 设为img标签的src 属性
document.querySelector('#img').src = 'http://www.liulongbin.top:3006' + data.url
} else {
// 上传失败
console.log('图片上传失败!' + data.message)
}
}
}
4.5显示文件上传进度
新版本的XMLHttpRequest对象,可以通过监听xhr.upload.onprogress事件,来获取文件的上传进度
语法格式如下:
// 监听文件上传的进度
xhr.upload.onprogress = function (e) {
//e.lengthComputable 是一个布尔值 表示当前上传的资料是否具有可计算的长度
if (e.lengthComputable) {
// e.loaded 已传输的字节
// e.total 需传输的总字节
var procentComplete = Math.ceil(e.loaded / e.total) * 100
}
}
1.导入需要的库
2.监听上传进度的事件
xhr.upload.onprogress = function (e) {
if (e.lengthComputable) {
var procentComplete = Math.ceil(e.loaded / e.total) * 100
console.log(procentComplete);
// 动态设置进度条
$('#percent').attr('style', 'width:' + procentComplete + '%;').html(procentComplete + '%')
//attr:改变宽度属性
}
}
3.监听上传完成的事件
xhr.upload.onload = function () {
$('#percent')
//移除上传中的样式
.removeClass()
//添加上传完成的类样式
.addClass('progress-bar progress-bar-success')
}
5.1 jQuery实现文件上传
1.定义UI结构
<script src="js/jquery.js"></script>
<input type="file" name="" id="file1">
<button id="btnUpload">上传文件</button>
2.验证是否选择了文件
$(function () {
$('#btnUpload').on('click', function () {
// 将jQuery对象转换成DOM对象 并获取文件列表
$('#file1')[0].files
// 判断是否选择了文件
if (files.length <= 0) {
return alert('请选择文件后再上传!')
}
})
})
3.FormData中追加文件
//向FormData中追加文件
var fd= new FormData()
fd.append('avatar',files[0])
4.使用jQuery发起上传文件的请求
$.ajax({
method: 'POST',
url: 'http://www.liulongbin.top:3006/api/upload/avatar',
data: fd,
//不修改Content-Type,使用FormData默认的Content-Type值
processData: false,
//不对FormData中的数据进行rl编码,而是将FormData数据原样发给服务器
contentType: false,
success: function () {
console.log(res);
}
})
5.2jQuery实现loading效果
1.ajaxStart(callback)
Ajax请求开始时,指向ajaxStart函数,可以再ajaxStart的callback中显示loading效果
如下:
//jQuery版本1.8起 该方法只能被附加到文档中
$(document).ajaxStart(function(){
$("#loading").show()
})
//注意:
//$(document).ajaxStart()函数会监听当前文档内所有的ajax请求
6.axios
6.1什么是axios
Axios是专注于网络数据请求的库
相比于原生的XMLHttpRequest对象,axios简单易用
相比于jQuery,axios更加轻量化,只专注于网络数据请求
6.2axios发起GET请求
axios发起GET请求的语法
具体示例
axios.get('url',{params:{/*参数*/}}).then(callback)
document.querySelector('#btn1').addEventListener('click', function () {
var url = 'http://www.liulongbin.top:3006/api/get'
var paramsObj = { name: 'zs', age: 2. }
axios.get(url, { params: paramsObj }).then(function (res) {
//res.data才是服务器的数据
console.log(res.data);
})
})
6.3axios发起POST请求
axios.post('url',{params:{/*参数*/}}).then(callback)
document.querySelector('#btn1').addEventListener('click', function () {
//请求的URL地址
var url = 'http://www.liulongbin.top:3006/api/post'
//请求的参数对象
var dataObj = { address: '北京', location: '顺义' }
//调用axios.post()发起POST请求
axios.post(url, dataObj).then(function (res) {
//res.data才是服务器返回的数据
console.log(res.data);
})
})
6.4直接axios使用发起请求
axios也提供了类似于jQuery中$.ajax()的函数
如下;
axios({
method:'请求类型',
url:'请求地址',
data:{/*POST数据*/},
params:{/*GET参数*/}
}).then(callback)
1.直接使用axios发起GET请求
axios({
method: 'GET',
url: 'url',
params: paramsData
}), then(function (res) {
console.log(res.data);
})
2.直接使用axios发起POST请求
axios({
method: 'POST',
url: 'url',
params: paramsData
}), then(function (res) {
console.log(res.data);
})