Ajax
概念
一种使用js来异步获取xml格式数据的技术
请求方式
- 操作服务器上的数据除了需要使用url地址,还需要指定请求方式
- 操作服务器上的数据时
- 获取服务器上的数据,需要GET
- 新增数据,需要POST
- 删除数据,需要DELETE
- 完整修改(更新)数据,需要PUT
- 修改(更新)部分数据,需要PATCH
axios
说明
- 是前端最火的,专注于数据请求的库
使用方式
-
引入axios
-
数据查询
axios({ method:'get',//请求类型 url:'',//请求地址 params:{//查询参数 id:1 },//查询id=1的数据 }).then((result)=>{ console.log(result); }); //简写形式1 axios.get(url,{params:{参数}}).then(result => { console.log(result) }) //简写形式2----拼接url axios.get(url).then(result => { console.log(result) })
-
数据添加
axios({ method:'POST',//请求类型 url:'',//请求地址 data: { bookname: 'xx', author: 'xx', publisher: 'xx' } }).then((result)=>{ console.log(result); }); //POST请求中,data还可以接收字符串格式类型 axios({ method:'POST',//请求类型 url:'',//请求地址 data: 'bookname=xx&author=xx&publisher=xx' }).then((result)=>{ console.log(result); }); //简写形式1 axios.post(url,{参数}).then(result => { console.log(result) }) //简写形式2 -- 参数 = bookname=xx&author=xx&publisher=xx axios.post(url,'参数').then(result => { console.log(result) })
-
数据删除
axios({ method: "DELETE", url: "",//请求地址 params: { //请求参数 }, }).then((result) => { console.log(result); });
-
数据修改
axios({ method: "patch", url: "",//请求地址 data: { //请求参数 }, }).then((result) => { console.log(result); });
序列化
- 是一个把对象或者数组转成字符串格式的过程 如JSON.stringfy()
反序列化
- 是一个把字符串格式转成对象或者数组的过程 如 JSON.parse()
获取表单内input的值
-
普通方法
//query 只能传入 form标签的选择器 function getForm(query){ const inputs = document.querySelectorAll(query + ' input[name]'); const obj = {}; inputs.forEach(item => { obj[item.name] = item.value; }); return obj; }
-
使用JQ
//$('表单元素的选择器').serialize() const data = $('form').serialize() console.log(data)// key1=value1&key2=value2
-
自己实现
//formdata 碰到多选框时不适合使用 const formDom = document.querySelector("form"); const btnDom = document.querySelector("button"); btnDom.addEventListener("click", () => { const formData = new FormData(formDom); //以url拼接参数返回 const usp = new URLSearchParams(formData); console.log(usp.toString()); //username=XianCheng666&password=123513215 //以对象的形式返回 const obj = {}; formData.forEach((value, key) => { obj[key] = value; }); console.log(obj); //{username: 'q964813950', password: '543243'} });
上传图片
//<input type="file" accept="image/*"/>
//<img src=''/>
const input = document.querySelector('input');
const img = document.querySelector('img');
input.addEventListener('change',()=>{
const file = input.files[0];//要上传的文件对象
const src = URL.createObjectURL(file);//把浏览器内存中图片文件的地址获取出来
img.src = src;
const formdata = new FormData();//创建一个空formdata对象
formdata.append('avatar',file);//接口要求,把文件追加到 formdata对象
axios.post(url,formdata).then(result =>{
console.log(result);
});
});
拦截器
定义
是用来全局拦截axios的每一次请求与响应
使用
-
添加请求拦截器
axios.interceptors.request.use( function (config) { //在发送请求前应该做什么 return config }, function (error) { //对请求错误做些什么 return Promise.reject(error) } )
-
添加响应拦截器
axios.interceptors.response.use( function (response) { //在响应后应该做什么 return response }, function (error) { //对响应错误做些什么 return Promise.reject(error) } )
请求报文
定义
- 规定了客户端以什么格式把数据发送给服务器
- 请求报文由请求行,请求头,请求体组成
- 请求行:请求方式 请求地址 协议类型
- 请求头: 用来描述这次请求的基本信息
- 请求体:要发送给服务器的数据
响应报文
定义
- 规定了服务器以什么格式把数据响应给客户端
- 由状态行,响应头部,响应体组成
http响应状态码
- 2xx-----成功
- 3xx----重定向
- 4xx----客户端错误,即代码错误
- 5xx----后端错误
axios的实现原理
基本写法
//1 创建xhr对象
const xhr = new XMLHttpRequest();
//2 调用open方法
xhr.open('请求类型','请求地址');
//3 发送出去
xhr.send();
//4 监听 数据响应事件
xhr.addEventListener('load',function(){
console.log(this.response);
//字符串转对象
const obj = JSON.parse(this.response);
console.log(obj);
});
原生携带参数的GET请求
const xhr = new XMLHttpRequest();
xhr.open('get','请求地址?请求参数1&请求参数2');//见注1
xhr.send();
xhr.addEventListener('load',function(){
console.log(this.response);
const obj = JSON.parse(this.response);
console.log(obj);
});
//注1 请求参数n格式:key=value
原生携带参数的POST请求
const xhr = new XMLHttpRequest();
xhr.open('post','请求地址');
const data = {
bookname: '1从入门到精通1',
author: '我自己',
publisher: '黑马出版社',
appkey: 'wanshao1234',
};
//把data转成 a=b&c=d URLSearchParams
const usp = new URLSearchParams(data);
const query = usp.toString();
//设置对应的content-type
xhr.setRequestHeader("Content-type","application/x-www-form-urlencoded");
//传递 a=b&c=d
xhr.send(query);
xhr.addEventListener('load',function(){
console.log(this.response);
const obj = JSON.parse(this.response);
console.log(obj);
});
原生-POST-携带参数JSON格式字符串
const xhr = new XMLHttpRequest();
xhr.open('post','请求地址');
const data = {
bookname: '1从入门到精通1',
author: '我自己',
publisher: '黑马出版社',
appkey: 'wanshao1234',
};
//设置对应的content-type
xhr.setRequestHeader("Content-type","application/json");
const str =JSON.stringify(data);
xhr.send(str);
xhr.addEventListener('load',function(){
console.log(this.response);
const obj = JSON.parse(this.response);
console.log(obj);
});
原生-POST-携带参数formdata
const input = document.querySelector('input');
input.addEventListener('change', function () {
const file = this.files[0];//获取要上传文的件对象
const formdata = new FormData();
//添加key value
formdata.append('avatar', file);
const xhr = new XMLHttpRequest();
xhr.open('post', 'http://www.itcbc.com:3006/api/formdata');
// 不用设置 content-type
xhr.send(formdata);
xhr.addEventListener('load', function () {
console.log(this.response);
});
});
防抖和节流
防抖
-
定义
频繁触发某个操作是,只执行最后一次
-
个人理解
有一个异步操作fun(),他的执行过程是A->B->C,我的需求是点击十次,除非某一次执行了完整过程,那么只有最后一次点击执行该操作
-
代码
let id = null btn.addEventlistenner('click',() => { clearTimeout(id);//清除之前的定时器 id = setTimeout(()=>{ //相关需求。。 },500) })
节流
-
定义
单位时间内,频繁触发同一个操作,只会触发一次(第一次)
-
代码
let flag = true //表示可以执行 btn.addEventlistenner('click',() => { if (!flag) return; flag = false; //相关异步操作 //如果执行成功则使flag = true })