Ajax基础(属于客户端js代码)
传统网站中存在的问题(所谓的传统网站就是前面用node开发的网站)
网速慢的情况下,页面加载时间长,用户只能等待。
表单提交后,如果一项内容不合格,需要重新填写所有表单内容
页面跳转,重新加载页面,造成资源浪费,增加用户等待时间。
Ajax概述
它是浏览器提供的一套方法,可以实现页面无刷新更新数据,提高用户浏览网站应用的体验。
简单的说就是,可以实现用户在浏览网页的时候实现网页的局部更新。
不刷新页面的情况下,向服务器端发送请求和服务器端进行交互,同时更改客户端的数据和状态的情况。提高用户浏览网站的体验。
Ajax的应用场景
- 页面上啦加载更多数据
- 列表数据无刷新页面
- 表单项离开焦点数据验证
- 搜索框提示文字下拉列表
Ajax的运行环境
Ajax技术需要运行在网站环境中才能生效,当前课程会使用Node创建的服务器作为网站服务器。
Ajax运行原理
Ajax相当于浏览器发送请求与接收响应的代理人,以实现在不影响用户浏览页面的情况下,局部更新页面数据,从而提高用户体验。
Ajax的实现步骤
- 创建Ajax对象
var xhr = new XMLHttpRequest();
XML是服务器端返回客户端的格式, HttpRequest表示Http请求。 - 告诉Ajax请求地址以及请求方式
xhr.open(‘get’, ‘http://www.example.com’); - 发送请求
xhr.send(); - 获取服务器端给与客户端的响应数据
xhr.onload = function () {
console.log(xhr.responseText);
}
Ajax属于javascript代码,所以写在scirpt标签内部
服务器端响应的数据格式
在真实的项目中,服务器端大多数情况下会以JSON对象作为响应数据的格式,当客户端拿到响应数据时,要将JSON数据和HTML字符串进行拼接,然后将拼接的结果展示在页面中。
在http请求与响应的过程中,无论是请求参数还是响应内容,如果是对象类型,最终都会被转换为对象字符串进行传输。
var responseText = JSON.parse(xhr.responseText); //将JSON字符串转换为JSON对象
var str = '<h2>'+ responseText.name +'</h2>';
document.body.innerHTML = str;
请求参数传递
GET请求参数需要自己拼接。
btn.onclick = function () {
// 创建ajax对象
var xhr = new XMLHttpRequest();
//获取用户在文本框中输入的值
var nameValue = username.value;
var ageValue = age.value;
//拼接请求参数
//username=123&age=456
var params = 'username='+ nameValue +'&age=' + ageValue;
//配置ajax对象
xhr.open('get', 'http://localhost:3000/get?'+params);
//发送请求
xhr.send();
//获取服务器端响应的数据
xhr.onload = function () {
console.log(xhr.responseText);
}
}
app.get('/get', (req, res) => {
res.send(req.query);
})
POST请求
请求报文:
在HTTP请求和响应的过程中传递的数据块就叫报文,包括要传送的数据和一些附加信息,这些数据和信息要遵守规定好的格式。
var params = 'username='+ nameValue +'&age=' + ageValue;
//配置ajax对象
xhr.open('post', 'http://localhost:3000/post');
//设置请求参数格式的类型(post请求必须要设置)
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
//发送请求
xhr.send(params);
请求参数的格式
客户端向服务器端传递请求参数的格式:
第二种
app.use(bodyParser.json());
app.post('/json', (req, res) => {
res.send(req.body);
});
xhr.open('post', 'http://localhost:3000/json');
//通过请求头告诉服务器端客户端向服务器端传递的请求参数的格式是什么
xhr.setRequestHeader('Content-Type', 'application/json');
//JSON.stringify() 将json对象转换为json字符串
//3. 发送请求
xhr.send(JSON.stringify({name: 'lisi', age: 50}));
注意: get 请求是不能提交json对象数据格式的,传统网站的表单提交也是不支持json对象数据格式的。传统表单也需要用第一种方法
获取服务器端的响应(另外一种)
已经过时了,但是还有人用,所以需要了解。
Ajax状态码:
在创建ajax对象,配置ajax对象,发送请求,以及接收完服务器端响应数据,这个过程中的每一个步骤都会对应一个数值,这个数值就是ajax状态码。
0:请求未初始化(还没有调用open())
1:请求已经建立,但是还没有发送(还没有调用send())
2:请求已经发送
3:请求正在处理中,通常响应中已经有部分数据可以用了
4:响应应经完成,可以获取并使用服务器的响应了
onreadystatechange事件
当Ajax状态码发生变化时将自动触发该事件
var xhr = new XMLHttpRequest();
// 0已经创建了ajax对象 但是还没有对ajax对象进行配置
console.log(xhr.readyState);
//1 已经对ajax对象配置 但是没发送请求
xhr.open('get', 'http://localhost:3000/readystate');
console.log(xhr.readyState);
//当ajax状态码发生变化的时候触发
xhr.onreadystatechange = function () {
//2 请求已经发送
//3 已经接收到服务器端的部分数据
//4 服务器端的响应数据已经接收完成
console.log(xhr.readyState);
}
xhr.send();
app.get('/readystate', (req, res) => {
res.send('hello');
});
Ajax错误处理
Ajax状态码:表示的是Ajax请求的过程,表示Ajax请求的过程状态, ajax对象返回的
Http状态码:表示请求的处理结果 是服务器端返回的。
低版本ID浏览器的缓存问题
问题:在低版本的IE浏览器中,Ajax请求有严重的缓存问题,即在请求地址不发生变化的情况下,只有第一次请求会真正发送到服务器端,后续的请求都会从浏览器的缓存中获取结果。即使服务器端的数据更新了,客户端依然拿到的是缓存中的旧数据。
解决方案:在请求地址的后面加请求参数,保证每一次请求中的请求参数的值不相同
xhr.open('get', 'http://localhost:3000/cache?t=' + Math.random());
//3. 发送请求
xhr.send();
app.get('/cache', (req, res) => {
fs.readFile('./test.txt', (err, result) => {
res.send(result);
});
});
同步异步概述
同步:
异步: