一、AJAX的特点
1.优点
① 可以无需刷新页面而与服务器进行通信
② 允许根据用户事件来更新部分页面内容
用户事件比如:鼠标点击、经过......(例如京东:往下滑动,一些页面被加载出来)
2.缺点
① 没有浏览历史 不能回退
② 存在跨域问题
③ SEO不友好
对搜索引擎不友好,打开页面,后面的内容(比如京东的商品名称)在网页源代码中搜索不到。
二、XML
XML可扩展标记语言
XML被设计用来传输和存储数据。
XML和HTML类似,不同的是HTML中都是预定义标签,而XML中没有预定义标签,用来表示一些数据。
XML表示
<student>
<name>小王</name>
<age>18</age>
<gender>男</gender>
</student>
现在被JSON取代了
用JSON表示
{"name":"小王","age",18,"gender":"男"}
三、搭建框架
想要前端向服务器发送请求,要利用node.js 和 express框架把我们的电脑变成服务器。
1.下载node.js
下载 Node.js 中文网地址
http://nodejs.cn/download/
按照顺序安装完毕。
打开控制台(win + R cmd)
依次输入
node -v
npm -v
可以查看到版本即为安装成功,如图:
2.搭建express框架
第一次安装走的是外网,需要更改成国内的镜像地址:
在控制台 输入
https://registry.npm.taobao.org
出现:
npm config get registry
vscode 右键对应文件:在集成终端中打开(英文为模式:Open in Intergrated Terminal)
选择终端(terminal)
输入:
npm init -y
npm install express --save
有可能出现报错:
重新打开vs code即可。
四、学习AJAX
1.express基本使用
//1.引入expression
var express = require("express");
//2.创建应用对象
var app = express();
//3.创建路由规则
//request 是对请求报文的封装
//response 是对响应报文的封装
app.get("/",function(request,response) {
// 设置相应内容
// hello express是服务器响应给我的字符串
response.send("hello express");
})
//监听端口启动服务
//如果端口号被占用,则无法启动
app.listen(3000,function() {
console.log("服务已经启动了");
})
打开此文件的终端,输入 node .\文件名字(写一半名字可以用tab键补全)
打开浏览器输入本地回送地址:127.0.0.1:3000(3000是端口号,跟自己写的相对应)
注意:. 和 : 都要用英文书写符号
hello express 是服务器响应给我的字符串
2.get请求方式:
点击按钮获取响应内容。
后台写法
//1.引入expression
var express = require("express");
//2.创建应用对象
var app = express();
//3.创建路由规则
//request 是对请求报文的封装
//response 是对响应报文的封装
//get请求
app.get("/server",function(request,response) {
//设置响应头
response.setHeader("Access-Control-Allow-Origin","*");
// 设置响应内容
response.send("hello ajax");
})
//监听端口启动服务
app.listen(5000,function() {
console.log("服务已经启动了");
})
前台写法:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
div {
width: 200px;
height: 200px;
border: 1px solid red;
}
</style>
</head>
<body>
<button>点击发送请求</button>
<div></div>
<script>
var btn = document.getElementsByTagName("button")[0];
var div = document.getElementsByTagName("div")[0];
btn.onclick = function() {
//1.创建对象
var xhr = new XMLHttpRequest();
//2.初始化 设置请求方式 和 url (传输数据 ?以后)
xhr.open("get","http://127.0.0.1:5000/server?a=100&b=200&c=300");
//3.发送
xhr.send();
//4.事件绑定 处理服务端访问的结果
/* on 当....时候
readystate 是 xhr 对象中的一个属性 表示状态 0,1,2,3,4
0:初始化
1:open方法已经被调用完毕
2:表示send方法已经被调用完毕
3:服务端返回了部分的结果
4:服务端返回了所有的结果
change改变 */
xhr.onreadystatechange = function() {
//判断服务器返回了所有的结果
if(xhr.readyState === 4) {
//判断状态码 200 404 401 403 500
//2xx 都代表成功
if(xhr.status >= 200 && xhr.status < 300) {
console.log(xhr.status);
console.log(xhr.statusText);
console.log(xhr.getAllResponseHeaders());
console.log(xhr.response);
div.innerHTML = xhr.response;
}
}
}
}
</script>
</body>
</html>
输出:
分别对应:status , statusText , getAllResponseHeaders() , response
状态码200表示成功,响应头,相应内容
可以查看到请求的地址,请求方法等。
响应体里的内容,这是我们真正想要的后台给我们的内容(hello ajax)
//2.初始化 设置请求方式 和 url (传输数据 ?以后)
xhr.open("get","http://127.0.0.1:5000/server?a=100&b=200&c=300");
发送请求的参数:
也可以不加任何参数,只写地址。
通过下句代码把响应体里的内容传输到 div 里:
div.innerHTML = xhr.response;
3. POST请求方式:
鼠标经过获得响应体里的内容
后台写法:
//1.引入expression
var express = require("express");
//2.创建应用对象
var app = express();
//3.创建路由规则
//request 是对请求报文的封装
//response 是对响应报文的封装
//post请求
app.all("/server",function(request,response) {
//设置响应头 设置允许跨域
response.setHeader("Access-Control-Allow-Origin","*");
//允许设置自定义请求头信息
response.setHeader("Access-Control-Allow-Headers","*");
//设置响应体
response.send("HELLO ajax post");
})
//监听端口启动服务
app.listen(5000,function() {
console.log("服务已经启动了");
})
前台写法:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
div {
width: 200px;
height: 200px;
border: 1px solid red;
}
</style>
</head>
<body>
<div></div>
<script>
var div = document.getElementsByTagName("div")[0];
div.addEventListener("mouseenter",function() {
//1.创建对象
var xhr = new XMLHttpRequest();
//2.初始化 设置类型 和 url
xhr.open("post","http://127.0.0.1:5000/server");
//post 需要设置请求头
//Content-Type:设置请求体内容的类型,参数2:send方法中参数查询字符串的类型
xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
//在请求头中添加自定义信息
xhr.setRequestHeader("name","test");
//3.发送
xhr.send("username=xxx&pwd=123");
//xhr.send("username:xxx&pwd:123");
//xhr.send("ashjdgb");
//4.事件绑定
xhr.onreadystatechange = function() {
if(xhr.readyState === 4) {
if(xhr.status >= 200 && xhr.status < 300) {
//处理服务端返回的结果
div.innerHTML = xhr.response;
}
}
}
})
</script>
</body>
</html>
POST请求需要设置请求头,传输参数,不是像GET请求那样写在地址后面,而是:
xhr.send("username=xxx&pwd=123");
//xhr.send("username:xxx&pwd:123");
//xhr.send("ashjdgb");
传输参数的形式多样
如果与GET对比来看,后台代码:
app.post("/server",function(request,response) {
//设置响应头 设置允许跨域
response.setHeader("Access-Control-Allow-Origin","*");
//设置响应体
response.send("HELLO ajax post");
})
//多了一部分,而且 post 要改写为 all
//允许设置自定义请求头信息
response.setHeader("Access-Control-Allow-Headers","*");
POST可以设置自定义的请求头信息:
//在请求头中添加自定义信息
xhr.setRequestHeader("name","test");
查看结果:(蓝色那行)
4.JSON响应
① 后台响应的数据是JSON数据
② 鼠标经过获取响应体内容
后台代码:
//1.引入expression
var express = require("express");
//2.创建应用对象
var app = express();
//3.创建路由规则
//request 是对请求报文的封装
//response 是对响应报文的封装
//JSON 响应
app.all("/json-server",function(request,response) {
//设置响应头 设置允许跨域
response.setHeader("Access-Control-Allow-Origin","*");
//允许设置自定义请求头信息
response.setHeader("Access-Control-Allow-Headers","*");
//设置响应体(模拟一个数据)
var data = {
"name":"xxx"
}
//send里面不能直接填对象,将对象转换为字符串
var str = JSON.stringify(data);
response.send(str);
})
//监听端口启动服务
app.listen(5000,function() {
console.log("服务已经启动了");
})
前台代码:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
div {
width: 200px;
height: 200px;
border: 1px solid red;
}
</style>
</head>
<body>
<div></div>
<script>
var div = document.getElementsByTagName("div")[0];
div.addEventListener("mouseenter",function() {
//1.创建对象
var xhr = new XMLHttpRequest();
//设置响应体数据的类型
xhr.responseType = "json";
//2.初始化 设置类型 和 url
xhr.open("post","http://127.0.0.1:5000/json-server");
xhr.send();
xhr.onreadystatechange = function() {
if(xhr.readyState === 4) {
if(xhr.status >= 200 && xhr.status < 300) {
//处理服务端返回的结果
console.log(xhr.response);
div.innerHTML = xhr.response.name;
}
}
}
})
</script>
</body>
</html>
字符串转为json对象
//字符串转为json
//手动转换
// 手动把字符串转为对象
var data = JSON.parse(xhr.response);
// 输出 data 验证一下
console.log(data);
div.innerHTML = data.name;
//或者像代码中 自动转换
//设置响应体数据的类型
xhr.responseType = "json";
div.innerHTML = xhr.response.name;
5.nodemon
如果不想每次更新后台代码都关闭终端重新打开
可以在终端中输入:
npm i nodemon -g
如果报错:
在开始中找到 Windows PowerShell 里面的 Windows PowerShell 右键 以管理员打开
set-ExecutionPolicy RemoteSigned
输入 A 回车即可