AJAX
1.定义
ajax是异步的js和xml
ajax是浏览器与服务器进行数据通信的技术
首先引入axios库

2.原生AJAX
最大的优势就是无刷新获取数据
3.XML
这是一种可标记的语言,被用来存储数据和传输数据
与html不同的是:xml中没有预定义标签,全是自定义标签
4.AJAX的特点
1.优点
1.可以无需刷新页面与服务器端进行通信
2.允许你根据用户事件来更新部分页面
2.缺点
1.没有历史记录
2.存在跨域问题
3.seo不友好
5.HTTP
http协议,超文本传输协议
6.请求报文
重点是格式与参数
分别有行,头,空行,体
其中有get请求和post请求
7.响应报文
还是有行,头,空行,体
8.查看请求报文和响应报文
进入网页之后点击f12,之后点开network项目,其中都是请求
9.node.js安装
已经装好了
10.exprexx服务端框架
//1.引入
const express = require('express')
//创建应用对象
const app = express()
//创建路由规则
//request是对请求报文的封装
//response是对响应报文的封装
app.get('/',(request,response)=>{
//设置响应
response.send('hello')
})
//监听端口启动服务
app.listen(8000,()=>{
console.log('启动');
})
11.请求发送之前的准备
前端页面的准备
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
#result {
width: 200px;
height: 100px;
border: solid 1px purple;
}
</style>
</head>
<body>
<button>点击发送请求</button>
<div id="result"></div>
</body>
</html>
服务端代码的准备
//1.引入
const express = require('express')
//创建应用对象
const app = express()
//创建路由规则
//request是对请求报文的封装
//response是对响应报文的封装
app.get('/server',(request,response)=>{
//设置一个响应头设置允许跨域
response.setHeader('Access-Control-Allow-Origin','*')
//设置响应
response.send('hello ajax')
})
//监听端口启动服务
app.listen(8000,()=>{
console.log('启动');
})
12.AJAX操作的基本步骤
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
#result {
width: 200px;
height: 100px;
border: solid 1px purple;
}
</style>
</head>
<body>
<button>点击发送请求</button>
<div id="result"></div>
<script>
const divseek = document.querySelector('#result')
document.querySelector('button').addEventListener('click',()=>{
//创建对象
const xhr = new XMLHttpRequest()
//设置初始化
xhr.open('GET','http://127.0.0.1:8000/server')
//发送
xhr.send()
//事件绑定,处理服务器返回的结果
//readystate是xhr对象中的属性,表示状态有01234
//change改变
xhr.onreadystatechange = ()=>{
//在4的时候处理返回所有的结果
if(xhr.readyState === 4){
//判断响应的状态吗
if(xhr.status >= 200 && xhr.status < 300){
//处理结果 行 头 空行 体
//响应行
// console.log(xhr.status)//状态码
// console.log(xhr.statusText)//状态字符串
// console.log(xhr.getAllResponseHeaders())//所有响应头
// console.log(xhr.response)//响应体
//设置result文本
divseek.innerHTML = xhr.response
}else{
}
}
}
})
</script>
</body>
</html>
13.设置AJAX的参数

在url后面用问号分隔开然后坠入参数,参数之间用&符号分开
14.发送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>
<style>
#result {
width: 200px;
height: 100px;
border: solid 1px red;
}
</style>
</head>
<body>
<div id="result"></div>
<script>
document.querySelector('#result').addEventListener('mouseover',()=>{
//创建对象
const xhr = new XMLHttpRequest()
//初始化,设置类型
xhr.open('POST','http://127.0.0.1:8000/server')
//发送
xhr.send()
//事件绑定
xhr.onreadystatechange = ()=>{
//判断
if(xhr.readyState === 4){
if(xhr.status >= 200 && xhr.status < 300) {
//处理服务端返回的结果
document.querySelector('#result').innerHTML = xhr.response
}
}
}
})
</script>
</body>
</html>
//1.引入
const express = require('express')
//创建应用对象
const app = express()
//创建路由规则
//request是对请求报文的封装
//response是对响应报文的封装
app.get('/server',(request,response)=>{
//设置一个响应头设置允许跨域
response.setHeader('Access-Control-Allow-Origin','*')
//设置响应
response.send('hello ajax')
})
app.post('/server',(request,response)=>{
//设置一个响应头设置允许跨域
response.setHeader('Access-Control-Allow-Origin','*')
//设置响应
response.send('hello ajax POST')
})
//监听端口启动服务
app.listen(8000,()=>{
console.log('启动');
})
1.post请求中如何设置参数

post中要在send中写参数
15.设置请求头信息
1.设置请求头

其中contenttype是设置请求体类型的
后面的是一种固定写法
16.AJAX响应JSON数据
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
#result {
width: 200px;
height: 100px;
border: solid 1px red;
}
</style>
</head>
<body>
<div id="result"></div>
<script>
window.addEventListener('keydown',()=>{
//发送请求
const xhr = new XMLHttpRequest()
//初始化¬ø
xhr.open('GET','http://127.0.0.1:8000/json-server')
//发送吧
xhr.send()
//事件绑定
xhr.onreadystatechange = ()=>{
if(xhr.readyState === 4){
if(xhr.status >= 200 && xhr.status < 300){
//手动对字符串进行数据转化
// let data = JSON.parse(xhr.response)
//document.querySelector('#result').innerHTML = data.name
//自动转化
document.querySelector('#result').innerHTML = xhr.response.name
}
}
}
})
</script>
</body>
</html>
//1.引入
const express = require('express')
//创建应用对象
const app = express()
app.all('/json-server',(request,response)=>{
//设置一个响应头设置允许跨域
response.setHeader('Access-Control-Allow-Origin','*')
//响应头
response.setHeader('Access-Control-Allow-Headers','*')
//响应一个对象
const data = {
name:'atguigu'
}
//对对象进行字符串的转化
let str = JSON.stringify(data)
//设置响应
response.send(str)
})
//监听端口启动服务
app.listen(8000,()=>{
console.log('启动');
})
17.IE缓存问题
若遇到这个问题就去看,直接跳了
18.AJAX请求超时与网络异常处理
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
#result {
width: 200px;
height: 100px;
border: solid 1px skyblue;
}
</style>
</head>
<body>
<button>点击发送请求</button>
<div id="result"></div>
<script>
const result = document.querySelector('#result')
document.querySelector('button').addEventListener('click',()=>{
const xhr = new XMLHttpRequest()
//超时设置
xhr.timeout = 2000
//超时回调
xhr.timeout = function(){
alert('网不好')
}
//网络异常的回调设置
xhr.onerroe = function(){
alert('网络不太好')
}
xhr.open('GET','http://127.0.0.1:8000/delay')
xhr.send()
xhr.onreadystatechange = ()=>{
if(xhr.readyState === 4){
if(xhr.status >= 200 && xhr.status < 300){
result.innerHTML = xhr.response
}
}
}
})
</script>
</body>
</html>
//1.引入
const express = require('express')
//创建应用对象
const app = express()
// 创建路由规则
// request是对请求报文的封装
// response是对响应报文的封装
app.all('/server',(request,response)=>{
//设置一个响应头设置允许跨域
response.setHeader('Access-Control-Allow-Origin','*')
//设置响应
response.send('hello ajax - 2')
})
app.all('/json-server',(request,response)=>{
//设置一个响应头设置允许跨域
response.setHeader('Access-Control-Allow-Origin','*')
//响应头
response.setHeader('Access-Control-Allow-Headers','*')
//响应一个对象
const data = {
name:'atguigu'
}
//对对象进行字符串的转化
let str = JSON.stringify(data)
//设置响应
response.send(str)
})
//延时响应
app.get('/delay',(request,response)=>{
response.setHeader('Access-Control-Allow-Origin','*')
setTimeout(()=>{
response.send('延时响应')
},3000)
})
//监听端口启动服务
app.listen(8000,()=>{
console.log('启动');
})
19.AJAX中的取消请求
<!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>
<button class="but1">点击发送</button>
<button class="but2">点击取消</button>
<script>
const but1 = document.querySelector('.but1')
const but2 = document.querySelector('.but2')
const x = null
but1.addEventListener('click',()=>{
const x = new XMLHttpRequest()
x.open('GET','http://127.0.0.1:8000/delay')
x.send()
})
//取消请求abort
but2.addEventListener('click',()=>{
x.abort()
})
</script>
</body>
</html>
利用abort让请求取消
20.AJAX重复发送请求的方法
定义一个isSend布尔变量,将它定义为false
当发送请求的时候就将值变为true
等请求发送完之后就变为false,这样就可以缓解服务器的压力了
21.axios发送AJAX请求
22.同源策略
是由netscape公司提出的,是浏览器的一种安全策略
同源:协议,域名,端口号,必须完全相同
违背同源策略就是跨域
<!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>尚硅谷</h1>
<button>点击获取用户数据</button>
<script>
document.querySelector('button').addEventListener('click',()=>{
const x = new XMLHttpRequest()
x.open('GET','/data')
x.send()
x.onreadystatechange = ()=>{
if(x.readyState === 4){
if(x.status >= 200 && x.status <= 300){
console.log(x.response)
}
}
}
})
</script>
</body>
</html>
如何解决跨域
JSONP
jsonp是什么,是一个非官方发跨域解决方案,只支持get请求
怎么工作
在网页有一些标签天生具有跨域能力,
jsonp就是利用script标签的跨域功能来发送请求的
使用
1.动态的创建一个script标签
2.设置回调函数