ie8不支持oninput事件,需用onpropertychange+onkeyup组合监听,并过滤非value属性变更;onpropertychange需校验propertyname==='value'并比对新旧值,再叠加onpaste/ondrop加settimeout延迟读取以补全粘贴拖拽场景。

IE8 不支持 oninput 事件,必须降级使用 onpropertychange + onkeyup 组合监听,且需过滤非输入类属性变更。
为什么 oninput 在 IE8 完全无效
IE8 及更早版本未实现 DOM Level 3 的 input 事件规范,调用 addEventListener('input', ...) 或写 oninput="..." 都不会触发。直接监听会静默失败,无报错但无响应。
常见错误现象:input 元素粘贴、删除、中文输入法上屏时完全不触发回调;仅键盘按键(onkeydown)能捕获,但无法区分是否真修改了值。
- IE8 唯一可用的原生输入变化钩子是
onpropertychange,但它监听所有属性变更(如className、style),必须手动过滤 -
onkeyup可补漏,但对鼠标粘贴、右键粘贴、拖拽文本等场景无效 - 不能只靠
onkeyup,否则中文输入法「选字中」阶段就提前触发,导致输入不完整
onpropertychange 的正确监听方式
必须限定只响应 value 属性变更,并在回调中比对新旧值,避免重复触发或误触发。
实操建议:
- 给
input元素绑定onpropertychange,并在事件处理器中检查event.propertyName === 'value' - 用闭包或
data-属性缓存上一次value,防止因多次触发导致逻辑重复执行 - 不要在
onpropertychange中直接调用耗时操作(如 AJAX),IE8 下频繁触发易卡顿
input.onpropertychange = function(e) {
if (e.propertyName !== 'value') return;
var newValue = this.value;
if (newValue !== this._lastValue) {
this._lastValue = newValue;
handleInput(newValue); // 你的业务逻辑
}
};
如何补全粘贴、拖拽等 onpropertychange 漏掉的场景
onpropertychange 对鼠标粘贴、拖拽插入文本响应有延迟(有时需等焦点离开才触发),必须叠加 onpaste 和 ondrop,并在它们之后主动触发一次值校验。
-
onpaste和ondrop触发后,加setTimeout(..., 0)延迟读取value,确保 DOM 已更新 - 不要依赖
oncut/oncopy,它们与输入无关,且 IE8 支持不稳定 - 若项目已用 jQuery,可统一用
$.fn.on('input propertychange paste drop', ...),但内部仍要按上述逻辑做值比对
input.onpaste = input.ondrop = function() {
var self = this;
setTimeout(function() {
if (self.value !== self._lastValue) {
self._lastValue = self.value;
handleInput(self.value);
}
}, 0);
};
兼容写法最终整合要点
一个真正可用的 IE8 实时输入监听,不是简单绑定多个事件,而是要有状态管理、去重判断和触发时机控制。
- 初始化时务必设置
input._lastValue = input.value,否则首次输入无法比对 - 避免同时绑定
onkeyup和onpropertychange,前者易造成中文输入法下重复触发(选字+上屏各一次) - 如果页面存在动态创建的
input,需对每个实例单独绑定,IE8 不支持事件委托到document捕获input类事件 - 注意:IE8 下
contenteditable元素不适用此方案,需改用onselectionchange+ 定时轮询
最易被忽略的是 onpropertychange 的触发粒度——它在 IE8 下甚至会对 value 的每一次底层变更都抛事件(比如输入法组合过程中),所以值比对和节流几乎是必须的,否则 UI 会明显卡顿。











