form 表单 & 文件上传: 一.form 表单:
在网页中,表单主要负责数据采集功能 三个部分组成,分别是:表单标签、表单域、表单按钮 HTML 的 就是表单标签,它是一个“容器”,用来将页面上指定的区域划定为表单区域: 表单域提供了采集用户信息的渠道,常见的表单域有:input、textarea、select 等。 当表单数据填写完毕后,用户点击表单按钮,会触发表单的提交操作,从而把采集到的数据提交给服务器。
图书管理确认框: // 判断用户是否确定删除 if (!confirm("您确定删除吗")) { // 不删除 return; // 不再往下执行代码 }
快速获取表单 :
<form class="f1">
<input value="111" type="text" name="username" />
<input value="222" type="text" name="password" />
<input value="333" type="text" name="address" />
<input value="444" type="text" name="phone" />
<input type="text" />
<input type="text" />
<input type="text" />
<button type="button">注册数据</button>
</form>
<form class="f2" action="">
<input type="text" name="nickname" value="aabbcc" />
</form>
<script>
// 获取表单1 数据 对象格式
const obj1 = getForm('.f1');
// 获取表单2 数据 对象格式
const obj2 = getForm('.f2');
console.log(obj1);
console.log(obj2);
// query 只能传入 form标签的选择器
function getForm(query) { // 在定义函数的时候写形参 - 名字都可以随意改
const inputs = document.querySelectorAll(query + ' input[name]');
// const inputs = document.querySelectorAll('.f1 input[name]');
const obj = {};
inputs.forEach((dom) => {
obj[dom.name] = dom.value;
});
return obj;
}
</script>
通过 Ajax 提交表单数据: 通过 Ajax 提交表单采集到的数据,可以防止表单默认提交行为导致的页面跳转问题,提高用户的体验。
监听表单的 submit 提交事件 阻止默认提交行为 基于 axios 发起请求 指定请求方式、请求地址 指定请求体数据
<script>
$('form').on('submit', function (e) {
e.preventDefault()
axios({
method: 'POST',
url: 'http://www.itcbc.com:3006/api/form',
data: {
username: $('[name="username"]').val(),
password: $('[name="password"]').val()
}
}).then(result => {
console.log(result.data)
})
})
</script>
jQuery 的 serialize() 函数:
jQuery 的 serialize() 函数能够一次性获取到表单中采集的数据,它的语法格式如下:
$('表单元素的选择器').serialize();
<script>
$('form').on('submit', function (e) {
e.preventDefault()
axios({
method: 'POST',
url: 'http://www.itcbc.com:3006/api/form',
data: $('form').serialize() //$('表单元素的选择器').serialize();
}).then(result => {
console.log(result.data)
})
})
</script>
serialize() 函数的使用注意点:
在使用 serialize() 函数快速获取表单数据时,必须为每个表单域添加 name 属性!
例如下面的示例中,只能通过 serialize() 函数获取到密码的值:
<form>
<!-- 把所有的框框、按钮都放这里面 -->
<!-- 没有name属性 -->
<input type="text" /><br />
<input type="password" name="password" /><br />
<button>提交</button>
</form>
<script>
$('form').serialize(); // password=123
</script>
serialize() 函数的其他特点:
该方法是jQuery封装的,使用时必须引入jQuery 使用serialize(),各表单域必须有 name 属性 使用该方法得到的结果是一个查询字符串结构:name=value&name=value 该方法 能够 获取 隐藏域的值 该方法不能得到禁用状态的值 该方法不能得到文件域中的文件信息,所以不能完成文件上传
二.axios 请求方法的别名: 请求方法的别名: 在实际开发中,常用的 5 种请求方式分别是: GET、POST、PUT、PATCH、DELETE 为了简化开发者的使用过程,axios 为所有支持的请求方法提供了别名:
axios.get ( url , config ) axios.delete ( url , config ) axios.post ( url, data , config ) axios.put ( url, data , config ) axios.patch ( url, data , config
data:表示提交到服务器的数据 config:相当于传递给 axios()的那个对象 体验 axios.get() 的用法: 使用 axios.get() 可以方便快捷地发起 GET 请求 => { console.log(result); }) // 带查询参数 axios.get('www.itcbc.com:3006/api/get', { params: { id: 1 } }).then(result => { console.log(result); })
体验 axios.post() 的用法: 使用 axios.post() 可以方便快捷地发起 POST 请求: => { console.log(result); }) // 带请求体 axios.post('www.itcbc.com:3006/api/post', { username: 'zhangsan', password: '123456' }).then(result => { console.log(result); })
三.axios 全局配置 和 拦截器: 全局配置请求根路径: 在 url 地址中,协议://域名:端口 对应的部分叫做“请求根路径” 全局配置请求根路径的好处:
提高项目的可维护性。全局配置根路径后,后续所有的请求都可以使用全局配置的根路径
假设:端口号从 3009 变成了 3006:
没有全局配置根路径,则每个请求的URL中的端口号都需要被修改! 有全局配置根路径,则只需要修改全局配置即可
基于 axios 提供的固定配置,即可轻松配置请求的根路径。语法格式如下: axios.defaults.baseURL = '请求根路径'
拦截器: 拦截器(interceptors)用来全局拦截 axios 的每一次请求与响应。 好处:可以把每个请求中,某些重复性的业务代码封装到拦截器中,提高代码的复用性。
// 添加响应拦截器
axios.interceptors.response.use(function (response) {
// 2xx 范围内的状态码都会触发该函数。
// 对响应数据做点什么
return response;
}, function (error) {
// 超出 2xx 范围的状态码都会触发该函数。
// 对响应错误做点什么
return Promise.reject(error);
});
</script>
四.FormData和文件上传: FormData基本使用方法:
假设需要收集 …… 里面的所有表单项的值 要求,每个表单元素都具有 name 属性
<script>
// 1. 获取 form 标签的 DOM对象
let form = document.querySelector('form');
// 2. 实例化 FormData 对象,传入 form
let fd = new FormData(form);
// 3. 提交数据
axios.post('/api/formdata', fd).then(result => {
console.log(result);
})
</script>
注意事项:提交 FormData 对象,不能使用 GET 方式,具体以接口文档为准 FormData的API方法: 在提交数据前,可以使用下列API方法对数据进行查看和修改
<script>
append('key', 'value'); --向对象中追加数据
set('key', 'value'); --修改对象中的数据
delete ('key'); --从对象中删除数据
get('key')-- 获取指定key的一项数据
getAll('key')-- 获取指定key的全部数据
forEach()-- 遍历对象中的数据
</script>
FormData和serialize的区别: 共同点:
都需要设置表单各项的name属性。 都能快速收集表单数据 都能够获取到隐藏域()的值 都不能获取禁用状态(disabled)的值
不同点:
FormData属于原生的代码;serialiaze是jQuery封装的方法 FormData可以收集文件域()的值,而serialize不能。如果有文件上传,则必须使用FormData。 得到的结果的数据类型不一样(知道即可)
<script>
$('#iptFile').on('change', function (e) {
let form = $('form')[0]; // 需要将jQuery对象转成DOM对象
const fd = new FormData(form);
// 提交FormData,从而完成文件上传
axios.post('http://www.itcbc.com:3006/api/formdata', fd).then(result => {
console.log(result.data);
})
})
</script>
五.文件域补充: 实现文件上传:
<input type="file" accept="image/*">
<script>
const input = document.querySelector("input ")
// 文件域内容改变的时候,获取文件列表及文件对象
input.addEventListener("change", function () {
// 获取某个文件对象,比如第一个文件的文件对象
const file = this.files[0]
// 追加到FormData对象中
const formdata = new FormData()
formdata.append("avatar", file)
// axios 提交 fd 到指定的接口,从而实现文件上传
// axios提交FormData的代码
axios({
type: 'post',
url: 'http://www.itcbc.com:3006/api/formdata',
data: formdata,
success(result) {
console.log(result);
}
})
})
</script>
六.请求报文 & 响应报文: 客户端与服务器通信的过程是基于请求与响应的。其中:
请求报文规定了客户端以什么格式把数据发送给服务器 响应报文规定了服务器以什么格式把数据响应给客户端
请求报文 - 格式: 请求报文由请求行(request line)、请求头部( header )、空行 和 请求体 4 个部分组成。
在浏览器中,GET 请求比较特殊,它只有请求头,没有请求体。 在浏览器中,POST、PUT、PATCH、DELETE 请求既有请求头,又有请求体。
响应报文 - 格式: 响应报文由状态行 、响应头部、空行 和 响应体 4 个部分组成。 URL参数:
常用的5种请求方式,都可以在URL后面携带请求参数。 由于URL的长度有限制,所以请求参数一般都比较小,比如不能做文件上传
常用的请求参数有两种写法:
/api/xxx?参数=值&参数=值 (这种格式的字符串叫做查询字符串,所以这样的参数叫做查询参数) /api/xxx/值/值 (Restful 风格的接口用这种格式的参数)
第一种格式的参数:(/api/xxx?参数=值&参数=值)
<script>
// 直接写成查询字符串,并拼接到url后面
axios.get('/api/xxx?key=value&key=value')
// 按照axios的语法写,axios会帮我们转成查询字符串
axios.get('api/xxx', { params: { key: value, key: value } })
</script>
第二种格式的参数:( /api/xxx/值/值)
<script>
// 只能自己拼接
axios.get('/api/xxx/100/zhangsan')
</script>
请求体:
除GET请求以外,其他4种常用的请求方式,都可以设置请求体。
请求体的大小没有限制,所以可以提交大量的数据
常用的请求体格式有如下三种:
参数=值&参数=值 (查询字符串格式)
<script>
// axios.post的第二个参数,直接用查询字符串
axios.post('/api/xxx', 'key=value&key=value')
</script>
'{ "id": 1, "name": "zs" }' (JSON格式)
<script>
// axios.post的第二个参数,使用对象。axios会将它转成JSON格式
axios.post('/api/xxx', { id: 1, name: 'zs' })
</script>
new FormData() (FormData对象格式)
<script>
let fd = new FormData();
// axios.post的第二个参数,直接使用 FormData 对象
axios.post('/api/formdata', fd)
</script>
所处的位置不同:
在响应头的状态行中所包含的状态码,或者请求列表中的Status,叫做“响应状态码” 在响应体的数据中所包含的状态码(案例中叫做code),叫做“业务状态码”
表示的结果不同:
响应状态码只能表示这次请求的成功与否(成功地失败了) 业务状态码用来表示这次业务处理的成功与否
通用性不同:
响应状态码是由 http 协议规定的,具有通用性。每个不同的状态码都有其标准的含义,不能乱用。 业务状态码是后端程序员自定义的,不具有通用性。
响应状态码:
2xx 成功。 3xx 重定向。 4xx 客户端错误。 5xx 服务器错误。
业务状态码:
看是怎么命名的