oninput在值变化时立即触发,包括键盘输入、粘贴、删除等;onchange需值变且失焦才触发,适用最终确认场景。

oninput 事件什么时候触发?
只要 input 或 textarea 的值发生变化,就立刻触发——包括键盘输入、粘贴、剪切、拖拽、自动填充(部分浏览器)、甚至用鼠标选中后按 Delete 键删除内容。它不关心焦点是否还在,也不等用户“确认”。
常见错误现象:oninput 在 type="file" 或 select 上无效;在 IE9 及更早版本中完全不支持(需 fallback 到 onpropertychange)。
使用场景举例:
- 搜索框实时过滤列表
- 密码强度实时校验
- 字数统计(含粘贴后立即更新)
onchange 事件的触发条件很具体
onchange 必须同时满足两个条件才会触发:值确实发生了变化 + 元素失去焦点(blur)。哪怕用户输了一百个字,只要没点别的地方或按 Tab 键,就不会触发。
容易踩的坑:
- 移动端软键盘收起不一定等于 blur,某些 Android 浏览器中
onchange延迟或不触发 - 脚本修改
value属性(如el.value = 'xxx')不会触发onchange -
type="checkbox"和type="radio"的onchange是点击即触发(因为点击会隐式 blur),这点和文本输入框不同
元素兼容性差异不能忽略
oninput 支持:input[type=text|number|email|password|search|tel|url]、textarea、contenteditable 元素;不支持 select、input[type=file]、input[type=checkbox]。
onchange 支持更广:input(全类型)、select、textarea、keygen(已废弃),也适用于 input[type=range] 拖动结束时(但注意:拖动中不会触发)。
性能影响:
-
oninput频率高,频繁操作(如每打一个字都发请求)易造成卡顿或服务端压力,建议加防抖 -
onchange触发少,适合做最终校验、提交前处理,但无法响应“中途放弃”的行为(比如用户输一半就关页)
实际开发中怎么选?
判断依据不是“哪个更新快”,而是“你真正要捕获什么行为”:
- 需要监听用户正在做什么 → 用
oninput(但记得处理粘贴/拖拽/自动填充) - 需要确认用户已决定提交这个值 → 用
onchange(配合 blur 或 submit 更稳妥) - 既要实时反馈又要兜底确认 → 两个都绑,但逻辑分离(例如
oninput做 UI 提示,onchange做数据提交)
特别注意:oninput 不会响应通过 JS 赋值引起的 value 变化;而 onchange 对 JS 赋值也无感——两者都只响应用户主动交互引发的变更。如果必须监听 JS 修改,得手动 dispatch Event('input') 或 Event('change')。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











