05表单与输入

网页不只是「给人看」的,还要「让人填」:登录、注册、搜索、下单、评论…… 全靠表单。这一章把 form、input 全家族、原生验证一次讲透, 学完就能搭出完整的注册页。

约 22 分钟 9 个动手实验 交互第一课

一、form:所有控件的「家」

<form> 本身不显示任何东西,它是数据的打包器: 收集内部所有控件的值,提交时一并发送给服务器。三个核心属性决定「发给谁、怎么发」。

form 属性逐项分析:action / method / name …
属性作用常用值
action数据提交到哪个地址URL,如 /login
method用什么方式发送get(拼在网址后,可收藏)/ post(藏在请求体,更安全)
target结果打开位置_self(默认)/ _blank(新标签页)
name表单名称JS 里 document.表单名 快速拿到它
autocomplete是否启用自动填充on / off
记忆法:get 像「明信片」——内容写在地址栏上谁都看得见(搜索关键词适合); post 像「密封信」——内容装进信封(密码必须走 post)。提交键只有放在 form 里才生效。
一个最小登录表单:把 type="password" 改成 type="text",密码立刻以明文显示

二、input 的两大通用属性:name 与 value

每个控件都是「键值对」的搬运工:name 是键,value 是值。 提交时服务器收到的就是 username=张三&pwd=123 这样的串。 没有 name 的控件提交时会被直接丢弃——这是新手最常踩的坑。

input 通用属性逐项分析:谁提交、谁被丢弃
通用属性作用备注
name数据键名不写 = 白填,数据不上传
value当前值 / 初始值用户改动会实时更新它
placeholder灰色占位提示不构成数据,只是提示
disabled禁用控件灰掉不可点,不参与提交
readonly只读不可改但参与提交
required必填校验空着就提交,浏览器直接拦
disabled 与 readonly 的差别:把 readonly 摘掉那只读框变可输入;disabled 删掉那只禁用框复活

三、文本类输入:type 大观园

<input> 是个「百变怪」,type 一换就是另一种控件。 先看文本阵营——它们长得像,但键盘形态和校验规则完全不同。

文本阵营 type 逐项分析:键盘形态与校验规则
type用途手机键盘特色校验
text通用单行文本(默认)普通键盘
password密码普通键盘显示为圆点
email邮箱带 @ 的键盘必须含 @ 和域名
tel电话数字拨号盘无(格式各国不一)
url网址/.com必须是合法 URL
search搜索框普通键盘部分浏览器带清除叉
number数字纯数字键盘只收数字,可配 min/max/step
不同 type 的输入框(手机上打开,键盘形态各不相同):往 email 里填个不带 @ 的字,提交时浏览器会红框警告

四、选择类控件:radio / checkbox / select

让用户「选」而不是「打字」,能大幅减少输入错误。单选用 radio(互斥,同组同名),多选用 checkbox(可勾多个),下拉列表用 select

点文字也能选中(label 的功劳);单选互斥、多选随意:再给尺码补一个 XXL 的 radio,它和 S/M/L 必居其一
radio 的互斥完全靠 name 相同:两个 radio 不同名,就变成各选各的独立按钮。 提交的 value 是「S / M / L」,不是「S 码」——给服务器的是代码,不是文案。

五、多行文本与文件上传

<textarea> 没有 value 属性——初始内容写在标签中间, 这一点和 input 相反。文件上传则是 type="file",多文件加 multiple

textarea 可拖右下角改变高度:把两个空格之间的初始文字改成你自己的名字,它就变成默认内容
textarea 属性逐项分析:行数 / 列数 / 长度
textarea 属性作用
rows默认可见行数(高度)
cols默认列数(宽度,一般用 CSS 控制更好)
maxlength最大字符数
placeholder占位提示(空时显示)

六、HTML5 新类型:date / color / range / 时间家族

以前做日期选择要引入几百 KB 的 JS 插件,HTML5 之后浏览器原生全包了。 颜色选择、滑杆、日期时间,一个 type 搞定。

六种原生新控件,点开各有乾坤(Chrome 下效果最全):把 color 的默认值改个色,圆点立刻变
range 适合「大概值」:音量、亮度、价格区间; number 适合「精确值」:数量、年龄。 滑杆没有 value 展示时用户会很懵——旁边记得放一个实时数字。

七、按钮三兄弟与 datalist 智能提示

按钮有三种性格:submit 提交、reset 重置、button 普通按钮<button> 里可以放图标和富文本,比 <input type="submit"> 灵活得多。 <datalist> 则给输入框装上「候选词」能力。

<button> 不写 type 默认就是 submit!——在下面那个输入框里打「上」,看 datalist 冒出候选词
<button> 不写 type 时默认是 submit! 在表单里放「取消」按钮忘了写 type="button",点了直接把表单交了——经典事故现场。

八、原生验证:不写 JS 也能拦住错误

表单验证不用等 JS 出场,HTML 属性就能做第一道防线: required 必填、pattern 正则、min/max 范围、 minlength/maxlength 长度。提交时浏览器自动弹气泡拦截。

原生验证属性逐项分析:免费的校验闸门
验证属性作用示例
required不能为空<input required>
pattern正则匹配pattern="1[3-9]\d{9}" 手机号
min / max数字/日期范围min="18" max="99"
minlength / maxlength字符长度区间minlength="6"
type=email/url格式校验自带规则不用写
三项验证齐上阵(空着提交 / 填错格式提交,看浏览器怎么拦):把年龄默认值改成 20,它才不会被 range 拦下
原生验证是「免费的第一道门」:省 JS、省流量、体验统一。 生产项目里通常再加一层 JS 自定义气泡做中文提示,但 pattern 这道闸永远值得保留。

九、label、fieldset 与 progress/meter

<label> 绑定文字与控件(点文字即点控件,读屏软件也靠它); <fieldset> + <legend> 给表单分组画框; <progress><meter> 展示进度与度量。

fieldset 分组 + progress / meter:把 meter 的 value="0.6" 改成 0.92,度量计立刻越过 high 变红警示

十、本章小结

  • form 是数据打包器:action 发给谁、method 怎么发(get 明信片 / post 密封信)。
  • 没有 name 的控件不提交;disabled 的也不提交,readonly 的会提交。
  • input 靠 type 百变:文本七兄弟键盘校验各不同,手机端差异最明显。
  • radio 靠同名分组互斥;checkbox 独立多选;select 的 value 与文案分离。
  • textarea 初始值写在标签中间;file 靠 accept 过滤类型、multiple 开多选。
  • HTML5 原生控件:date / color / range 免插件,一行 type 顶一个 JS 库。
  • button 默认就是 submit,普通按钮必须手写 type="button"
  • required / pattern / min-max / minlength 是免费的验证第一道门。
  • label 绑 id 提升可点性,fieldset+legend 分组,progress 显进度、meter 显度量。
动手练习:做一个「奶茶定制单」——fieldset 分两组(规格 / 加料), 尺码用 radio、甜度用 range、加料用 checkbox、口味用 select+datalist, 备注用 textarea(maxlength=100),最后放 submit 和 type="button" 的取消键, 手机号栏加上 required + 正则验证。全章知识点一网打尽。