Jquery Ajax
这一节学的很晕乎,虽然看完了,但还是很懵,不太清楚如何应用,实际作用
特征:异步、无刷新
(学习dom)
XML简介
XML 可扩展标记语言
XML 被设计用来传输和存储数据
XML和HTML类似,不同的是HTML中都是预定义标签,而XML没有预定义标签,全都是自定义标签,用来表示一些数据。
现在已经被json取代了。
{"name":"孙悟空","age":18,"gender":"男"}
AJAX的特点
AJAX的优点:
(1)可以无需刷新页面与服务器端进行通信
(2)允许你根据用户时间来更新部分页面内容
AJAX的缺点:
(1)没有浏览历史,不能回退
(2)存在跨域问题(同源)
(3)SEO不友好
AJAX的使用
HTTP协议请求报文与响应文本结构
HTTP协议[超文本传输协议],协议详细规定了浏览器和万维网辐鳍鳍之间互相通信的规则。
请求报文
重点格式和参数
、、、
行 POST
头 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
Content-encoding:gzip
空行
体
<head>
<body>
<h1>
好好学习
</h1>
</body>
</head>
AJAX-express框架介绍与基本使用
AJAX发送POST请求
鼠标放到方框里面发送post请求,返回结果(响应体结果)在div里面进行一个呈现。
请求体部分格式不固定,都可以写
AJAX设置请求头信息
一般身份校验部分信息可以放在这部分,可以设置请求头信息部分
//2.设置请求头
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
Content-Type 设置请求体类型;后面是参数查询字符串内容,固定内容
也可以自定义头信息
xhr.setRequestHeader('name', 'xiaohei')
存在安全机制就会报错,可以添加一个特殊响应头
//可以接收任意类型的请求all
app.all('/server', (request, response) => {
//设置响应头,设置允许跨域
response.setHeader('Access-Control-Allow-Origin', '*');
//响应头 增加设置特殊响应头
response.setHeader('Access-Control-Allow-Headers', '*');
//设置响应体
response.send('hello ajax post');
});
服务端响应json数据
手动对数据进行转换
if (xhr.readyState === 4) {
if (xhr.status >= 200 && xhr.status < 300) {
// console.log(xhr.response);
// result.innerHTML = xhr.response;
//手动对数据进行转换
let data = JSON.parse(xhr.response);
console.log(data);
result.innerHTML = data.name;
}
}
自动对数据进行转换
//设置响应体数据的类型
xhr.responseType = 'json';
console.log(xhr.response);
result.innerHTML = xhr.response.name;
nodemon自动重启工具
必须提前安装nodejs
终端窗口
安装
PS E:\VS Code\AJAX\原生AJAX> npm install -g nodemon
启动 windows11 前面要加npx
PS E:\VS Code\AJAX\原生AJAX> npx nodemon server.js
AJAX 网络超时和异常
<body>
<button>点击发送请求</button>
<div id="result"></div>
<script>
const btn = document.getElementsByTagName('button')[0];
const result = document.querySelector('#result');
btn.addEventListener('click', function () {
const xhr = new XMLHttpRequest();
//超时设置 2s 设置
xhr.timeout = 2000;
//超时回调
xhr.ontimeout = function () {
alert("网络异常,请稍后重试!");
}
xhr.onerror = function () {
alert("你的网络似乎出了一些问题!");
}
xhr.open("GET", 'http://127.0.0.1:8000/delay');
xhr.send();
xhr.onreadystatechange = function () {
if (xhr.readyState === 4) {
if (xhr.status >= 200 && xhr.status < 300) {
result.innerHTML = xhr.response;
}
}
}
})
</script>
</body>
app.get('/delay', (request, response) => {
//设置响应头 设置允许跨域
response.setHeader('Access-Control-Allow-Origin', '*');
setTimeout(() => {
//设置响应体
response.send('延时响应');
}, 3000);
})
取消请求
<body>
<button>点击发送</button>
<button>点击取消</button>
<script>
//获取元素对象
const btns = document.querySelectorAll('button');
let x = null;
btns[0].onclick = function () {
x = new XMLHttpRequest();
x.open("GET", 'http://127.0.0.1:8000/delay');
x.send();
}
//abort
btns[1].onclick = function () {
x.abort();
}
</script>
</body>
请求重复发送问题
<body>
<button>点击发送</button>
<button>点击取消</button>
<script>
//获取元素对象
const btns = document.querySelectorAll('button');
let x = null;
//标识变量
let isSending = false;//是否正在发送AJAX请求
btns[0].onclick = function () {
//判断标识变量
if (isSending) x.abort();//如果正在发送,则取消改请求,创建一个新的请求
x = new XMLHttpRequest();
//修改标识变量的值
isSending = true;
x.open("GET", 'http://127.0.0.1:8000/delay');
x.send();
x.onreadystatechange = function () {
if (x.readyState === 4) {
//修改标识符
isSending = false;
}
}
}
//abort
btns[1].onclick = function () {
x.abort();
}
</script>
</body>
jquery发送ajax
<script>
$('button').eq(0).click(function () {
$.get('http://127.0.0.1:8000/jquery-server', { a: 100, b: 200 }, function (data) {
console.log(data);
}, 'json')
})
$('button').eq(1).click(function () {
$.post('http://127.0.0.1:8000/jquery-server', { a: 100, b: 200 }, function (data) {
console.log(data);
})
})
</script>
//jquery服务
app.all('/jquery-server', (request, response) => {
//设置响应头 设置允许跨域
response.setHeader('Access-Control-Allow-Origin', '*');
// response.send('hello jqery');
const data = { name: '星期三' };
response.send(JSON.stringify(data));
})
jQuery发送AJAX请求
$('button').eq(2).click(function () {
$.ajax({
//url
url: 'http://127.0.0.1:8000/jquery-server',
//参数
data: { a: 100, b: 200 },
//请求类型
type: 'GET',
//响应体结果
dataType: 'json', //返回值就会变成一个对象,手动设置
//成功的回调
success: function (data) {
console.log(data);
},
//超时时间
timeout: 2000,
//失败的回调
error: function () {
console.log('出错啦!');
}, //超时,网络异常都会报错,切换到delay,设置延时响应
//头信息
headers: {
c: 300,
d: 400
}
})
})
axios函数发送AJAX请求
<body>
<button>GET</button>
<button>POST</button>
<button>AJAX</button>
<script>
const btns = document.querySelectorAll('button');
//配置url
axios.defaults.baseURL = 'http://127.0.0.1:8000';
btns[0].onclick = function () {
//GET请求
axios.get('/axios-server', {
//url参数
params: {
id: 100,
vip: 7
},
//请求头信息,headers必须小写,不然参数传不进去,name里面参数也必须是英文
headers: {
name: 'Friday', //不能是中文
age: 24
}
}).then(value => {
console.log(value);
});
}
btns[1].onclick = function () {
axios.post('/axios-server', {
username: 'admin',
password: 'admin'
}, {
//url
params: {
id: 200,
vip: 9
},
//请求头参数
headers: {
height: 180,
weight: 150,
}
});
}
</script>
</body>
通用方法
btns[2].onclick = function () {
axios({
//请求方法
method: 'POST',
//url
url: '/axios-server',
//url参数
params: {
vip: 10,
level: 30
},
//头信息
headers: {
a: 100,
b: 200
},
//请求体参数
data: {
username: 'admin',
password: 'admin'
}
}).then(response => {
console.log(response);
//响应状态码
console.log(response.status);
//响应状态字符串
console.log(response.statusText);
//响应头信息
console.log(response.headers);
//响应体
console.log(response.data);
})
使用fetch函数发送ajax请求
<body>
<button>AJAX请求</button>
<script>
const btn = document.querySelector('button');
btn.onclick = function () {
fetch('http://127.0.0.1:8000/fetch-server', {
//请求方法
method: 'POST',
//请求头
headers: {
name: 'Friday'
},
//请求体
body: 'username=admin&password=admin'
}).then(response => {
// return response.text();
return response.json();
}).then(response => {
console.log(response);
});
}
</script>
</body>
跨域
同源策略
同源策略最早由Netscape公司提出,是浏览器的一种安全策略。
同源:协议、域名、端口号,必须完全相同
违背同源策略就是跨域
如何解决跨域
JSONP
JSONP是一个非官方的跨域解决方案,只支持get请求。
<body>
<div id="result"></div>
<script>
//处理数据
function handle(data) {
//获取result元素
const result = document.getElementById('result');
result.innerHTML = data.name;
}
</script>
<!-- <script src="http://127.0.0.1:5500/%E8%B7%A8%E5%9F%9F/JSONP/js/app.js"></script> -->
<script src="http://127.0.0.1:8000/jsonp-server"></script>
</body>
//JSONP服务
app.all('/jsonp-server', (request, response) => {
// response.send('console.log("hello jsonp")');
const data = {
name: '星期五'
};
//将数据转化为字符串
let str = JSON.stringify(data);
//返回结果
response.end(`handle(${str})`);//返回的是一个函数形式,但是函数的实参就是想给客户端返回的结果数据
});
原生jsonp实践
<body>
用户名:<input type="text" id="username">
<p></p>
<script>
//获取input元素
const input = document.querySelector('input');
const p = document.querySelector('p');
//申明handle函数
function handle(data) {
input.style.border = 'solid 1px red';
//修改p标签的提示文本
p.innerHTML = data.msg;
}
//绑定事件
input.onblur = function () {
//获取用户的输入值
let username = this.value;
//向服务端发送请求,检测用户名是否存在
//1.创建一个script标签
const script = document.createElement('script');
//2.设置标签的src属性
script.src = 'http://127.0.0.1:8000/check-username';
//3.将script插入到文档中
document.body.appendChild(script);
}
</script>
</body>
//用户名检测是否存在
app.all('/check-username', (request, response) => {
// response.send('console.log("hello jsonp")');
const data = {
exist: 1,
msg: '用户名已经存在'
};
//将数据转化为字符串
let str = JSON.stringify(data);
//返回结果
response.end(`handle(${str})`);//返回的是一个函数形式,但是函数的实参就是想给客户端返回的结果数据
});
CORS
CORS(cross-origin resource sharing),跨域资源共享。他的特点是不需要在客户端做任何特殊的操作,完全在服务器中进行处理,支持get和post请求。跨域资源共享标准新增了一组HTTP首部字段,允许服务器生命哪些源站通过浏览器权限访问哪些资源。
CORS是通过设置一个响应头告诉浏览器。该请求允许跨域,浏览器收到该响应以后就会对响应放行。
<body>
<button>发送请求</button>
<div id="result"></div>
<script>
const btn = document.querySelector('button');
btn.onclick = function () {
//1.创建对象
const x = new XMLHttpRequest();
//2.初始化设置
x.open("GET", "http://127.0.0.1:8000/cors-server");
//3.发送
x.send();
//4.绑定事件
x.onreadystatechange = function () {
if (x.readyState === 4) {
if (x.status >= 200 && x.status < 300) {
//输出响应体
console.log(x.response);
}
}
}
}
</script>
</body>
//cros
app.all('/cors-server', (request, response) => {
//设置响应头
response.setHeader("Access-Control-Allow-Origin", "*");
response.setHeader("Access-Control-Allow-Headers", "*");
response.setHeader("Access-Control-Allow-Methods", "*");
response.send('hello CROS');
});
简单介绍
1.1 $ajax
jquery调用ajax方法:
格式: $.ajax({});
参数:
type:请求方式GRT/POST(需要服务器的支持)
url:请求地址url
async:是否异步,默认true表示异步
data:发送到服务器的数据
dataType:预期服务器返回的数据类型
contentType:设置请求头
success:请求成功时调用函数
error:请求失败调用函数
}
}
}
</script>
```
//cros
app.all('/cors-server', (request, response) => {
//设置响应头
response.setHeader("Access-Control-Allow-Origin", "*");
response.setHeader("Access-Control-Allow-Headers", "*");
response.setHeader("Access-Control-Allow-Methods", "*");
response.send('hello CROS');
});
简单介绍
1.1 $ajax
jquery调用ajax方法:
格式: $.ajax({});
参数:
type:请求方式GRT/POST(需要服务器的支持)
url:请求地址url
async:是否异步,默认true表示异步
data:发送到服务器的数据
dataType:预期服务器返回的数据类型
contentType:设置请求头
success:请求成功时调用函数
error:请求失败调用函数