7 - AJAX深入浅出
7.1 - 原生AJAX
7.1.1 - AJAX简介
- AJAX 全称为Asynchronous Javascript And XML,就是异步的 JS 和 XML。
- 通过AJAX可以在浏览器中向服务器发送异步请求。
- AJAX 不是新的编程语言,而是一种使用现有标准的新方法。`
7.1.2 - XML简介
- XML可扩展标记语言。
- XML 被设计用来传输和存储数据。
- XML和HTML类似,不同的是HTML中都是预定义标签,而XML中没有预定义标签,全都是自定义标签,用来表示一些数据。
//比如说我有一个学生数据:
// name = "孙悟空" ; age = 18 ; gender = "男" ;
//用XML表示:
<student>
<name>孙悟空</name>
<age>18</age>
<gender>男</gender>
</student>
但是现在已经被JSON取代了。
//我们用 JSON 格式 表示:
{"name":"孙悟空","age":18,"gender":"男"}
7.1.3 - AJAX的工作原理
Ajax的原理相当于在用户和服务器之间加了一个中间层(AJAX引擎),使用户操作与服务器响应异步化。
7.1.4 - AJAX的特点
-
AJAX的优点
可以无需刷新页面而与服务器端进行通信。
允许你根据用户事件来更新部分页面内容。
-
AJAX的缺点
没有浏览历史,不能回退
存在跨域问题
SEO不友好
7.1.5 - AJAX的使用
7.1.5.1. 核心对象
XMLHttpRequest //AJAX的所有操作都是通过该对象进行的。
7.1.5.2 - 使用步骤(发送ajax请求)
–创建xhr实例对象
–绑定事件监听(监听请求成功/失败)
onreadystatechange 当readystate发生变化时触发事件
0:初始化状态, 什么都还没做
1:代表open调用了,但send方法还未调用(还没有发送请求)
2:代表send方法调用了,并且接受到了部分响应信息(接受了响应首行和响应头:响应状态码)
3:代表接受了部分响应体数据(如果响应体数据较小就全部接受,但数据如果较大,就只接受一部分)
4:代表接受了全部响应体数据
-设置请求信息
—请求方式
—请求地址
—请求参数
xhr.open(请求方式, 请求地址?查询字符串参数, 同步false/异步true);
发送请求
注意:不要通过webstorm服务器启动页面(会产生跨域错误)要通过自己的服务器打开页面
举个栗子说:
// 1. 创建xhr实例对象
const xhr = new XMLHttpRequest();
// 2. 绑定事件监听(监听请求成功/失败)
xhr.onreadystatechange = function () {
console.log('事件触发了', xhr.readyState);
/*if (xhr.readyState === 2) {
// 响应状态码
console.log(xhr.status);
}
if (xhr.readyState === 3) {
// 响应内容
console.log(xhr.responseText);
}
if (xhr.readyState === 4) {
// 响应内容
console.log(xhr.responseText);
}*/
if (xhr.readyState === 4) {
if (xhr.status > 199 && xhr.status < 300) {
// 成功响应内容
console.log(xhr.responseText);
} else if (xhr.status > 399 && xhr.status < 600) {
// 失败的响应
console.log(xhr.responseText);
}
}
};
3. 设置请求信息
/*
get请求默认会缓存起来(第二次发送请求会走缓存)
chrome/firefox (相当于走协商缓存,需要访问服务器)
ie (相当于走强制缓存,不需要服务器)
问题:如果后台资源更新了,ie获取不到最新的内容
解决:请求参数加上随意数,每次请求都不一样,就不会走缓存
*/
// xhr.open('GET', 'http://localhost:3000/ajax?name=jack&age=20&date=' + Date.now());
// xhr.open('GET', 'http://localhost:3000/ajax?name=jack&age=20&date=' + Math.random());
xhr.open('POST', 'http://localhost:3000/ajax');
// 设置请求头
// xhr.setRequestHeader('content-type', 'application/x-www-form-urlencoded');
xhr.setRequestHeader('content-type', 'application/json');
// 4. 发送请求
// xhr.send('name=jack&age=20'); // urlencoded编码 - form
xhr.send(JSON.stringify({name: 'jack', age: 20})); // json
console.log('全部代码执行完了~');
}
7.1.5.3 - 解决IE缓存问题
-
问题: 在一些浏览器中(IE),由于缓存机制的存在,ajax只会发送第一次请求,剩下多次请求不会再发送给浏览器而是直接加载缓存中的数据。
-
解决方式: 浏览器的缓存是根据url地址来记录的,所以我们只需要修改url地址(让其实时动态改变)即可避免缓存问题
-
xhr.open("get","/testAJAX?t="+Date.now());
7.1.5.4 - AJAX请求状态
xhr.readyState 可以用来查看请求当前的状态
0. : 对应常量UNSENT,表示XMLHttpRequest实例已经生成,但是open()方法还没有被调用。
- : 对应常量OPENED,表示send()方法还没有被调用,仍然可以使用setRequestHeader(),设定HTTP请求的头信息。
- : 对应常量HEADERS_RECEIVED,表示send()方法已经执行,并且头信息和状态码已经收到。
- : 对应常量LOADING,表示正在接收服务器传来的body部分的数据,如果responseType属性是text或者空字符串,responseText就会包含已经收到的部分信息。
- : 对应常量DONE,表示服务器数据已经完全接收,或者本次接收已经失败了
7.2 - jQuery中的AJAX
7.2.1 - get请求
-
$.get(url, [data], [callback], [type])
url:请求的URL地址
data:请求携带的参数
callback:载入成功时回调函数
type:设置返回内容格式,xml, html, script, json, text, _default
实例:
$.ajax({
method: 'GET', // 请求方式
url: 'http://localhost:3000/ajax', // 请求地址
data: { // 请求参数
name: 'jack',
age: 18
},
success: function (data) {
console.log(data); // 请求成功的响应数据
},
error: function (error) {
console.log(error); // 请求失败的具体原因
}
});
$.get('http://localhost:3000/ajax', {name: 'jack', age: 18}, function (data) {
console.log(data);
})
7.2.2 - post请求
$.post(url, [data], [callback], [type])
url:请求的URL地址
data:请求携带的参数
callback:载入成功时回调函数
type:设置返回内容格式,xml, html, script, json, text, _default
实例:
$.ajax({
method: 'POST', // 请求方式
url: 'http://localhost:3000/ajax', // 请求地址
data: JSON.stringify({ // 请求参数
name: 'jack',
age: 18
}),
headers: { // 请求头: 默认post请求是以form表单方式发送
'content-type': 'application/json'
},
success: function (data) {
console.log(data); // 请求成功的响应数据
},
error: function (error) {
console.log(error); // 请求失败的具体原因
}
});
$.post('http://localhost:3000/ajax', {name: 'jack', age: 18}, function (data) {
console.log(data);
});