type="search"比type="text"多清除按钮、圆角、禁用拼写检查及适配搜索键盘,但语义更强且不自动触发搜索;值仍为字符串,需显式转换;autocomplete="off"常被现代浏览器忽略;disabled不提交值且不可聚焦,readonly则保留提交与聚焦。

input type="text" 和 type="search" 有啥实际区别?
浏览器对 type="search" 的默认行为和 type="text" 并不完全一样:前者会自动添加清除按钮(×),在 Safari 和 Chrome 中还会默认圆角、禁用拼写检查,且部分 iOS 键盘会显示「搜索」而非「完成」。但注意,type="search" 不会自动触发搜索逻辑——它只是语义更强的文本输入,提交仍需监听 submit 或 input 事件。
- 如果只想要一个带清空按钮的搜索框,用
type="search"最省事 - 如果要兼容旧版 IE(不支持
search),降级到type="text"安全,但得自己加按钮和逻辑 - 不要指望
type="search"自动防抖或发请求,那得自己写debounce
<input type="search" placeholder="搜点啥...">
type="number" 输入的值真的是数字吗?
不是。input 元素无论 type 是什么,其 .value 永远是字符串。哪怕用户只输「123」,document.querySelector('input').value 返回的仍是 "123",不是 123。想转成数字,必须显式调用 parseInt() 或 parseFloat(),或者用一元加号 +value。
- 直接拿
value做算术运算(比如value * 2)会隐式转换,但遇到空值或非法字符(如「12a」)就变成NaN -
type="number"的真正价值是:限制键盘类型(移动端弹出数字键盘)、校验格式(输入非数字时checkValidity()返回false)、支持min/max/step属性 - 注意:用户仍可通过粘贴绕过限制,所以服务端和 JS 层仍需校验
常见错误现象:value === 0 永远为 false,因为左边是字符串,右边是数字
为什么 autocomplete="off" 有时不起作用?
现代浏览器(Chrome ≥ 76、Firefox、Edge)会忽略 autocomplete="off",尤其对密码、邮箱、姓名等敏感字段。这不是 bug,是隐私策略升级后的主动干预。
立即学习“前端免费学习笔记(深入)”;
- 对登录表单,浏览器可能强制启用自动填充,即使你写了
autocomplete="off" - 替代方案:用随机字符串欺骗浏览器,比如
autocomplete="new-password"(对密码框有效)、autocomplete="nope"(某些场景下能绕过) - 更可靠的做法是把输入框初始化为空,并在 focus 后再动态设置
type(比如从type="text"改成type="password"),让浏览器“来不及”识别字段用途 - 如果是防止 autofill 覆盖用户手动输入,建议用
setTimeout(() => input.focus(), 0)延迟聚焦,打断自动填充时机
disabled 和 readonly 都不让输,到底该用哪个?
disabled 会让元素不可交互、不可聚焦、不参与表单提交;readonly 只禁用编辑,但保留聚焦、可选中、会随表单一起提交。
- 表单提交时,
disabled的input的值不会被发送,而readonly的会 - 如果只是临时禁止修改(比如审核中状态),又需要后端收到该字段,必须用
readonly -
disabled的元素无法触发focus事件,也无法被tab切入,无障碍支持更弱 - iOS 上有个坑:给
disabled输入框设opacity: 0.5可能导致点击穿透,建议配合pointer-events: none
容易被忽略的地方:表单重置(form.reset())会把 readonly 字段恢复为初始值,但不会动 disabled 字段——后者压根不在表单数据里











