使用 <select>
标签
<option>
标签,每一行是一项代码
<select>
<option value="选项 1">选项 1</option>
<option value="选项 2">选项 2</option>
<option value="选项 3">选项 3</option>
</select>
效果
使用 <input>
标签
<datalist>
标签包裹 <option> 标签,每一行是一项
<datalist>
代码
<input type="text" list="select" />
<datalist id="select">
<option value="选项 1">选项 1</option>
<option value="选项 2">选项 2</option>
<option value="选项 3">选项 3</option>
</datalist>
效果
可以在 <datalist>
标签中嵌入 <select>
和 <option>
标签,当 <datalist>
不被支持时,展示下拉选择框,提供用户手动输入内容的第二选择
<label for="colorInput">What is your favorite color ?</label>
<input type="text" id="colorInput" list="colorList">
<dataList id="colorList">
<label for="colorSuggestion">or pcik a color</label>
<select>
<option>Blue</option>
<option>Red</option>
<option>Orange</option>
<option>Green</option>
<option>Yellow</option>
<option>Pink</option>
<option>Purple</option>
<option>White</option>
</select>
</dataList>
支持浏览器预览:
不支持浏览器预览:
单选框
type=radio
name
的单选框同时只有一个能被选中checked
属性,没有一个选中项,不会发送 name 的值value
值为 on
复选框
5. 设置 type=checkbox
6. 相同 name
的复选框
表单被提交后,可以获得提交的键名和键值对字符串
Python 可以使用 self.request.get('name', allow_multiple = True)
或 self.request.getAll('name')
获取
PHP 可以设置 name
值的格式为 name[]
,使用名称 name
获取数组
7. 选中项有 checked
属性,没有一个选中项,不会发送 nam
e 的值
8. 默认 value
值为 on
1. 使用图像按钮元素
type=image
<img>
元素的相同属性2. 支持其它表单按钮的支持属性
使用图像按钮提交表单
X
和 Y
坐标以查询字符串的格式跟在 URL 后
https://www.leetcode-cn . com/?pos.x=100&pos.y=200
1. 数字选择器 min
和 max
分别设置最小值和最大值
type=number
的 <input>
2. 滑块选择器 min
和 max
分别设置最小值和最大值
type=range
的 <input>
3. 日期时间选择器 min
和 max
设置开始时间和结束时间
type=datetime-local
的 <input>
type=month
的 <input>
type=time
的 <input>
type=week
的 <input>
4. 进度条选择器 <progress>
max
指定随时间变化而变化到最大的值5. 仪表选择器 <meter>
min
值域的最小边界值,默认为 0max
值域的上限边界值,默认为 11. low
和 high
将范围划分为三个部分
min
和 low
low
和 high
high
和 max
2. optimum
定义 <meter>
元素的最优值
optimum
值在较低范围内,较低范围最优,中等范围一般,较高范围最坏optimum
值在中等范围内,较低范围一般,中等范围最优,较高范围最坏optimum
值在较高范围内,较低范围最坏,中等范围一般,较高范围最优3. <meter>
颜色
实现一个密码强度显示器,分别对应 弱、中等、强的密码
<p>密码强度指示器</p>
<p>弱:<meter min="0" low="33" high="66" max="100" value="30" optimum="100"></meter></p>
<p>中等:<meter min="0" low="33" high="66" max="100" value="55" optimum="100"></meter></p>
<p>强:<meter min="0" low="33" high="66" max="100" value="88" optimum="100"></meter></p>
效果如图所示:
根据 rfc-2616
规范,HTTP 协议中的 GET 和 POST 主要是语义上的区别
在浏览器的实现及应用中,存在 GET 和 POST 的最佳实践
GET 发送表单数据
<form>
的 method
属性为 get
问号 ?
后跟查询字符串
符号 &
分隔开的键名键值对
POST 发送表单数据
<form>
的 method
属性为 post
max_input_vars
限制最大输入参数上限Content-Type: application/x-ww-form-urlencoded
Content-Length: {请求体的数据长度}
enctype
属性通常用来提交表单的内容类型
application/x-www-form-urlencoded
默认值,数据转换为键值对,用于不含文件的表单提交multipart/form-data 使用 <input>
标签上传文件时,必须设置此类型text/plain
表示纯文本形式,HTML5 新增,通常用于调试(1)什么是表单校验
向 Web 应用输入或提交数据时,验证数据的过程就是表单校验
(2)为什么要进行表单校验 ?
引导用户:引导用户输入符合预期的数据
保护系统:符合设定类型、位数或具体规则,避免不正确格式数据影响程序运行
保护用户:确保用户设定密码、二次密码、安全问答够复杂,不易被暴力破解,无泄漏
减少攻击:经常与后端或后台服务的校验一起应用,减少恶意或伪造的数据提交
表单校验可以分为客户端校验和服务器端校验
校验时机:发生在应用端或浏览器端,表单数据被提交到服务器之前
实时性:即时反馈用户输入的校验结果
作用:确保数据格式正确,保护信息安全
方式:
JavaScript:监听输入框输入、失去焦点和提交事件,验证非空(必填),使用 length
校验长度,正则校验格式等,校验通过或失败分别设置不同 class
或 style
,失败时,通过禁用提交按钮,阻止 onsubmit
事件,阻止表单继续提交
HTML5 内置校验:通过设置不同的 type
类型,声明 required
必填属性,minlength
和 maxlength
限制长度,min
和 max
限制数字或日期范围,设置 pattern
正则表达式校验输入内容,更改伪类类名的属性自定义校验或失败的提示,性能更好,代码更少,老版本 IE 不兼容
HTML5 内置校验 + JavaScript(constraint validaton API):检测、自定义表单元素状态和错误信息
校验时机:应用端或浏览器提交数据并被后端或后台服务接收之后
滞后性:需要等待后端或后台服务响应
作用:提供验重等需要查询数据库的校验,校验、过滤和清洗数据
方式:
通常采用 Ajax 方式,将用户输入数据提交给后端或后台服务,再次校验规则或查询数据库,将校验结果作为响应返回。应用端或浏览器端根据响应结果,更改 class 或设置 style 展示不同的提示
HTML5 内置表单数据校验通常包括校验属性、约束校验 API 及对应的 CSS 伪类
1.校验属性
type
类型email
url
类型限制输入文字必须为邮箱或网址
其它非 text
类型,通过控件,触屏端唤起数字键盘等,来限制用户输入类型
required
属性即可minlength
和 maxlength
属性限制长度min
和 max
属性设置数值范围、起止日期、range 范围步长:step 与 min 或 max 其中至少一个一起设置时,限制值的有效性
2. Constraint Validation API 约束验证 API
validationMessage 本地化消息
描述元素不满足校验条件时的文本信息
无需校验或满足校验条件时,为空
validity ValidityState 对象,每一个子项都返回布尔值
customError 是否设置了自定义错误
patternMismatch 是否匹配正则表达式
rangeOverflow 元素的值是否高于所设置最大值
rangeUnderflow 元素的值是否低于所设置最小值
stepMismatch 元素的值是否符合 step 属性规则
tooLong 元素的值是否超过最大长度
typeMismatch 元素的值是否出现语法错误
valid 元素的值是否有效
valueMissing 元素的值是否 required 且为空
willValidate 元素的值是否是在表单提交时被校验
checkValidity() 校验元素的值是否有效
reportValidity() 元素报告其校验状态,重新展示校验失败提示给用户
setCustomValidity(message) 为元素添加自定义的错误消息
3.伪类
:valid
有效
:invalid
无效
:in-range
在范围内
:out-of-range
超出范围
使用 JavaScript 发送表单数据,需要两步骤
首先,构造请求参数
使用 ES3
const buildParam = data => {
const dataPairs = []
for (const key in data)
dataPairs.push(encodeURIComponent(key) + encodeURIComponent(data[key]))
return dataPairs.join('&').replace(/%20/g, '+')
}
* 使用 jQuery
const buidParam = form => $(form).serialize()
FormData
对象将对象转为 FormData
对象
const buildParam = data => {
const formData = new FormData()
for (const key in data)
formData.append(key, data[key])
return formData
}
* 将表单元素构建 `FormData` 对象
const buildParam = form => {
const formData = new FormData(form)
return formData
}
然后,发送数据
const send = (url, param, cb) => {
const request = new XMLHttpRequest()
request.addEventListener('load', e => cb(null, e => cb(e.target.responseText)))
request.addEventListener('error', e => cb(e.message))
request.open('POST', url)
request.send(param)
}
jQuery
const send = (url, param, cb) => {
$.ajax({
url,
type: 'post',
data: param
}).done(data => cb(null, data)).fail((_. textStatus) => cb(textStatus))
}
fetch
方法const send = (url, param, cb) => {
fetch(url, {
method: 'POST',
body: param
}).then(response => cb(null, response)).catch(error => cb(error))
f
}
首先,由于表单元素先于 CSS 被添加到 HTML,早期的渲染依靠底层系统实现,至今,表单元素在不同浏览器,同一浏览器的不同系统版本中,存在不同的默认外观。
自定义表单样式的方法:
保持跨浏览器,跨操作系统的一致性
可以自定义所有样式
交互、校验、提交等都需要自己完成,代码多,复杂度高
JavaScript 出错或禁用,CSS 加载失败,都可能导致表单失效。在稳定性要求高的场景,需要能降级到原生表单元素
原生表单元素按应用 CSS 的难度 ,分为三类
容易应用,跨平台不易出问题:<form>
<fieldset>
<label>
<output>
难应用,不同平台写不同属性:<legend>
checkbox
radio
placeholder
不推荐应用:<select>
<option>
<optgroup>
<datelist>
<progress>
<meter>
保持跨平台一致性
字体和文本大小:继承父级元素的 CSS,而不使用系统默认样式
button, input, select, textarea {
font-family: inherit;
font-size: 100%;
}
button, input, select, textarea {
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
}
<legend>
元素定位是 <fieledset>
父元素的上边框的最顶端
<textarea>
元素的垂直对齐由基线改为顶端对齐 vertical-align: top
-moz-appearance
清除 Firefox 表单元素的默认样式
-webkit-appearance
清除 Safari 和 Chrome 表单元素的默认样式
:active
:focus
:hover
:enabled
:disabled
:checked
:indeterminate
:default
:valid
:invalid
:in-range
:out-of-range
:required
:optional
:read-only
:read-write
:user-error
阅读量:2013
点赞量:0
收藏量:0