Input Text键盘类事件触发结果总结

Input的键盘类事件(onkeydown、onkeyup等)触发的规则在不同浏览器下并不一致,本文总结了在IE9~IE11以及Chrome和Firefox下这些事件触发的规则。

本文Demo:https://www.lyz810.com/demo/inputKeyEvent/
下载对比表格:https://www.lyz810.com/demo/inputKeyEvent/inputEventCompare.xlsx

说明:本文中只考虑IE9~IE11以及Chrome和Firefox浏览器,文中的其他浏览器均指代上述范围内的浏览器。

一、oninput和onpropertychange

oninput是HTML5中针对input、textarea及select新增的事件,在IE9以上以及其他浏览器中可以使用。
老板本的IE(IE10及更早版本)中,支持使用onpropertychange事件来实时监听用户输入。
注意:onpropertychange事件会在input的任意一个属性变化时回调,所以使用时应判断哪个属性发生了变化。

二、IE中oninput的坑
在IE10以上的版本中(支持placeholder的IE),如果设置了placeholder,那么在input获取焦点时,如果原始值为空,则会触发oninput事件,因为IE的placeholder会在获取焦点时清空,而Chrome和Firefox不会(在输入第一个字符后,placeholder内容才会消失)。
同理,删除最后一个字符也会触发oninput(但这个是正常情况,毕竟input的值已经发生了改变)。

三、键盘事件触发顺序表

onkeydown onkeypress oninput onkeyup onchange onblur onpropertychange
IE9 1 2 3 5 6 7 4
IE10 1 2 4 5 6 7 3
IE11 1 2 3 4 5 6
Chrome 1 2 3 4 5 6
Firefox 1 2 3 4 5 6

总体看来,基本上都是down→press→input→up,但IE9和IE10的onpropertychange触发顺序是相反的,IE9会先触发oninput然后才是onpropertychange,IE10则是先触发onpropertychange,然后再触发oninput。

四、特殊按键触发表

onkeydown onkeypress onkeyup oninput onpropertychange
IE9 ESC、SHIFT、CTRL、ALT、DELETE、BACKSPACE、ENTER ESC、ENTER ESC、SHIFT、CTRL、ALT、DELETE、BACKSPACE、ENTER
IE10 ESC、SHIFT、CTRL、ALT、DELETE、BACKSPACE、ENTER ESC、ENTER ESC、SHIFT、CTRL、ALT、DELETE、BACKSPACE、ENTER DELETE、BACKSPACE DELETE、BACKSPACE
IE11 ESC、SHIFT、CTRL、ALT、DELETE、BACKSPACE、ENTER ESC、ENTER ESC、SHIFT、CTRL、ALT、DELETE、BACKSPACE、ENTER DELETE、BACKSPACE
Chrome ESC、SHIFT、CTRL、ALT、DELETE、BACKSPACE、ENTER ENTER ESC、SHIFT、CTRL、ALT、DELETE、BACKSPACE、ENTER DELETE、BACKSPACE
Firefox ESC、SHIFT、CTRL、ALT、DELETE、BACKSPACE、ENTER ESC、ENTER、DELETE、BACKSPACE ESC、SHIFT、CTRL、ALT、DELETE、BACKSPACE、ENTER DELETE、BACKSPACE

测试了ESC、SHIFT、CTRL、ALT、DELETE、BACKSPACE、ENTER按键,它们都可以触发onkeydown和onkeyup事件。
除IE9外,其他浏览器在两种删除按键下都可以触发oninput事件,IE10还可以触发onpropertychange事件(IE9都不能触发,要想监控到删除字符需要使用keydown)。
而onpress事件触发规则更是五花八门,IE下只有ESC和ENTER可以触发,Chrome只有ENTER能够触发,Firefox在ESC、ENTER、DELETE、BACKSPACE下都可以触发onpress事件。

五、剪切粘贴触发规则表

oninput onpropertychange
IE9 粘贴 粘贴
IE10
IE11
Chrome
Firefox

这里IE9仍保持着它的怪异风格,只有粘贴时会触发oninput和onpropertychange事件,剪切时并不会。
IE10和IE11以及其他浏览器剪切粘贴都可以触发oninput事件,而IE10还会触发onpropertychange事件。

六、总结
IE9认为输入框中的内容减少不触发oninput和onpropertychange事件,如删除和剪切,只有增加内容才会触发。
其他浏览器会在文本框内容改变时触发oninput事件。
IE的placeholder会导致初始文本框无内容时,获取焦点即触发oninput事件。
oninput和onpropertychange(IE专有)事件会同时触发,只是不同浏览器中触发顺序不同。
浏览器都是按照down→press→input→up的顺序触发,某些按键不触发其中的几个事件。
在press事件之前,按下的字符不会显示在文本框内,所以要禁止输入一些字符可以在onkeydown或onkeypress事件中阻止默认行为(建议在keydown中,因为keypress的触发规则不同,需要做一些兼容性处理)。
印屏幕键(print screen)只触发keyup不触发keydown。
Fn键不触发任何事件
onchange事件都是在onblur前触发(只有最终内容与focus是不同才会触发)。