一、ajax基础
- ajax概述
数据是存放在服务端的,无法通过已知的API获取
我们希望对服务端发送请求并且接受服务端返回的响应,是否可以通过js向服务端发送请求,不再是“单机游戏”模式呢?
AJAX:使我们可以通过js直接获取服务端最新的内容,而不必重新加载页面,同时让web更接近桌面应用的功能。比如 google搜索,输入某个内容,会实时弹出相关内容,优化了用户体验。
AJAX是浏览器提供的一套API,可以通过js调用,实现通过代码控制请求和响应。
应用场景:按需获取数据;对用户数据检验;自动更新页面内容;提升用户体验,无需刷新
-
ajax体验
jq中的ajax方法:获取指定接口的数据,在浏览器中查看:
$.ajax({
url: "https://jsonplaceholder.typicode.com/users",
type: "GET",
dataType: "json",
data: {"id": 1},
success: function (data) {
// 使用请求成功的数据
console.log(data);
}
})
3.原装ajax
发送ajax请求的步骤,4步:相比于jq的ajax方法要复杂一些:
// 1.创建一个 XMLHttpRequest 类型的对象 --- 相当于打开了一个浏览器
var xhr = new XMLHttpRequest();
// 2.打开一个与网址之间的连接 --- 相当于在地址栏输入网址,访问json-placeholder这个服务器上的数据了
xhr.open("GET","https://jsonplaceholder.typicode.com/users");
// 3.通过连接发送一次请求 --- 相当于点击回车或者超链接
xhr.send(null);
// 4.指定 xhr 状态变化事件处理函数 --- 相当于处理网页呈现后的操作
xhr.onreadystatechange = function () {
// 通过判断 xhr 的 readyState ,确定此次请求是否完成
if (this.readyState === 4) {
console.log(this.responseText)
}
}
4.XMLHttpRequest类型对象
AJAX API中的核心提供的是XMLHttpRequest类型对象,所有的ajax操作都需要用到这个对象
创建该对象的兼容写法:
// 1.创建一个 XMLHttpRequest 类型的对象
var xhr = null;
// 兼容写法
if (window.XMLHttpRequest) {
// 标准浏览器
xhr = new XMLHttpRequest();
} else {
// IE 6 浏览器
xhr = new ActiveXObject("Microsoft.XMLHTTP");
}
-
open()方法开启请求
第一种:GET 方法,获取服务器数据,不上传或修改数据:
xhr.open("GET","https://jsonplaceholder.typicode.com/users?id=1");
第二种:POST方法,增加服务器数据,将本地json文件上传至自己制作的服务器端口:
xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
-
send()方法发送请求GET方法和Post方法有差别,Get方法的数据体是直接在网址上修改
GET方法的send(),无参数或者参数为null:
xhr.send(null)
POST方法的send(),需要先设置请求头
xhr.setRequestHeader()xhr.send("name=harry&age=19");
send()中的参数为数据体, Get方法的数据体在网址上修改参数则为字符串格式的 数据 ,用于上传到服务端的
-
响应状态分析
send()方法执行之后有3个状态,通过readyState 的值来反映:
headers received:
xhr.readyState==2
loading:
xhr.readyState==3
此时数据可能还未上传完毕done:
xhr.readyState==4
此时数据完全上传完毕 -
同步和异步
同步: 一个人在同一时刻只能做一件事情,执行一些需要时间的事情需要先等待
异步:可以同时做多件事情
xhr.open( ) 参数为boolern值,默认为 true,表示异步进行加载 ,不建议使用同步加载方式,为了让其这个事件一定触发,可以在发送请求send()之前,先注册readystatechange这个方法,保障同步异步都可以成功
-
响应数据格式
XML格式:一直数据描述手段,很老,现在不用,数据冗杂太多,不好进行操作
-
JSON格式 ,服务端采用JSON返回数据,客户端按照JSON数据处理数据
json数据不需要存到变量中,可以新建 json文件,格式 是一个{ },内部类似对象子面量的写法,不过区别是属性名必须加 “ ” ,不用;结尾
// 创建新的json文件中书写`
`{`
`"name": "tom",`
`"age": 19,`
`"hobby": ["novel","sing"]`
`}
字符串里面内容是json数据也是可以的:var str = {"name": "tom","age": 80};
此时,JSON 对象的 parse 方法可以将 json 格式的字符串转换成 对象格式:
var strObj = JSON.parse(str);
console.log(strObj.name)
JSON对象中的方法 stringfy 把字面量方法创建的对象obj转换为字符串:
console.log(JSON.stringify(obj));
服务端不管采用XML和JSON数据 本质上都是讲数据返回客户端
- json-server
平时我们自己也会写一写数据,通过Ajax获取,所有需要再本地搭建一个临时服务器
json-server可以使用它快速搭建一个Web服务器
网址:
搭建步骤:1.安装 2.定制自己的db-json文件 3.再将这个数据库部署到我们的服务器上 (打开 vscode 的终端功能,在第一行书写json-server 然后 --watch db-json)4.最后可以根据服务器分配给我们的接口进行访问了 我们新建的服务器就是类似 json-placeholder这种的
- json文件书写方法
"users": [
{
"id": 1,
"name": "tom",
"age": 19,
"class": 1
},
{
"id": 2,
"name": "jerry",
"age": 18,
"class": 2
},
{
"id": 3,
"name": "lucy",
"age": 19,
"class": 1
},
{
"name": "lily",
"age": "19",
"class": "2",
"id": 4
},
{
"name": "lulu",
"age": 18,
"class": 2,
"id": 5
},
{
"name": "harry",
"age": 18,
"class": 1,
"id": 6
},
{
"name": "john",
"age": "19",
"class": "2",
"id": 7
}
],
"posts": [
{
"id": 1,
"userId": 1,
"title": "javascript",
"content": "js 是一门非常好学语言"
},
{
"id": 2,
"userId": 1,
"title": "jquery",
"content": "jq 是一门非常好学语言"
},
{
"id": 3,
"userId": 2,
"title": "html",
"content": "html 是一门非常好学语言"
},
{
"id": 4,
"userId": 3,
"title": "css",
"content": "css 是一门非常好学语言"
}
],
"comments": [
{
"id": 1,
"postId": 1,
"content": "good"
},
{
"id": 2,
"postId": 3,
"content": "better"
},
{
"id": 3,
"postId": 4,
"content": "best"
}
]
}
书写完成后,打开vscode的终端,输入 json-server ,和--watch自己的文件名dbs-json,打开其中一个分配的接口如uesr,点击进入,可以通过/ 的方法查找不同的属性,如 / 1 可以筛选id为1的user即 tom 的各个属性,也可以继续添加/posts,可以查找 userid为1的post
13.原生AJAX 方法
GET方法,获取服务器数据:参数传递都是通过url地址中的 ?来传递的,无需设置请求头,无需设置响应体,或者传null或者可以直接不传
xhr.send(null);
xhr.onreadystatechange = function () {
if (this.readyState === 4) {
console.log(this.responseText);
}
}
POST方法,更改增加服务器数据:需要设置请求头(setRequestHeader)中的Contrent-Type ,传递的数据也就是请求体,写在send()方法的参数上,send参数是字符串格式的
xhr.open("POST","http://localhost:3000/users");
然后设置请求头(setRequestHeader)
send()中请求体的几种情况:不同的请求体,其请求头的写法有不同
第一种简单版:增加的属性之间 用 & 符号连接
xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
xhr.send("name=lily&age=19&class=2");
第二种:json格式 ,用模板字符串,可以换行,请求头也变了
xhr.setRequestHeader("Content-Type","application/json");
xhr.send(`{
"name": "lulu",
"age": 18,
"class": 2
}`);
//第三种:请求头和第二种一样的,都是json格式,运用json.stingfly 把对象字面量格式转换为json格式的字符串,不用模板字符串
xhr.setRequestHeader("Content-Type","application/json");
xhr.send(JSON.stringify({
"name": "harry",
"age": 18,
"class": 1
}));
//设置完成后,可以检验是否完成:
xhr.onreadystatechange = function () {
if (this.readyState === 4) {
console.log(this.responseText);
}
}</pre>
14.处理响应数据渲染
15.封装AJAX库
可以多次操作ajax,就不用一边一边去书写了
必须的几个参数:
- 参数1:{string} method 请求方法
- 参数2:{string} url 请求地址
- 参数3:{Object} params 请求参数
- 参数4:{function} done 请求完成后执行的回调函数
16.一个完整的AJAX封装函数如下:
// 统一将方法中的字母转大写,便于后面判断
method = method.toUpperCase();
// 书写 IE 6 的兼容
var xhr = window.XMLHttpRequest
? new XMLHttpRequest()
: new ActiveXObject("Microsoft.XMLHTTP");
// 将对象格式的参数转为 urlencoded的格式
var pairs = [];
for (var k in params) {
pairs.push(k + "=" + params[k]);
}
var str = pairs.join("&");
// 判断是否是 get 方法,需要更改 url 的值
if (method === "GET") {
url += "?" + str;
}
// 创建打开一个连接
xhr.open(method, url);
var data = null;
// 如果是 post 方法,需要设置请求头,还有请求体
if (method === "POST") {
xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
data = str;
}
xhr.send(data);
// 执行回调函数
xhr.onreadystatechange = function () {
if (this.readyState !== 4) return;
// 执行外部传进来的回调函数即可
// 需要用到响应体
done(JSON.parse(this.responseText));
}
}
// 调用函数
ajax("GET", "http://localhost:3000/users",{"id": 1},function (data) {
console.log(data);
});
ajax("POST", "http://localhost:3000/users",{"name": "john","age": 19,"class": 2},function (data) {
console.log(data);
});
二、ajax常用库
-
jq中的 ajax,更加方便,可以参考 w3c 的 jq 参考手册
$.ajax({ 内容如下 ,包含多种属性} ) 其参数是一个 配置 的对象,对象中包含多种属性,如:
url 服务端口 ;
type 请求方法,默认为 "get" ;
dataType: "json" (如果数据是json格式的话)
data:传递到服务端的数据,如果是GET方法就通过URL传递,如果POST就通过请求体传递
timeout:请求超时时间
四个回调的方法:
beforeSend:请求发起时 触发
success:请求成功时候触发,比较常用,因为都会希望请求成功
error:请求失败触发
complete:请求完成后触发(不管是否成功)
回调函数:查询请求的状态如何
console.log("before send");`
`},` //会先于后面输出
`success: function (data) {`
`console.log(data); //成功后会将data转换为对象格式输出在控制台
`},`
`error: function (xhr) {`
`console.log(xhr);`
`}, //如果请求的地址不对,则会显示404,请求的data{} 为错误的话,只会返回空对象,不会返回错误
`complete: function (xhr) {`
`console.log(xhr);`
`}`
`});`
2.$.get() 方法
传统的$.ajax( )实现:
$.ajax({
url: "http://localhost:3000/comments",
type: "get",
dataType: "json",
data: {"id": 2},
success: function (data) {
console.log(data);
}
})
.get(“url” ,data{ } ,回调函数 ) ,如果需要另外的参数,可以参考w3c文档:
$.get("http://localhost:3000/comments", {"id": 1}, function (data) {
console.log(data);
})
3.$.post( )方法
传统的$.ajax( )实现:传入新的数据 data: {"postId": 2, "content": "bad"},
$.ajax({
url: "http://localhost:3000/comments",
type: "post",
dataType: "json",
data: {"postId": 2, "content": "bad"},
success: function (data) {
console.log(data);
}
})
$.post("http://localhost:3000/comments", {"postId": 3, "content": "bad"},function (data) {
console.log(data);
})
4.其他类型请求
put请求,只能由$.ajax()方法实现,功能是可以 更改数据,和post有些类似:
$.ajax({
url: "http://localhost:3000/comments/4",
type: "put",
dataType: "json",
data: {"content": "good", "postId": 2},
success: function (data) {
console.log(data)
}
})
// delete 请求,删除数据,没有data这一属性,直接在url上选择要删除的数据
$.ajax({
url: "http://localhost:3000/comments/5",
type: "delete",
success: function (data) {
• console.log(data)
}
})
jQery其他的方法,也可以在jQery参考手册进行自学,如:
// ajaxSetup() 方法,设置默认的参数
$.ajaxSetup({
url: "http://localhost:3000/users",
type: "post"
})
之后所有的ajax请求,url和type都不需要书写了,已经通过$.ajaxSetup() 方法设置好了
5.Axios介绍:是目前应用最为广泛的ajax库
中文官网:axios-js.com 支持promise,后续会学到promise
Axios库:直接用sript标签引用
体会 get 请求
axios.get("http://localhost:3000/posts")
.then(function (response) {
• console.log(response.data)
})
.catch(function (error) {
• console.log(error)
})</pre>
6.Axios API
axios方法:配置项如下:
axios({
url: "/comments",
method: "post",
//基础url,多个端口的公共部分,是完整url地址的前缀,此时url只用写完整url
的后面部分
baseURL: "http://localhost:3000",
//请求头一般默认是"application/json"
headers: {
• "Content-Type": "application/json"
},
timeout: 1000,
//传入json格式数据
data: {
• "postId": 3,
• "content": "better"
}
//params :即将与请求一起发送的url参数,当方法类型为get 和 delete时,直接在url地址上进行获取或者删除的时候,可以设置这个参数
//以json格式返回,会转换为对象格式
}).then(function (res) {
console.log(res.data)
}).catch(function (error) {
console.log(error)
})
7.axios方法的全局默认值
在axios方法之前进行配置:
axios.defaults.baseURL = "http://localhost:3000";
配置baseurl的默认值
8.axios方法的参数,不用设置配置项,直接把url设置为第一个参数:
axios("http://localhost:3000/posts", {
params: {
• id: 1
}
})
//不用设置回调函数,then方法设置成功后的效果,参数res 是返回的响应体response
.then(function (res) {
console.log(res.data)
})
.catch(function (error) {
console.log(error)
})
拦截器
快速请求方法 get 和post delete put 增删改查
//直接在url上修改,也可以设置params
axios.get("http://localhost:3000/users?id=2")
.then(function (res) {
• console.log(res.data)
})
//设置params
axios.get("http://localhost:3000/users",{
params: {
id: 3
}
})
// post 请求 ,添加数据,数据直接作为了参数,不用写成 date:{}格式了
axios.post("http://localhost:3000/users",{
"name": "nancy",
"age": 19,
"class": 2
})
.then(function (res) {
console.log(res.data)
})</pre>
11.onload / onprogress
xhr. onload 事件,只在 请求完成时触发,相当于readyState=4的阶段
xhr.onprogress 事件 ,只在请求时触发,相当于readyState=3的阶段
事件对象有两个属性:loaded 和 total
xhr.onprogress = function (e) {
console.log("progress",this.readyState)
// 在周期性请求过程中,接收到的数据的个数
console.log(e.loaded);
// 接收数据的总个数
console.log(e.total);
}
xhr.send(null);
12.response属性和responseType
var xhr = new XMLHttpRequest();
xhr.open("GET", "http://localhost:3000/posts");
//设置响应体的数据类型为json,就不用像之前那样用json.stringfy("responseText")把字符串转换为对象了
xhr.responseType = "json";
xhr.onload = function () {
console.log(this.response);
}
xhr.send(null);
三、跨域和模板引擎
-
JSONP原理
是一种借助script标签发送跨域请求的技巧,原理是在script 标签请求服务端的一个地址
返回一段带有某个全局函数调用的Javascript脚本
-
jq中的jsonp
$.ajax() ,使用时将dateType设置为sonp 即可
$.ajax({
• url: "https://www.baidu.com/sugrec?pre=1&p=3&ie=utf-8&json=1&prod=pc&from=pc_web",
• type: "GET",
• dataType: "jsonp",
• jsonp: "cb", //这条属性可以设置回调函数的参数名称(必须与后台接口的回调函数参数名保持一致)
• jsonpCallback: "abc", //jQ 自动分配的回调函数的名称进行重命名
• data: {"wd": "ajax"},//wd 表示文字,是百度的一种要求格式,“ajax”是输入的搜索内容
• success: function (data) {
• console.log(data)
• }
})
目的:点击按钮,获取 输入“ajax”文字后,控制台返回的与之有关的提示语,如 ajax的跨域,ajax的同步异步等信息
什么是cors跨域:客户端不需要做出变化,只需要服务端在被请求的时候添加一个Acess-Control-Allow-Origin的响应头
Acess-Control-Allow-Origin的值 :* 便是允许任意源访问
http://foo.coom 允许指定的源访问
3.模板引擎的作用
减少字符串拼接 ; 在模板里解析json,然后跟html内容拼接,性能也更好,可以不用进行字符串的拼接
如腾讯的 art-Template,模板引擎
常用语法 <% 与 %>符号包裹起来的语句为模板的逻辑表达式,如for循环的书写格式
、 <% for (var i = 0 ; i < 5 ; i++) { %>
<div>这是一个模板中的 div<%= i %></div>
<!-- name 是参数二这一对象的属性名,可以作为变量 -->
<div>这是一个模板中的 div<%= name %></div>
<% } %>
将模板内的内容添加到 box 里面:
// template() 方法可以调用模板内容
// 参数1: 调用的模板的id
// 参数2:是一个对象型的数据,数据会传给模板,对象中的每个属性的属性名在模板中可以直接当变量名使用
$(".box").html(template("tem", {name: "tom"}));
四、Git操作
1.git是分布式代码管理
git安装和初始化 官网 https://www.git-scm.com
git配置:用户信息配置 输入: $git config --golbal user.name "
自己的名字"
用户邮箱信息配置 : $git config --global user.ema
l " 自己的邮箱地址"
2.工作区:自己写html css js 工作文件的地方,文件传到暂存区暂存
暂存区: 在内存暂时存储
版本库: 觉得暂存区的内容没有问题,可以存到版本库,真正存放本地内容的地方
3.初始化
托管文件夹:创建一个空白文件夹,右键打开 git bash ,输入自己的命令:
输入 $git init
回车后就初始化成功了
4.提交到本地仓库
第一步:把文件提交到暂存区:
git add./
文件的url 提交某个文件
git add ./
提交所有文件
第二步:git commit -m “提交的注释信息”
提交到版本库, 每次修改文件之后再次提交都需要这两部
状态查看 :git status
查看你上次提交之后是否对文件发生过修改
如果自己改了文件,没有再次书写 git add .
,书写 git status
可以进行查看
5.提交日志
git log --oneline
可以直接查看自己添加的注释信息
6.回退版本
git reset Head~ i
回退到上i个版本,会保留历史记录
git reset --hard Head~i
强制退回到上i个版本,删除后续的历史记录,尽量不用
git reflog
7.分支 合并 和冲突处理 (git的精髓所在)
执行 git init的时候,默认git 会为自己创建一个master 分支
master 分支是我们存储的主分支 ,我们需要创建临时分支,后期测试
没有问题,才能将测试分支合并到主分支,工作时每个人会有临时分支进行分配
实际工作时是不允许在主分支直接修改的
创建分支命令 :
git branch
(分支名) 如 git branch dev 添加了一个dev的分支
git checkout(分支名)
如 :git checkout dev
切换到dev这一个分支,也可以切换到主分支
将没有问题的临时分支 如 dev 合并到主分支:
首先先切换到主分支 git checkout master
然后合并git merge dev
冲突和如何解决冲突
如果这时修改了文件,相当于主分支修改了,然后提交,切换到dev分支,在dev分支 再
次修改文件,提交,这个时候就有了冲突,需要再工作区进行手动更改,选择哪条分支由领导再次
决定,也可以选择两条都保留,冲突解决后,只是工作区有了更改,需要再次提交add 和commit
Github :
就是把版本库的本地文件传到Github进行托管
自己先注册, 首先点击右上角 + 号,新建一个仓库,然后获取自己仓库的链接url
git clone origin
可以直接从远端仓库克隆岛本地;
连接远端仓库 git remote add origin + 仓库的url
git push origin master
推送到指定的master分支
在第一次推送时会提示你输入账号密码,然后根据提示操作即可
刷新自己的远端仓库,可以看到已经传输成功的文件
如果想要推送 dev 分支
先切换到 dev 分支,还是使用push 命令
推送完成后:
使用 git pull origin master
、可以将选段仓库的内容下拉到本地,每次push值前,记得
进行一次pull
克隆:新建一个文件,右键打开 git bash ,先初始化
连接远端仓库:git remote add origin + 仓库的url
克隆:git clone +仓库的url
在本地仓库存在的情况下,可以将远端仓库的内容下拉到本地:
git pull origin master
这样可以将本地仓库和远端仓库最新分支版本进行合并
VScode 可视化操作
左侧第三个图标 ,点击+号把指定的文件传到暂存区,点击上方的√ 传到 版本库,可以在下方的文本框输入 注释 下方的云端 小图标,可以直接帮助我们进行push 和 pull 的操作
在三个点,可以有更多操作 ,如克隆 创建分支 更改分支等功能