AJAX
EchoAjax(Asynchronous JavaScript and XML)是一种用于创建交互式网页应用程序的Web开发技术。它允许在不重新加载整个网页的情况下,通过使用JavaScript和XML或其他数据格式,与服务器进行异步数据交换。
AJAX
1.简介
AJAX 异步,就是页面不跳转就能把数据 和结果带回来,页面无刷新获取数据。
优点
无刷新获取数据
根据用户事件来更新部分页面内容
缺点
没有浏览记录 不能回退
存在跨域问题
SEO不友好 爬虫爬不到
1.1XML简介
XML 和HTML相同 都是语义标签 HTML是预定义好的标签 XML可以自己定义
XML表示学生数据
1 2 3 4 5
| <student> <name>张三</name> <age>19</age> <gender>男</gender> </student>
|
1.2 AJAX 的使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
| - 请求服务的html
```js <!DOCTYPE html> <html> <head> <meta charset="UTF-8" /> <title>1_ajax小试牛刀</title> <style> #content{ width: 300px; height: 100px; border: 1px solid black; margin-top: 10px; } </style> </head> <body> <h3>该页面是测试:ajax小试牛刀</h3> <button id="btn">点我发送请求(原生js-ajax-get)</button> <div id="content"></div>
--------------------------------重点部分------------------------------- <script type="text/javascript" > //获取按钮 const btn = document.getElementById('btn') const content = document.getElementById('content') //给按钮绑定监听 btn.onclick = ()=>{ //1.创建xhr实例对象 const xhr = new XMLHttpRequest()
//on 当xxx时候 //ready 准备 //state 状态 //change 状态 //xhr内部有5种状态,值分别为:0、1、2、3、4 //xhr实例对象,在实例出来的那一刻状态就是0 xhr.onreadystatechange = ()=>{ if(xhr.readyState === 4){ console.log(xhr.response); content.innerHTML = `<h3>${xhr.response}</h3>` } }
//2.指定发送请求的:method、url xhr.open('GET','http://127.0.0.1:8000/get')
//3.发送请求 xhr.send() } </script>
----------------------------------------------------------------------------
</body> </html>
|
1.3 xhr的五种状态(了解)
xhr理解为一个能帮我们从服务器拿东西的人 每做一步就会有一种状态就会有一个对应的状态值。
五种状态值为
当xhr被实例化出现的那一刻的状态的就是0
open请求已经发送了,但是send还没有调用,此时还能修改请求头的内容
1 2
| xhr.open('GET','http://127.0.0.1:8000/get')
|
send( )已经调用了,请求没法修改了
已经回来一部分数据了 小的数据会在此阶段一次性接受完毕,较大的数据有待进一步接收,整个一定会包含请求头
数据全部接收完毕
1.4 get 请求
带参数的get请求包含两种参数
1,query参数
2,parmas参数
下面是两种代码的js的发送方式
js代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102
| const express = require('express') const cors = require('cors')
const app = express()
app.use(express.urlencoded({extended:true}))
app.use(express.json()) app.use(cors())
app.use(express.static(__dirname+'/src'))
app.get('/test_get',(request,response)=>{ console.log('有人请求test_get了--携带的query参数是:',request.query);
response.send('hello_test_get') })
app.get('/test_get2/:name/:age',(request,response)=>{ console.log('有人请求test_get2了--携带的params参数是:',request.params); response.send('hello_test_get2') })
app.get('/get_person',(request,response)=>{ console.log('有人请求get_person了'); const person = {name:'tom',age:18,sex:'女'} response.send(JSON.stringify(person)) })
app.get('/get_person_delay',(request,response)=>{ console.log('有人请求get_person了'); const person = {name:'tom',age:18,sex:'女'} setTimeout(()=>{ response.send(JSON.stringify(person)) },3000) })
app.post('/test_post',(request,response)=>{ console.log('有人请求test_post了--携带的请求体参数是',request.body); response.send('hello_test_post') })
app.get('/test_jquery_get',(request,response)=>{ console.log('有人请求test_jquery_get了',request.query); const car = {name:'马自达·阿特兹',price:'25万'} response.send(JSON.stringify(car)) })
app.post('/test_jquery_post',(request,response)=>{ console.log('有人请求test_jquery_post了',request.body); const car = {name:'马自达·阿特兹',price:'25万'} response.send(JSON.stringify(car)) })
app.put('/test_put',(request,response)=>{
response.send('hello_test_put') })
app.get('/test_jsonp',(request,response)=>{ const {callback} = request.query console.log(callback); const person = [{name:'tom',age:18},{name:'老刘',age:5}] response.send(`${callback}(${JSON.stringify(person)})`) })
app.listen(8080,(err)=>{ if(!err) { console.log('测试ajax请求的服务器开启成功了!测试地址如下'); console.log('http://127.0.0.1:8080/1_ajax小试牛刀.html'); console.log('http://127.0.0.1:8080/2_xhr的5种状态.html'); console.log('http://127.0.0.1:8080/3_ajax_get请求.html'); console.log('http://127.0.0.1:8080/4_ajax_post请求.html'); console.log('http://127.0.0.1:8080/5_ajax_解析json数据.html'); console.log('http://127.0.0.1:8080/6_ajax_处理IE浏览器get请求缓存问题.html'); console.log('http://127.0.0.1:8080/7_ajax请求的异常与超时处理.html'); console.log('http://127.0.0.1:8080/8_ajax取消请求.html'); console.log('http://127.0.0.1:8080/9_避免多次重复请求.html'); console.log('http://127.0.0.1:8080/10_jquery封装的ajax.html'); console.log('http://127.0.0.1:8080/11_演示回调地狱.html'); } })
|
- 前端发送get请求 携带query参数和parmas 参数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
| <script type="text/javascript" > const btn = document.getElementById('btn') const content = document.getElementById('content') btn.onclick = ()=>{ const xhr = new XMLHttpRequest()
xhr.onreadystatechange = ()=>{ if(xhr.readyState === 4 ){ if(xhr.status >= 200 && xhr.status < 300){ console.log(xhr.response); content.innerHTML = `<h3>${xhr.response}</h3>` } } }
xhr.open('PUT','http://127.0.0.1:8080/test_put')
xhr.send() } </script>
|
1.5 post 请求
能接受jquery 和parmar参数
但是主要是要接受请求体body参数
请求体可以包含两种参数 1,unencode 2,json类型的参数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
| <!DOCTYPE html> <html> <head> <meta charset="UTF-8" /> <title>4_ajax_post请求</title> <style> #content{ width: 300px; height: 100px; border: 1px solid black; margin-top: 10px; } </style> </head> <body> <h3>该页面是测试:ajax_post请求</h3> <button id="btn">点我发送请求(原生js-ajax-post)</button> <div id="content"></div> <script type="text/javascript" > const btn = document.getElementById('btn') const content = document.getElementById('content') btn.onclick = ()=>{ const xhr = new XMLHttpRequest()
xhr.onreadystatechange = ()=>{ if(xhr.readyState === 4 ){ if(xhr.status >= 200 && xhr.status < 300){ console.log(xhr.response); content.innerHTML = `<h3>${xhr.response}</h3>` } } }
xhr.open('POST','http://127.0.0.1:8080/test_post')
xhr.setRequestHeader('Content-type','application/x-www-form-urlencoded')
const person = {name:'老刘',age:20}
xhr.send('name=老刘&age=18') } </script> </body> </html>
|
后端接受前端代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102
| const express = require('express') const cors = require('cors')
const app = express()
app.use(express.urlencoded({extended:true}))
app.use(express.json()) app.use(cors())
app.use(express.static(__dirname+'/src'))
app.get('/test_get',(request,response)=>{ console.log('有人请求test_get了--携带的query参数是:',request.query);
response.send('hello_test_get') })
app.get('/test_get2/:name/:age',(request,response)=>{ console.log('有人请求test_get2了--携带的params参数是:',request.params); response.send('hello_test_get2') })
app.get('/get_person',(request,response)=>{ console.log('有人请求get_person了'); const person = {name:'tom',age:18,sex:'女'} response.send(JSON.stringify(person)) })
app.get('/get_person_delay',(request,response)=>{ console.log('有人请求get_person了'); const person = {name:'tom',age:18,sex:'女'} setTimeout(()=>{ response.send(JSON.stringify(person)) },3000) })
app.post('/test_post',(request,response)=>{ console.log('有人请求test_post了--携带的请求体参数是',request.body); response.send('hello_test_post') })
app.get('/test_jquery_get',(request,response)=>{ console.log('有人请求test_jquery_get了',request.query); const car = {name:'马自达·阿特兹',price:'25万'} response.send(JSON.stringify(car)) })
app.post('/test_jquery_post',(request,response)=>{ console.log('有人请求test_jquery_post了',request.body); const car = {name:'马自达·阿特兹',price:'25万'} response.send(JSON.stringify(car)) })
app.put('/test_put',(request,response)=>{
response.send('hello_test_put') })
app.get('/test_jsonp',(request,response)=>{ const {callback} = request.query console.log(callback); const person = [{name:'tom',age:18},{name:'老刘',age:5}] response.send(`${callback}(${JSON.stringify(person)})`) })
app.listen(8080,(err)=>{ if(!err) { console.log('测试ajax请求的服务器开启成功了!测试地址如下'); console.log('http://127.0.0.1:8080/1_ajax小试牛刀.html'); console.log('http://127.0.0.1:8080/2_xhr的5种状态.html'); console.log('http://127.0.0.1:8080/3_ajax_get请求.html'); console.log('http://127.0.0.1:8080/4_ajax_post请求.html'); console.log('http://127.0.0.1:8080/5_ajax_解析json数据.html'); console.log('http://127.0.0.1:8080/6_ajax_处理IE浏览器get请求缓存问题.html'); console.log('http://127.0.0.1:8080/7_ajax请求的异常与超时处理.html'); console.log('http://127.0.0.1:8080/8_ajax取消请求.html'); console.log('http://127.0.0.1:8080/9_避免多次重复请求.html'); console.log('http://127.0.0.1:8080/10_jquery封装的ajax.html'); console.log('http://127.0.0.1:8080/11_演示回调地狱.html'); } })
|
1.6 解析json数据
xhr.responseType=’json’;告诉xhr你要解析的是json类型的数据
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
| <body> <h3>该页面是测试:ajax_解析json数据</h3> <button id="btn">点我发送请求(原生js-ajax-get)</button> <div id="content"></div>
<script type="text/javascript" > const btn = document.getElementById('btn') const content = document.getElementById('content')
btn.onclick = ()=>{ //实例xhr const xhr = new XMLHttpRequest()
//绑定监听 xhr.onreadystatechange = ()=>{ //判断状态码 if(xhr.readyState === 4){ //判断网页请求是否成功 如果后端响应成功 if(xhr.status >= 200 && xhr.status <300){
//把后端返回的内容通过解构赋值
const {name,age,sex} = xhr.response content.innerHTML = (` <ul> <li>姓名:${name}</li> <li>年龄:${age}</li> <li>性别:${sex}</li> <ul> `) } } }
//配置请求 xhr.open('GET','http://127.0.0.1:8080/get_person')
//responseType用于指定返回数据的格式 xhr.responseType = 'json'
//发送请求 xhr.send() } </script> </body>
|
后端的响应
1 2 3 4 5
| app.get('/get_person',(request,response)=>{ console.log('有人请求get_person了'); const person = {name:'tom',age:18,sex:'女'} response.send(JSON.stringify(person)) })
|
1.7 结构赋值复习
1 2 3 4 5 6 7 8 9
| let obj={a,b{c:c}};
let {c}=obj.b
let {b:{c}}=obj;
let {b:{c:vlaue}};
4405814
|
1.8 jquery 发送请求
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72
| <!DOCTYPE html> <html> <head> <meta charset="UTF-8" /> <title>10_jQuery封装的ajax</title> <style> #content{ width: 300px; height: 100px; border: 1px solid black; margin-top: 10px; } </style> <script type="text/javascript" src="./js/jquery.min.js"></script> </head> <body> <h3>该页面是测试:jQuery封装的ajax</h3> <button id="btn1">点我发送请求(jQuery-ajax-get)</button> <button id="btn2">点我发送请求(jQuery-ajax-post)</button> <div id="content"></div> <script type="text/javascript" > const btn1 = $('#btn1') const btn2 = $('#btn2') const content = $('#content')
btn1.click(()=>{ $.ajax({ url:'http://127.0.0.1:8080/test_jquery_get', method:'GET', data:{school:'atguigu'}, dataType:'json', timeout:2000, success:(result,reponseText,xhr)=>{ console.log(result,reponseText,xhr); content.append(`<div>汽车名:${result.name},价格:${result.price}</div>`) }, error:(xhr)=>{console.log('请求出错了',xhr);} })
})
btn2.click(()=>{ $.ajax({ url:'http://127.0.0.1:8080/test_jquery_post', method:'POST', data:{school:'atguigu'}, dataType:'json', timeout:2000, success:(result,reponseText,xhr)=>{ console.log(result,reponseText,xhr); content.append(`<div>汽车名:${result.name},价格:${result.price}</div>`) }, error:(xhr)=>{console.log('请求出错了',xhr);} })
$.post('http://127.0.0.1:8080/test_jquery_post',{school:'atguigu'},(data)=>{ console.log(data); content.append(`<div>汽车名:${data.name},价格:${data.price}</div>`) },'json') })
</script> </body> </html>
|
1.9jsonp 解决跨域问题
jsonp 解决跨域问题关键是;
绕开了xhr 利用了script 发送请求不受同源策略限制的特性 有一种前端定义函数,后端调用函数的感觉。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| <!DOCTYPE html> <html> <head> <meta charset="UTF-8" /> <title>Document</title> </head> <body> <h3>当前页面一定不要用服务器去打开,因为要制造跨域问题,用jsonp去解决</h3> <button id="btn">点我获取数据</button> <script type="text/javascript" >
const btn = document.getElementById('btn') btn.onclick = ()=>{ const scriptNode = document.createElement('script') scriptNode.src = 'http://localhost:8080/test_jsonp?callback=peiqi' document.body.appendChild(scriptNode) window.peiqi = (a)=>{ console.log(a); } document.body.removeChild(scriptNode) } </script>
</body> </html>
|
js接收部分
1 2 3 4 5 6 7
| app.get('/test_jsonp',(request,response)=>{ const {callback} = request.query console.log(callback); const person = [{name:'tom',age:18},{name:'老刘',age:5}] response.send(`${callback}(${JSON.stringify(person)})`) })
|
1.10 跨域问题
跨域是民间的一种叫法,是同源协议,同源协议主要的目的是为了保护我们的信息安全
如果我们可以在本地获取其他页面的 DOM对象 cookie 输入信息等等,就容易造成,我在我的页面加一个别的网页的映射,然后修饰一番,搞得和别人的官网一样,从而盗取其他人的信息,账户密码等等,就犯罪了。所以就有同源协议。来保护我们的信息
同源协议:网络协议相同, 域名(ip地址相同),端口号相同
同源协议限制了(重点从)
1,cookie 不能获取
2,dom不能获取
3,ajax不能获取数据(能发送请求,但是不能获取数据)
重点:
1.原生的js发送get请求和post请求
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| <script type="text/javascript" > const btn = document.getElementById('btn') const content = document.getElementById('content') btn.onclick = ()=>{ const xhr = new XMLHttpRequest()
xhr.onreadystatechange = ()=>{ if(xhr.readyState === 4 ){ if(xhr.status >= 200 && xhr.status < 300){ console.log(xhr.response); content.innerHTML = `<h3>${xhr.response}</h3>` } } }
xhr.open('PUT','http://127.0.0.1:8080/test_put')
xhr.send() } </script>
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
| <script type="text/javascript" > const btn = document.getElementById('btn') const content = document.getElementById('content') btn.onclick = ()=>{ const xhr = new XMLHttpRequest()
xhr.onreadystatechange = ()=>{ if(xhr.readyState === 4 ){ if(xhr.status >= 200 && xhr.status < 300){ console.log(xhr.response); content.innerHTML = `<h3>${xhr.response}</h3>` } } }
xhr.open('POST','http://127.0.0.1:8080/test_post')
xhr.setRequestHeader('Content-type','application/x-www-form-urlencoded')
const person = {name:'老刘',age:20}
xhr.send('name=老刘&age=18') } </script>
|
2.取消请求
3,跨域问题
跨域问题
跨域是民间的一种叫法,是同源协议,同源协议主要的目的是为了保护我们的信息安全
如果我们可以在本地获取其他页面的 DOM对象 cookie 输入信息等等,就容易造成,我在我的页面加一个别的网页的映射,然后修饰一番,搞得和别人的官网一样,从而盗取其他人的信息,账户密码等等,就犯罪了。所以就有同源协议。来保护我们的信息
同源协议:网络协议相同, 域名(ip地址相同),端口号相同
同源协议限制了(重点从)
1,cookie 不能获取
2,dom不能获取
3,ajax不能获取数据(能发送请求,但是不能获取数据)
4.jsonp解决跨域问题
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| <script type="text/javascript" >
const btn = document.getElementById('btn') btn.onclick = ()=>{ const scriptNode = document.createElement('script') scriptNode.src = 'http://localhost:8080/test_jsonp?callback=peiqi' document.body.appendChild(scriptNode) window.peiqi = (a)=>{ console.log(a); } document.body.removeChild(scriptNode) } </script>
|
5.cors 解决跨域
跟前端没多大关系
1
| const cors = require('cors')
|