1.2
|
| enctype | 含义 | 适用场景 |
|---|---|---|
application/x-www-form-urlencoded |
默认;URL 编码键值对 | 普通文本表单(登录/搜索/注册) |
multipart/form-data |
多部分表单,不对内容做 URL 编码 | 必须用于文件上传(<input type="file">) |
text/plain |
纯文本(编码很弱) | 调试或极少数特殊约定场景(一般不用于生产) |
文件上传示例(必须 POST + multipart/form-data):
<form action="/upload" method="post" enctype="multipart/form-data">
<div>
<label for="name">姓名:</label>
<input type="text" id="name" name="name">
</div>
<div>
<label for="avatar">上传头像:</label>
<input type="file" id="avatar" name="avatar" accept="image/*">
</div>
<button type="submit">提交</button>
</form>
method:GET / POST / DIALOG
| 维度 | GET | POST | DIALOG |
|---|---|---|---|
| 数据位置 | URL 查询串 ?key=value |
请求体 body | 不提交到服务器 |
| 适用 | 小数据、非敏感(搜索/筛选) | 敏感/大数据/会修改数据(登录/注册/上传) | <dialog> 内表单:提交即关闭弹窗 |
| 备注 | 易泄露到地址栏/日志 | 更安全(仍建议 HTTPS) | action 通常被忽略 |
与网络语义相关的细节(如 GET 的可缓存、POST 的重复提交风险等),本质都建立在 HTTP 行为之上。
target:响应内容显示在哪
| 值 | 行为 |
|---|---|
_self(默认) |
当前窗口/标签页 |
_blank |
新窗口/新标签页 |
_parent |
父框架 |
_top |
顶层窗口(跳出 iframe) |
framename |
指定 name 的框架 |
target="_blank"建议配合rel="noopener noreferrer",避免window.opener带来的安全问题。
novalidate:禁用浏览器内置校验
<form action="#" novalidate>
<label>E-mail: <input type="email" name="user_email"/></label>
<input type="submit" />
</form>
name:表单命名(主要用于 JS/兼容)
document.forms['loginForm'])或多表单区分。id + querySelector;表单控件的 name 才是提交数据的关键。<form name="loginForm" action="/login" method="post">
<label>用户名:<input type="text" name="username"></label>
<label>密码:<input type="password" name="password"></label>
<button type="submit">登录</button>
</form>
<script>
const form = document.forms['loginForm'];
const username = form.elements['username'];
form.onsubmit = function() {
if (username.value === '') {
alert('请输入用户名');
return false;
}
return true;
};
</script>
rel:与提交目标的关系(安全/SEO/语义)
常用组合(空格分隔):
noopener、noreferrernofollowsearch、help、prev/next<form action="/submit" rel="noopener noreferrer nofollow" target="_blank">...</form>
<form action="/search" rel="search" method="get">...</form>
<label>:表单控件说明(可访问性关键)
<label> 用来描述表单控件用途,提升可用性与可访问性:
for 绑定 id<label for="username">用户名</label>
<input id="username" type="text">
<label>出生日期:<input type="text" name="dob"></label>
<form>
<label for="male">Male</label>
<input type="radio" name="sex" id="male" />
<br />
<label for="female">Female</label>
<input type="radio" name="sex" id="female" />
<input type="submit" value="提交表单" />
</form>
实务建议:尽量不要把额外的交互元素(如
<a>)塞进<label>内,避免点击行为冲突。
<input>:最常用的输入控件(空元素)
<input> 的外观与行为主要由 type 决定。未写 type 时默认 type="text"。
基本语法:
<input type="输入类型" name="字段名" value="默认值" />
输入框的用途说明优先用
<label>,placeholder只做辅助提示。
<input> 常用属性总表(精选但覆盖常见场景)| 属性 | 用途 | 适用 type |
备注 |
|---|---|---|---|
accept |
文件选择过滤(建议性) | file |
可写 MIME 或扩展名,逗号分隔 |
alt |
图片提交按钮替代文本 | image |
可访问性必备 |
autocomplete |
自动填充类型/开关 | 多数文本/数值类 | 推荐用具体令牌值 |
autofocus |
页面加载自动聚焦 | 可聚焦元素 | 多个只生效一个 |
checked |
默认选中 | checkbox/radio |
只影响初始状态 |
dirname |
提交文本方向字段 | text/search/url/tel/email 等 |
常配合 dir="auto" |
disabled |
禁用控件(不提交) | 全部 | 无法聚焦/交互 |
readonly |
只读(会提交) | 文本/日期/数字类 | 不参与约束验证 |
required |
必填 | 多数输入类型 | 仅前端约束,后端仍需校验 |
min/max/step |
数值/日期范围与步进 | number/range/date... |
格式必须符合 type |
minlength/maxlength |
字符长度范围 | 文本类 | 对 number 常无效 |
multiple |
多文件/多邮箱 | file/email |
邮箱用英文逗号分隔 |
pattern |
正则验证 | 文本类 | 隐式全匹配,无需 ^$ |
list |
绑定建议值列表 | 多数文本/数值/日期等 | 配合 <datalist> |
form* |
覆盖 form 的提交行为 | 提交按钮 | formaction/formmethod/... |
accept:文件类型过滤(提示,不是强制)
<input type="file" accept="image/gif,image/jpeg">
<input type="file" accept="image/*">
<input type="file" accept=".png,.gif,.jpg">
accept只是前端筛选提示,用户可切换“所有文件”绕过;服务端必须做二次校验(如检查 MIME、Magic Number 等)。
alt:图片提交按钮的替代文本(仅 type="image")
<form action="/submit">
<input type="image" src="submit.png" alt="提交表单">
</form>
disabled vs readonly:最容易混| 特性 | disabled |
readonly |
|---|---|---|
| 是否可编辑 | 否 | 否 |
| 是否可聚焦 | 否 | 是(可 Tab 到) |
| 是否随表单提交 | 不提交 | 会提交 |
| 适用 | 不允许交互且不需要传值 | 需要展示且必须提交该值 |
list + <datalist>:建议值列表(不强制)
绑定规则:input.list 的值 = datalist.id。
<label>请选择您喜欢的水果:
<input type="text" list="fruits" name="fruit">
</label>
<datalist id="fruits">
<option value="apple"></option>
<option value="banana"></option>
<option value="orange"></option>
</datalist>
<datalist>:建议值数据列表(仅建议、非强制)
<datalist> 本身不会直接显示;必须与 <input list="..."> 绑定后才会出现建议列表。option[value],尽量不要过度依赖 label/文本内容 的展示一致性。option 的 value/label/文本内容 差异示例<label>请选择您喜欢的水果:
<input type="text" list="fruits-two" name="fruits-choice">
</label>
<datalist id="fruits-two">
<option value="apple">苹果</option>
<option value="banana">香蕉</option>
<option value="orange">橘子</option>
</datalist>
结论:输入框最终填入的一定是
value;下拉里显示label/文本/value的组合因浏览器而异。
<select> 和 <datalist> 的核心区别| 特性 | <select> |
<datalist> |
|---|---|---|
| 交互 | 只能选固定项 | 可选建议项,也可自由输入 |
| 是否强制选项 | 强制 | 不强制(仅建议) |
| 多选 | 支持(multiple) |
不支持 |
| 样式控制 | 受限 | 输入框可控,但建议列表样式通常不可控 |
| 兼容性 | 全面 | 现代浏览器为主,细节有差异 |
method="get" + enctype 默认即可;但涉及隐私/登录一般用 post。 method="post" + enctype="multipart/form-data"。 <label for="id">,不要用 placeholder 代替说明。 disabled 不提交,readonly 会提交;别用错。 datalist 是“建议”,select 是“限制选择”。