AJAX
AJAX就是Asynchronous JavaScript And XML,就是异步的 JS 和 XML,优势:无刷新获取数据
XML:可扩展标记语言,被设计用来传输和存储数据。和HTML类似,但是XML里是预定义标签,而XML中没有预定义标签。
目前XML已经被JSON代替了。
AJAX的优点:
1.可以无需刷新页面而与服务器端进行通信 2.允许你根据用户事件来更新部分页面内容
AJAX的缺点:
1.没有浏览力士,不能回退 2.存在跨域问题(同源):在这个服务向另外一个服务发送请求 3.SEO搜索引擎优化不友好
HTTP协议:
超文本传输协议,规定了浏览器和服务器之间的通信规则。
请求报文
行 GET/s?ie=utf-8 HTTP/1.1
头 Host: atguigu.com
Cookie: name=guigu
Content-type: application/x-www-form-urlencoded
User-Agent: chrome 83
空行
体 username=admin&password=admin
响应报文
行 HTTP/1.1 200 OK
头 Content-Type: text/html;charset=utf-8
Content-length: 2048
Conent-encoding: gzip
空行
体 <html>
<head>
</head>
<body>
</body>
</html>
response响应 request请求
1 Express框架
2 基于Node.js平台
3 //1. 引入express
4 const express = require('express');
5 //2. 创建应用对象
6 const app = express();
7 //3. 创建路由规则
8 //request是对请求报文的封装
9 //response是对响应报文的封装
10 app.get('/',(request, response)=>{
11 //app.all可以接收任意类型的请求
12 //设置响应头 设置允许跨域
13 response.setHeader('Access-Control-Allow-Origin','*');
14 //设置响应
15 response.send('HELLO AJAX');
16 });
17 //4. 监听端口启动服务
18 app.listen(8000, ()=>{
19 console.log("服务已经启动,8000 端口监听中...");
20 })
21
22
23 btn.onclick = function(){
24 //1. 创建对象
25 const xhr = new XMLHttpRequest( );
26 //2. 初始化 设置请求方法和url
27 xhr.open('GET', 'http://127.0.0.1:8000/server?a=100&b=200&c=300'); //通过在?后面添加,&分割传递参数
28 //3. 发送
29 xhr.send();
30 //4. 事件绑定 处理服务端返回的结果
31 // on 当什么…时候
32 // readystate 是 xhr 对象的属性,表示状态 0 1 2 3 4 ,0表示未初始化 1表示open方法调用完毕 , 2表示send方法调用完毕, 3表示返回部分结果 , 4表示返回所有结果
33
34 xhr.onreadystatechange = function(){
35 // 判断 服务端返回了所以的结果
36 if(xhr.readyState ===4 ){
37 //判断响应状态码 200 404 403 401 500
38 // 2xx成功
39 if(xhr.status >=200 && xhr.status < 300 ){
40 //处理结果 行 头 空行 体
41 //1 .响应行
42 //console.log(xhr.status); //状态码
43 //console.log(xhr.statusText); //状态字符串
44 //console.log(xhr.getAllResponseHeaders()); //所有响应头
45 //console.log(xhr.response); //响应体
46 result.innerHTML = xhr.response;
47 }else{
48
49 }
50 }
51 }
52 }
53
54 F12 ->network ->XHR说明是AJAX
55
56 <script>
57 //获取元素对象
58 const result = document.getElementById("result");
59 //绑定事件
60 result.addEventListener("mouseover", function(){
61 //1. 创建对象
62 const xhr = new XMLHttpRequest();
63 //2. 初始化 设置类型与Url
64 xhr.open('POST', 'http://127.0.0.1:8000/serve');
65 //设置请求头,只能放在open
66 //Content-Type设置请求体类型,application/x-www-form是参数查询字符串的固定类型
67 //也可以自己定义,但是可能会报错。需要后端在app.post里添加response.setHeader('Access-Control-Allow-Headers','*');
68 //一般把身份校验的信息放在头部
69 xhr.setRequestHeader('Content-Type','application/x-www-form');
70 //3. 发送
71 // xhr.send('a=100&b=200&c=300');
72 // xhr.send('a:100&b:200&c:300');
73 xhr.send();
74 //4. 事件绑定
75 xhr.onreadystatechange = function(){
76 //判断
77 if(xhr.readyState ===4 ){
78 if(xhr.status >=200 && xhr.status < 300){
79 //处理服务端返回结果
80 result.innerHTML = xhr.response;
81 }
82 }
83 }
84 })
85 </script>
86
87 后端返回的结果绝大多数都是JSON格式
88 <script>
89 const result = document.getElementById('result');
90 //绑定键盘按下事件
91 window.onkeydown = function(){
92 //发送请求
93 const xhr = new XMLHttpRequest();
94 //设置响应体数据类型
95 xhr.responseType = 'json';
96 //初始化
97 xhr.open('GET','http://127.0.0.1:8000/json-server');
98 //发送
99 xhr.send();
100 //事件绑定
101 xhr.onreadystatechange = function(){
102 if(xhr.readyState === 4){
103 if(xhr.status >=200 && xhr.status < 300){
104 // console.log(xhr.response);
105 // result.innerHTML = xhr.response;
106 // 手动对数据转化
107 // let data = JSON.parse(xhr.response);
108 // console.log(data);
109 //自动转换,需要在顶部设置响应体数据的类型
110 // result.innerHTML = data.name;
111 console.log(xhr.response);
112 result.innerHTML = xhr.response.name;
113 }
114 }
115 }
116 }
117 </script>
118
119 app.all('/json-server',(Request, response)=>{
120 //设置响应头,设置允许跨域
121 response.setHeader('Access-Control-Allow-Origin','*');
122 //响应头
123 response.setHeader('Access-Control-Allow-Headers','*');
124 //响应一个数据
125 const data = {
126 name: 'atguigu'
127 };
128 //对对象进行字符串转换
129 let str = JSON.stringify(data);
130 //设置响应体
131 response.send();
132 })
AJAX在server.js里面
const express = require('express')
1.创建应用对象 const app = express( );
2.app.get('server', (request, response) =>{ }) //post设置类app.post app.all可以接收任何信息
设置响应头 response.setHeader('Access-Control-Allow-Origin' , '*')
设置响应体 response.send('…')
AJAX的步骤在HTML里面:
1.获取元素对象 const result = document.getElementBy….
2.给这个对象绑定事件 result.addEventListener( 事件名称 , 回调函数function( ){ })
3.在回调函数里创建xhr对象
创建对象: const xhr = new XMLHttpRequest( );
初始化 设置类型和URL: xhr.open('POST', 'http:// ….')
设置请求头 xhr.setRequestHeader('Content-Type' , ' ….. ');
在这里可以写数组const data = { },但是想要在send里面发送,就需要把data变成JSON数据
let str = JSON.stringify(data) , 再把str放到下面的send里面
发送 xhr.send( ); //send里的内容会出现在浏览器 NetWorks -- Headers -- Request Payload里面,里面写的内容服务端要能处理
事件绑定 xhr.onreadystatechange = function( ){ }
在函数里 先判断 xhr.readyState 判断有没有收到结果
在通过比如xhr.status >=200 && …返回的结果用if语句处理服务器端返回的结果
在这里可以把JSON转化为对象,
自动转换需要在xhr.open上面设置响应体数据类型xhr.responseType = 'json',result.innerHTML = xhr.response;
nodemon可以解决重启服务端代码时候需要重启
IE缓存问题
IE会保存下来AJAX, 不能即使获取服务器最新数据
在xhr.open里面的url里面后面加上/ie?t=' + Date.now( )
超时和网络异常处理
在js文件里面app.get -- response.setHeader( 里面设置延时响应 setTimeout( ()=>{ response.send(….) } , 3000 )
在HTML文件里 要设置超时时间 xhr.timeout = 2000 ,超时回调 xhr.ontimeout = function( ){ }
网络异常时 xhr.onerror = function( ) { }
AJAX 取消请求
let x = null;
给不同的按钮绑定不同的事件,第一个按钮添加x.send( ),第二个按钮添加x.abort( )
AJAX重复发送
发送新的时候要把上一个没有发完的取消掉
let isSending = false ;
在事件响应函数里, isSending = true
在onreadystatechange 里面当x.readyState ===4 时 isSending = false
if(isSending) x.abort( ); //如果正在发送,则取消掉该请求,创建一个新的请求
Axios发送AJAX请求
axios({ })
method
url
params
headers
data
使用fetch发送AJAX请求
用到了promise里的then
同源策略
协议、域名、端口相同
CROS
本文作者:oaoa
本文链接:https://www.cnblogs.com/oaoa/p/14678865.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
2019-04-19 1017 A除以B
2019-04-19 strlen( )和 sizeof( )的区别