表单基础
管理后台不仅要展示学员数据,还要接收查询条件和登记信息。HTML 表单负责描述“填写哪些字段、把数据提交到哪里”,后端怎样接收和处理不属于本节范围。
先观察一个手机登录表单:页面中有文字说明、输入框和按钮,这些内容可以放在同一个 form 中。这里展示页面结构,按钮尚未连接登录服务。
本节先完成一个最小表单,再逐步补上提交方式、字段关联和文本输入规则,最后完成学员快速登记案例。
搭建最小表单
先做一个只收集学员姓名的表单:
<form action="#" method="get">
<label for="name">姓名</label>
<input id="name" name="name" type="text">
<button type="submit">提交</button>
</form>这段代码包含四个基础元素:
| 元素 | 作用 |
|---|---|
form | 包裹需要一起提交的字段和按钮 |
label | 说明输入项的含义 |
input | 接收用户输入 |
button | 触发表单提交 |
form 的 action 指定提交地址,method 指定提交方法。这里使用 action="#" 作为占位地址,因此不需要启动后端服务。
设置提交方式
表单提交时,浏览器会根据 action 和 method 组织请求。本节只观察浏览器端行为,不讨论服务端实现。
使用 GET 查询数据
<form action="/students" method="get">
<label for="keyword">关键词</label>
<input id="keyword" name="keyword" type="search">
<button type="submit">查询</button>
</form>输入“张三”并提交后,浏览器会访问类似下面的地址:
/students?keyword=张三GET 参数通常出现在地址栏,适合查询、筛选和分页。不要用 GET 提交密码等敏感信息。
使用 POST 提交数据
<form action="/students" method="post">
<label for="student-name">姓名</label>
<input id="student-name" name="name" type="text">
<button type="submit">新增学员</button>
</form>POST 常用于新增、登录等操作。POST 参数不直接显示在地址栏,但这不等于数据自动安全;实际项目仍需使用 HTTPS,并由后端完成权限检查和数据验证。
直接打开本节附件时,/students 并不存在,提交后出现找不到页面或请求失败属于正常现象。这里要观察的是地址和提交方式。
关联说明与提交字段
一个字段通常同时用到 label、id 和 name:
<label for="mobile">手机号</label>
<input id="mobile" name="mobile" type="tel">预览效果如下。点击“手机号”可以让输入框获得焦点:
三个属性的职责不同:
| 内容 | 作用 |
|---|---|
for="mobile" | 指向 id="mobile" 的控件 |
id="mobile" | 作为页面内唯一标识,供 label 等内容引用 |
name="mobile" | 作为提交给服务器的字段名 |
点击“手机号”文字,输入框会获得焦点,这就是 for 与 id 建立关联后的效果。id 应在当前页面中保持唯一;没有 name 的控件通常不会进入表单提交数据。
控件也可以直接放入 label:
<label>
姓名
<input name="name" type="text">
</label>两种写法都有效。课程案例优先使用显式的 for 和 id,字段较多时更容易检查对应关系。
完善文本字段
区分普通文本与密码
type="text" 用于普通单行文本,type="password" 会在界面中隐藏输入字符:
<label for="name">姓名</label>
<input id="name" name="name" type="text">
<label for="password">密码</label>
<input id="password" name="password" type="password">预览效果如下:
密码框只改变页面显示方式,不能替代 HTTPS 和服务端安全处理。
设置初始值与填写提示
<label for="city">所在城市</label>
<input
id="city"
name="city"
type="text"
value="长沙"
placeholder="例如:长沙"
>预览效果如下。清空“长沙”后才会看到填写提示:
value:控件的初始值,也是未修改时的提交值。placeholder:输入为空时显示的短提示,不能替代label。
添加浏览器原生约束
<label for="username">账号</label>
<input
id="username"
name="username"
type="text"
required
minlength="2"
maxlength="20"
autocomplete="username"
>| 属性 | 作用 |
|---|---|
required | 要求填写后才能提交 |
minlength | 限制最少字符数 |
maxlength | 限制最多字符数 |
autocomplete | 告诉浏览器字段用途,帮助浏览器正确自动填充 |
浏览器约束可以改善填写体验,但请求可以绕过浏览器,因此后端仍需再次验证数据。
区分只读与禁用
<label for="student-id">学员编号</label>
<input id="student-id" name="student_id" value="S1001" readonly>
<label for="source">数据来源</label>
<input id="source" name="source" value="系统导入" disabled>预览效果如下:
| 属性 | 能否修改 | 是否通常随表单提交 |
|---|---|---|
readonly | 否 | 是 |
disabled | 否 | 否 |
需要展示并提交固定值时使用 readonly;字段暂时不可用且不应提交时使用 disabled。
为后续 JavaScript 保留字段契约
表单字段不仅决定页面显示什么,也决定浏览器提交什么数据。后续 JavaScript 会根据这些字段整理对象和数组,因此字段名和值要稳定、清楚:
| HTML 内容 | 后续数据处理中的意义 |
|---|---|
name="mobile" | 提交数据中的字段名,也可以作为对象属性名 |
id="mobile" | 当前页面中的唯一标识,供 label 或后续 DOM 查询使用 |
value="online" | 程序使用的稳定值,不等同于页面显示文字 |
多个相同 name 的复选框 | 一个字段对应多个值,后续可以整理成数组 |
显示文字可以写成“线上学习”,程序值则使用 online。不要把页面上的说明文字当成数据键。p01 只负责定义字段,不在这里讲对象创建、数组转换和数据更新;这些内容放到 p03。
完成学员快速登记
现在把本节内容合并成一张快速登记表。表单只使用文本类字段,不加入下一节才讲的单选、多选、下拉和文件控件。
<form action="/students" method="post">
<p>
<label for="name">姓名</label>
<input
id="name"
name="name"
type="text"
minlength="2"
maxlength="20"
autocomplete="name"
required
>
</p>
<p>
<label for="mobile">手机号</label>
<input
id="mobile"
name="mobile"
type="tel"
autocomplete="tel"
required
>
</p>
<p>
<label for="password">初始密码</label>
<input
id="password"
name="password"
type="password"
minlength="8"
autocomplete="new-password"
required
>
</p>
<button type="submit">提交登记</button>
</form>下方仅预览外观,按钮不会提交数据:
检查这张表单时,按下面的顺序核对:
- 每个
label的for是否能找到对应的id。 - 每个需要提交的控件是否有
name。 action和method是否符合当前操作。- 必填、长度和自动填充属性是否放在正确字段上。
小结
form使用action和method描述提交目标与方式。- GET 适合查询,POST 常用于新增或修改数据。
label说明字段,id建立页面关联,name决定提交字段名。text、password、value和placeholder负责不同的文本输入需求。- 浏览器原生约束用于改善填写体验,不能代替后端验证。
readonly字段通常会提交,disabled字段通常不会提交。