为什么要用Ajax
-
Aajx 的英文全称为 Asynchronous(异步) JavaScript and XML ,虽然包含了XML,但是数据格式还可以有 JSON等
Ajax可以异步向服务器端发起请求,页面不用等待响应,更新的内容刷新在相应位置,而不是刷新整个页面。
Ajax中最大的特点 就是请求会被异步对象XMLHttpRequest进行封装,然后再发送到服务器,接着服务器以流的形式将数据返回给浏览器 也正是因为服务器返回的数据是通过流的形式发送的**,XMLHttpRequest对象会不停的监听服务器**,且得到服务器数据,所以浏览器不需要刷新就可以获取服务器端的数据
-
同步:客户端必须的等待服务器端给予的响应,在此期间不能进行其他操作
异步:与同步不同,客户端不需要等待服务器响应,在此期间可以进行任何操作
-
异步的好处:AJAX 就是一种可以在无需重新加载整个网页的情况下 就可以实现与客户端与服务器的异步通讯 往简单了说就是:不用刷新整个网页,就能修改网页局部内容 正如我们开头所说到的,在开发中,如果每一次局部的小修改都进行页面刷新,这显然对性能会有所降低,而且用户正在执行的操作也会中断
优缺点
- 优点
- 局部刷新,优化了用户体验
- 异步通信,不需要打断用户操作,具有良好的响应能力
- 将一些工作从服务器转移到客户端中,节省了服务器和带宽资源
- 按需取数据 ,减轻了服务器负担,也大大减少了冗余请求
- 缺点
- AJAX 主要依赖于JavaScript ,浏览器对 JavaScript 的兼容性将直接影响 AJAX的使用
- 浏览器的后退机制被破坏,这也正是局部刷新所带来的问题,不过现在有一些方式可以尽可能弥补这些问题
- 移动端对 AJAX 的支持没有那么好
应用场景
- 搜索框联想列表
- 局部刷新分页效果
- 同页面加载更多
- 表单数据验证
发送Ajax请求示例
get请求
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<h1>Ajax 发送 get 请求</h1>
<input type="button" value="发送get_ajax请求" id='btnAjax'>
<script>
document.querySelector("#btnAjax").onclick = function () {
//发送get请求
//1 创建异步对象
var ajaxobj = new XMLHttpRequest()
//2 设置请求参数
ajaxobj.open('get', 'url');
//3 发送请求
ajaxobj.send();
//4 注册事件 onreadystatechange()当状态改变时调用
ajaxobj.onreadystatechange = function () {
//判断两个状态值
if (ajaxobj.readyState == 4 && ajaxobj.status == 200) {
console.log("get请求响应返回成功!")
//5 处理返回的数据,修改页面显示
var responseText = ajaxobj.responseText;
var objdata = JSON.parse(responseText)
document.querySelector('h1').innerHTML = objdata;
}
}
}
</script>
</body>
</html>
post请求
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<h1>Ajax 发送 post 请求</h1>
<input type="button" value="发送posy_ajax请求" id='btnAjax2'>
<script>
document.querySelector("#btnAjax2").onclick = function () {
//1 创建异步对象
var xhr = new XMLHttpRequest();
//2 设置请求参数
xhr.open('post', 'url')
// 用post请求数据必须添加此行
xhr.setRequestHeader('Content-type', 'application/x-www-form-urlencoded')
//3 将数据通过send方式传递
xhr.send('name=fox&age=18')
//4 注册事件
xhr.onreadystatechange = function () {
//判断状态
if (xhr.readyState == 4 && xhr.status == 200) {
console.log("post成功")
//5 处理返回数据
alert(xhr.responseText);
}
}
}
</script>
</body>
</html>
XMLHttpRequest方法和属性
- 方法
| 方法 | 含义 |
|---|---|
| open() open(method,url,async,uesrname,password) | 设置请求参数 初始化 一般设置前两个参数 |
| send(ocntent) | 发送请求 |
| setRequestHeader(lable,value) | 设置请求头 |
| getRequestHeader(headername) | 获取指定的响应头信息 |
| getAllRequestHeaders() | 以字符串形式返回完整的HTTP头部信息 |
| abort() | 取消当前请求 |
- 属性
| 属性 | 含义 | |
|---|---|---|
| onreadystatechange | 监听事件 = function() | |
| readyState | 状态信息 | |
| responseText | 响应内容 字符串格式 | |
| resonseXML | 响应内容 XML文档对象 | |
| status | http状态码 | |
| statusText | http状态说明 |
readyState状态码
| 状态 | 描述 |
|---|---|
| 0 | new了一个xhr对象之后,open之前 |
| 1 | open之后,send之前 |
| 2 | 请求以发送,send之后 |
| 3 | 请求正在处理中:浏览器和服务器已经建立通信,服务器未完成响应之前 |
| 4 | 请求已经完成,并且已经从服务器完全接收到响应数据 |
相关status状态码
| 状态码 | 描述 |
|---|---|
| 200 | 请求成功 |
| 302 | 请求重定向 |
| 304 | 资源未改变 |
| 404 | 资源不存在 |
| 500 | 服务器内部出错 |