form 表单
基本介绍
form表单可用于向服务端提交数据,它是一个块级标签。
我们常见的登录框、留言板等很多功能都是通过form表单完成的,使用form表单进行数据提交会导致页面的刷新。
下面将采用flask框架作为后端,使用form表单进行一次数据提交。
后端代码:
from flask import Flask
from flask import request
app = Flask(__name__)
@app.route("/get", methods=['GET'])
def get_handler():
return f"{request.args}"
@app.route("/post", methods=['POST'])
def post_handler():
return f"{request.form}"
if __name__ == "__main__":
app.run(debug=True)
前端代码:
<!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>
</head>
<body>
<form action="http://127.0.0.1:5000/get" method="get">
<div>
<label for="username">username</label>
<input type="text" name="username" placeholder="please enter user name" id="username">
</div>
<br>
<div>
<label for="password">password</label>
<input type="password" name="password" placeholder="please enter user password" id="password">
</div>
<br>
<div>
<label for="male">male</label>
<input type="radio" name="gender" value="male" id="male" checked>
<label for="female">female</label>
<input type="radio" name="gender" value="female" id="female">
</div>
<br>
<div>
<button type="submit">submit</button>
</div>
</form>
</body>
</html>
整体效果如下:
前端提交的数据会被后端的服务器所接收到。
action 提交地址
form表单中action属性可设置表单内容的提交地址。
它指向一个url,一般情况下我们都会加上完整url,但如果你是前后端混合开发项目的话则可以不用加完整url。
下面这个是完整路径,如果点击提交表单它会朝这个url发起请求:
<form action="http://127.0.0.1:5000/get" method="get">
如果你把他改为非完整路径,它会朝当前页面发起请求,注意观察下面与上述地址栏中的端口变化:
<form action="/get" method="get">
method 提交方式
form表单中的method属性可设置表单提交时的HTTP请求方式。
有2种选项:
- GET请求(form提交时的默认选择)
- POST请求
它们的区别如下。
GET请求:
- 没有请求体
- 数据必须控制在1KB之内
- 请求的数据会暴露在地址栏中(?之后,以&进行分割)
POST请求:
- 有请求体
- 数据的大小没有上限
- 请求的数据不会暴露在地址栏中,因此相较于GET请求更加安全
以下行为将会触发GET请求:
- 地址栏直接输入地址并访问
- 点击页面a标签进行链接跳转
- 默认的form表单提交方式
- img的图像资源请求
说的更直白一点,GET请求不能上传文件,但是POST请求可以上传文件。
enctype 数据编码
form表单中的enctype属性可设置表单提交时对于提交数据的编码方式。
- application/x-www-form-urlencoded:url编码格式,也是form表单默认的编码格式,它不允许上传文件,一般配合GET方式使用
- multipart/form-data:不对字符进行编码,它允许上传文件,一般配合POST方式进行使用
- text/plain:将空格转换为“+”号,但不对特殊字符进行编码
url编码格式的特点:
- 将空格转换为 “+” 加号,特殊符号转换为 ASCII HEX 值
一言以蔽之,若想上传文件,则必须使用POST请求方式 + multipart/form-data的编码方式:
<form action="/post" method="post" enctype="multipart/form-data">
target 提交结果
form表单中的target属性可设置表单提交后会在哪里打开action的提交结果。
有以下5个值:
- _blank:在新窗口中打开action的提交结果
- _parent:在父窗口中打开action的提交结果
- _self:在当前窗口中打开action的提交结果(默认值)
- _top:在顶级窗口中打开action的提交结果
- framename:在内联框架iframe中打开action的提交结果
这个属性其实很少用到,但是该属性可以搭配一些其他的技术做到文件上传的功能,因此这里例举一下,后面也会有所介绍。
示例如下,提交后将会在新的页面打开提交结果:
<form action="http://127.0.0.1:5000/post" method="post" enctype="multipart/form-data" target="_blank">
novalidate 取消验证
form表单中的novalidate属性可设置表单提交时不会验证填入数据的合法性。
有的input框可以设置为必填,如果一个必填的input框没有填入内容则在提交时浏览器将提示必须填写该字段,我们可以通过设定novalidate来取消这个验证功能。
如下是设置了提交验证的表单:
<form action="#" >
<div>
<input type="text" required placeholder="Please enter content">
</div>
<div>
<button type="submit">submit</button>
</div>
</form>
当点击提交时浏览器会提示你填入该字段:
如果为form表单加上了novalidate属性后,它将会直接提交,注意观察地址栏中的变化:
<form action="#" novalidate>
<div>
<input type="text" required placeholder="Please enter content">
</div>
<div>
<button type="submit">submit</button>
</div>
</form>
点击提交后页面会刷新一次,这代表已经绕过验证成功提交了:
input 输入框
基本介绍
input标签为表单输入框,它是一个内联块级标签。
input框有多种形态,只需要设置属性type的值即可,如下表所示:
属性值 | 表现形式 | 对应代码 |
---|---|---|
text | 文本输入框 | <input type=text" /> |
password | 密码输入框 | <input type=“password” /> |
number | 数字输入框 | <input type=“number” /> |
date | 日期输入框 | <input type=“date” />> |
checkbox | 复选框 | <input type=“checkbox” checked=“checked” /> |
radio | 单选框 | <input type=“radio” /> |
submit | 提交按钮 | <input type=“submit” value=“提交” /> |
reset | 重置按钮 | <input type=“reset” value=“重置” /> |
button | 普通按钮 | <input type=“button” value=“普通按钮” /> |
hidden | 隐藏输入框 | <input type=“hidden” /> |
file | 文件选择框 | <input type=“file” /> |
list | 数据列表栏 | <input type=“text” list=“lst” /> <datalist id=“lst”></datalist> |
text 文本输入框
文本输入框可输入任何内容,它有2个最重要的属性name和value。
当form表单点击提交时,文本输入框会将输入的值赋值给value属性,并将name属性和value属性组成一组键值对提交给后端。
如果没有显式的设置value,那么这个文本输入框的内容是空的,当你输入内容后它会自动添加value属性并将所输入内容赋值给该属性:
<input type="text" name="username">
渲染结果:
如果显式的设置了value,那么它就会作为默认值显示在文本输入框中:
<input type="text" name="username" value="username">
渲染结果:
我们一般都不会这样做,而是利用placeholder属性来提示用户应该输入什么内容,placeholder属性在form表单提交时并不会被收集:
<input type="text" name="username" placeholder="please enter user name">
渲染结果:
除此之外,你可以使用required属性来规定该输入框是必填项,前提是form表单验证已被打开它才会生效:
<input type="text" name="username" placeholder="please enter user name" required>
如果使用了readonly属性,则该输入框就会变为只读,它通常和value设置的默认值搭配使用:
<input type="text" name="username" placeholder="please enter user name" value="default value" readonly>
渲染结果:
你也可以使用disabled禁止该输入框,用户只能看到灰色被禁用的输入框,不能进行内容输入:
<input type="text" name="username" placeholder="please enter user name" disabled>
渲染结果:
password 密码输入框
密码输入框和文本输入框差不多,不同的是输入内容时浏览器会用黑色实心圆遮蔽掉用户键入的内容:
<input type="password" name="pwd">
渲染结果:
其他的属性和文本输入框通用。
number 数字输入框
数字输入框仅能够输入数字,不能输入其他的字符,可用于输入手机号:
<input type="number" name="phone">
其他的属性和文本输入框通用。
date 日期输入框
日期输入框可以上传一个年月日。
- 当input的type为datetime-local时,可以上传一份本地化的时间(年月日时分秒)
- 当input的type为date时,可以上传一份标准化的世界时间(年月日)
- 当input的type为month时,可以上传年份和月份
- 当input的type为time时,可以上传小时和分钟数
- 当input的type为week时,可以上传年份和周数
除此之外,你可以利用min属性设置开始时间,max属性设置结束时间,step属性设置步长即多少时间一个间隔:
如下所示:
<form action="#" novalidate>
<div>
<input type="datetime-local" name="local_time">
<input type="date" name="world_time">
<input type="month" name="year_month_time">
<input type="time" name="hour_minute_time">
<input type="week" name="year_week_time">
</div>
</form>
渲染结果:
checkbox 复选框
复选框常用于勾选兴趣爱好,一般来说都要具有多个。
像这种复选框或者单选框之类的,都应该显式的设置value,不然提交的数据则为空。
注意,一组复选框内的name应该都相同,而value则应该不同,如下所示:
<form action="http://127.0.0.1:5000/get" >
<div>basketball:<input type="checkbox" name="hobby" value="basketball"></div>
<div>football:<input type="checkbox" name="hobby" value="football"></div>
<div>volleyball:<input type="checkbox" name="hobby" value="volleyball"></div>
</form>
渲染结果:
当点击提交后,它会以列表的方式将所勾选的checkbox的value进行整合,类似于下面这种格式:
{
"hobby" : ["basketball", "football"]
}
此外,如果你想让某个复选框设置为默认的,可为它添加checked属性即可:
<div>basketball:<input type="checkbox" name="hobby" value="basketball" checked></div>
这样在渲染页面时,该复选框就会被选中:
在某些特殊的情况下我们只会设置一个复选框,如用户必须点击已阅读协议后才能进行下一步操作,此时你可以将该复选框设置为required,即必填,然后搭配Js做到这样的效果,这里不再例举。
radio 单选框
单选框的使用与复选框基本相同。
必须显式的设置value,且name要一致:
<form action="http://127.0.0.1:5000/get">
<div>
male: <input type="radio" name="gender" value="male">
female: <input type="radio" name="gender" value="female">
</div>
<button type="submit">提交</button>
</form>
渲染结果:
此外,如果想设置默认值,则在radio上加上checked属性即可。
如果想设置多个radio中必须至少选择一个,则在任意一个同组的radio上添加属性required即可。
submit 提交按钮
input的type设置为submit后,可用于提交表单的内容,你可以为其设置value属性值来指定按钮显示内容:
<input type="submit" value="submit button">
当点击该按钮后,form表单将发送数据至后端。
渲染结果:
reset 重置按钮
input的type设置为reset后,可用于清空表单的内容,你可以为其设置value属性值来指定按钮显示内容:
<input type="reset" value="reset button">
当点击该按钮后,form表单中所有以填项都会被清空。
渲染结果:
button 普通按钮
input的type设置为button后,可用于与JavaScript代码进行交互,你可以为其设置value属性值来指定按钮显示内容:
<!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>
</head>
<body>
<input type="button" value="ordinary button">
</body>
<script>
"use strict";
document.querySelector("input[type=button]").addEventListener("click", () => {
console.log("click in button")
})
</script>
</html>
为该按钮绑定Js事件,点击按钮后将触发Js事件。
渲染结果:
hidden 隐藏输入框
隐藏输入框可用于存储一些用户不可见的数据,如用户的ID号等信息,这在修改用户密码时很常用。
在进行form表单提交时,它将一起提交给后端:
<!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>
</head>
<body>
<form action="http://127.0.0.1:5000/get" method="get">
<input type="hidden" name="user-id" value="31926">
<div>old password : <input type="password" placeholder="please enter user old password" name="old_password"></div>
<div>new password : <input type="password" placeholder="please enter user new password" name="new_password"></div>
<div><button type="submit">submit button</button></div>
</form>
</body>
</html>
提交后的结果:
ImmutableMultiDict([('user-id', '31926'), ('old_password', '123'), ('new_password', '456')])
file 文件选择框
当input的属性为file时,可用于上传文件。
注意,如想成功上传文件,则:
- form表单的method必须为POST
- form表单的enctype必须为multipart/form-dat
如下示例,需要注意文本选择框也必须设置name属性,否则将无法上传文件:
<!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>
</head>
<body>
<form action="http://127.0.0.1:5000/post" method="post" enctype="multipart/form-data">
<div>avatar : <input type="file" name="avatar"></div>
<div><button type="submit">submit button</button></div>
</form>
</body>
</html>
渲染结果如下:
后端flask可用request.files进行文件接收,以下是接收内容:
ImmutableMultiDict([('avatar', <FileStorage: 'logo.ico' ('image/vnd.microsoft.icon')>)])
我们为文本选择框新增属性multiple,用于一次性上传多个文件:
<div>avatar : <input type="file" name="avatar" multiple></div>
除此之外,我们也可以为文本框新增属性accept,用来指定允许上传文件的mime类型:
<div>avatar : <input type="file" name="avatar" accept="image/png, image/gif"></div>
这样在文件选择时,你只能选择png或者gif格式的图片了:
![image-20210710060619811](https://i-blog.csdnimg.cn/blog_migrate/d1549ef7f512f701483cc8db6d44ab78.png)
datalist 数据列表
通过数据列表,我们可以展示一些信息供用户选择,它由3种标签构成分别是input、datalist、option。
input首先设置为文本输入框,然后添加属性list并给定一个关键字,此外你还需要设置name属性。
而后输入datalist标签,该标签的id和文本输入框的list关键字一致。
在datalist标签中嵌套option标签,并设置value值,这样数据列表就做好了:
<!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>
</head>
<body>
<form action="http://127.0.0.1:5000/get" method="get">
<div>
city:
<input type="text" list="city_list" name="city">
<datalist id="city_list">
<option value="Beijing">Beijing</option>
<option value="Shanghai">Shanghai</option>
<option value="Tianjin">Tianjin</option>
<option value="Chongqing">Chongqing</option>
</datalist>
<button type="submit">submit button</button>
</div>
</form>
</body>
</html>
渲染结果:
注意!数据列表中一次只能选定一个选项。
input的常见属性
下表中将例举input中常见的属性:
属性 | 值 | 描述 |
---|---|---|
name | field_name | 表单提交时的键 |
value | text | 表单提交时的值 |
placeholder | text | 输入提示 |
checked | checked | radio和checkbox默认选中 |
readonly | readonly | 只读 |
disabled | disabled | 禁用 |
required | required | 必填 |
size | number | 定义输入框显示宽度 |
min | number | 定义输入的字段最小值 |
max | number | 定义输入的字段最大值 |
pattern | regexp | 对输入内容进行正则验证 |
oninvalid | JavaScript | 当正则验证失败后运行的代码 |
autocomplete | on 、off | 自动记录键入输入历史 |
以下是常用属性举例:
<!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>
</head>
<body>
<form action="http://127.0.0.1:5000/get" method="get">
<hr>
<div>
<!-- placeholder:输入提示,仅适用于输入框 -->
<input type="password" name="password" placeholder="Please enter your password"> placeholder
</div>
<hr>
<div>
<!-- checked:适用于radio或者checkbox的默认选项 -->
male: <input type="radio" name="gender" value="male" checked> female: <input type="radio" name="gender" value="female" > checked
</div>
<hr>
<div>
<!-- readonly:只读,适用于和默认值进行搭配,输入框只读 -->
<input type="text" name="user_desc" value="default value" readonly> readonly
</div>
<hr>
<div>
<!-- disabled:禁用输入,所有input标签都适用,输入框、按钮、选择框、数据列表等 -->
<input type="text" name="user_type" value="vip" disabled> disabled
</div>
<hr>
<div>
<!-- required:必填项 -->
<input type="text" name="user introduction" required> required
</div>
<hr>
<div>
<!-- size: 定义输入框显示宽度-->
<input type="text" name="size_value" size="3"> size:3
</div>
<hr>
<div>
<!-- min:定义输入的字段最小值,也就是说输入的值必须大于min -->
<input type="number" name="min_value" min="10"> min:10
</div>
<hr>
<div>
<!-- max:定义输入的字段最大值,也就是说输入的值必须小于max -->
<input type="number" name="max_value" max="100"> max:100
</div>
<hr>
<div>
<!-- pattern和oninvalid搭配使用:pattern输入正则表达式、oninvalid输入匹配失败后的执行代码 -->
<input type="text" name="email" pattern=".+@.+com" oninvalid="javascript:alert('regexp match email failed')"> email
</div>
<hr>
<div>
<!-- autocomplete:选择on、浏览器会记录此次输入的值,默认为on -->
<input type="text" name="auto_complete" autocomplete="on"> autocomplete
</div>
<hr>
<div>
<button type="submit">submit button</button>
</div>
</form>
</body>
</html>
label 标签
基本介绍
label标签通常与input标签绑定使用,它将作为input标签的标注出现,它是一个块级标签。
label有一个特殊的属性,for,该属性的值应当与被绑定的input标签id值相同。
我们看一个简单的例子来理解label标签的作用,下面这个例子中是没有label标签的,当点击关键字“male”或者“female”时,浏览器不会自动聚焦到radio上:
<!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>
</head>
<body>
<form action="http://127.0.0.1:5000/get">
<div>
male: <input type="radio" name="gender" value="male">
female: <input type="radio" name="gender" value="female">
</div>
</form>
</body>
</html>
渲染结果:
如果使用label标签作为radio的标注,则点击label标签文本时,浏览器将会自动的聚焦在radio标签上:
<!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>
</head>
<body>
<form action="http://127.0.0.1:5000/get">
<div>
<label for="choice_male">male:</label>
<input type="radio" name="gender" value="male" id="choice_male">
<label for="choice_female">female:</label>
<input type="radio" name="gender" value="female" id="choice_female">
</div>
</form>
</body>
</html>
select 选择框
基本介绍
select标签与optgroup标签(可选)和option标签搭配可作出选择框的效果。
它类似于数据列表,但比数据列表更加强大,以下是这3个标签的可选常用属性。
首先是select标签,它最少要设定一个属性name,作为键与option的value进行搭配:
属性 | 值 | 描述 |
---|---|---|
name | text | 规定发往服务器的选项键 |
multiple | multiple | 规定下拉列表是否可以多选 |
autofocus | autofocus | 页面加载完成后文本区域自动获取焦点 |
disabled | disabled | 禁用该下拉列表 |
required | required | 规定文本区域是必填的 |
size | number | 规定下拉列表中可见选项的数目 |
其次是optgroup标签,这是一个可选标签,也就是说选择框的组成它并不是必须的:
属性 | 值 | 描述 |
---|---|---|
label | text | 为选项组规定描述 |
disabled | disabled | 禁用该选项组 |
最后是option标签,它最少要设定一个属性value,作为值与select标签的name进行搭配:
属性 | 值 | 描述 |
---|---|---|
value | text | 规定发往服务器的选项值 |
label | text | 定义当使用optgroup时所使用的标注 |
selected | selected | 规定默认选中的选项 |
disabled | disabled | 规定此选项应当在首次加载时禁用 |
单项选择框
下面是一个单项选择框的示例:
<!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>
</head>
<body>
<form action="http://127.0.0.1:5000/get">
<label for="choice_city">city:</label>
<select name="city" id="choice_city">
<optgroup label="China">
<option value="Beijing">Beijing</option>
<option value="Shanghai">Shanghai</option>
<option value="Tianjin">Tianjin</option>
<option value="Chongqing">Chongqing</option>
</optgroup>
<optgroup label="USA">
<option value="NewYork">NewYork</option>
<option value="SanFrancisco">SanFrancisco</option></option></option>
<option value="LosAngeles">LosAngeles</option>
<option value="Miami">Miami</option>
</optgroup>
</select>
<div>
<button type="submit">submit button</button>
</div>
</form>
</body>
</html>
渲染结果:
多项选择框
如果为select标签新增multiple属性,则该选择框可变为多选:
<!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>
</head>
<body>
<form action="http://127.0.0.1:5000/get">
<label for="choice_city">city:</label>
<select name="city" id="choice_city" multiple>
<optgroup label="China">
<option value="Beijing">Beijing</option>
<option value="Shanghai">Shanghai</option>
<option value="Tianjin">Tianjin</option>
<option value="Chongqing">Chongqing</option>
</optgroup>
<optgroup label="USA">
<option value="NewYork">NewYork</option>
<option value="SanFrancisco">SanFrancisco</option></option></option>
<option value="LosAngeles">LosAngeles</option>
<option value="Miami">Miami</option>
</optgroup>
</select>
<div>
<button type="submit">submit button</button>
</div>
</form>
</body>
</html>
渲染结果:
默认选中
当option标签设置为selected后,该标签会被默认选中:
<!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>
</head>
<body>
<form action="http://127.0.0.1:5000/get">
<label for="choice_city">city:</label>
<select name="city" id="choice_city">
<optgroup label="China">
<option value="Beijing">Beijing</option>
<option value="Shanghai">Shanghai</option>
<option value="Tianjin">Tianjin</option>
<option value="Chongqing">Chongqing</option>
</optgroup>
<optgroup label="USA">
<option value="NewYork" selected>NewYork</option>
<option value="SanFrancisco">SanFrancisco</option></option></option>
<option value="LosAngeles">LosAngeles</option>
<option value="Miami">Miami</option>
</optgroup>
</select>
<div>
<button type="submit">submit button</button>
</div>
</form>
</body>
</html>
渲染结果:
textarea 文本域
textarea标签与文本输入框类似,但是能够输入更多的内容。
它是一个内联标签,以下是常用属性:
属性 | 值 | 描述 |
---|---|---|
name | text | 规定发往服务器的选项键 |
autofocus | autofocus | 规定在页面加载后文本区域自动获得焦点 |
maxlength | number | 规定该文本域所支持输入的最大字符数 |
placeholder | text | 规定描述文本区域预期值的简短提示 |
rows | number | 规定文本域的可见行数,即高度 |
cols | number | 规定文本域的可见列数,即宽度 |
required | required | 必填 |
readonly | readonly | 只读 |
disabled | disabled | 禁用 |
如下所示:
<!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>
</head>
<body>
<form action="http://127.0.0.1:5000/get">
<textarea name="desc" id="" cols="80" rows="20" placeholder="this is textarea"></textarea>
<div>
<button type="submit">submit button</button>
</div>
</form>
</body>
</html>
渲染结果:
fieldset - legend 美化标签
fieldset和legend标签都是块级标签,没什么特别明显的作用就是为了美化元素。
- fieldset:为被包裹元素外加上一个框,主要为字段进行逻辑分组
- legend:作为fieldset标签的标题出现
如下所示:
<!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>
</head>
<body>
<form action="http://127.0.0.1:5000/get">
<fieldset>
<legend>
<h4>用户信息</h4>
</legend>
<label for="user_name">用户名:</label>
<input type="text" name="name" id="user_name" placeholder="please enter user name" size="30" required>
<label for="user_pwd">密码:</label>
<input type="password" name="password" id="user_pwd" placeholder="please enter user name" size="30" required>
<p></p>
<fieldset>
<legend>性别</legend>
<label for="gender_male">male:</label>
<input type="radio" name="gender" value="male" id="gender_male" required>
<label for="gender_female">female:</label>
<input type="radio" name="gender" value="female" id="gender_female">
</fieldset>
</fieldset>
<p></p>
<fieldset>
<legend>其他信息</legend>
<fieldset>
<legend>爱好</legend>
<label for="basketball">篮球</label>
<input type="checkbox" name="hobby" id="basketball" value="basketball" checked>
<label for="football">足球</label>
<input type="checkbox" name="hobby" id="football" value="football">
<label for="volleyball">排球</label>
<input type="checkbox" name="hobby" id="volleyball" value="volleyball">
</fieldset>
<p></p>
<fieldset>
<legend>个人介绍</legend>
<textarea name="user_desc" id="" cols="60" rows="10"
placeholder="Please enter your personal profile" required></textarea>
</fieldset>
<p></p>
<fieldset>
<legend>居住城市</legend>
<select name="city" id="choice_city" required>
<optgroup label="China">
<option value="Beijing">北京</option>
<option value="Shanghai">上海</option>
<option value="Tianjin">天津</option>
<option value="Chongqing">重庆</option>
</optgroup>
<optgroup label="USA">
<option value="NewYork">纽约</option>
<option value="SanFrancisco">旧金山</option></option></option>
<option value="LosAngeles">洛杉矶</option>
<option value="Miami">迈阿密</option>
</optgroup>
</select>
</fieldset>
</fieldset>
<p></p>
<fieldset>
<button type="submit">提交</button>
<input type="reset" value="重新填写">
</fieldset>
</form>
</body>
</html>
渲染结果:
button 按钮
button标签是一个块级标签,它有一个非常重要的属性type,这个type可设置以下2个值:
- submit:作用和<input type=“submit” />相同
- button,作用和<input type=“button” />相同
相较于input的按钮,我更倾向于使用button,因为它的语义更加明确。
当然如果你想要reset,那么就只能使用input按钮了。