测试代码简单到吓人,甚至于事件均可以写在一个字符串里,用空格分开,不过我以为太长了很差看,测试浏览器为Chrome 80。javascript
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <title>Document</title> </head> <body> <input id="input" /> <script> const input = document.getElementById("input"); input.addEventListener("input", function(e) { console.log("input", e); }); input.addEventListener("change", function(e) { console.log("change", e); }); input.addEventListener("textInput", function(e) { console.log("textInput", e); }); input.addEventListener("keydown", function(e) { console.log("keydown", e); }); input.addEventListener("keyup", function(e) { console.log("keyup", e); }); input.addEventListener("keypress", function(e) { console.log("keypress", e); }); input.addEventListener("compositionend", function(e) { console.log("compositionend", e); }); </script> </body> </html>复制代码
针对输入框,咱们知道最多见的两个事件是input
和change
,change
是在回车确认或者输入框失去焦点的时候触发,这估计是大多数人所知道的关于输入的事件了。下面咱们再深刻的挖掘一下在DOM里跟输入有关的事件。
html
若是你还不知道DOM了事件的基础知识,那么是时候先补一下了。java
跟输入有关的事件大体有以下,全部事件都注意大小写,否则准备好怀疑人生浏览器
input
测试
change
ui
keydown
spa
keypress
3d
keyup
code
textInput
cdn
compositionend
依次触发以下事件
keydown
keypress
textInput
input
keyup
change
(若是失去焦点)
看一下keypress
的,选它作表明来表明其余key操做的事件
再看一下textInput
最后看一下input
的
change
里是不含输入内容的
切换到拼音输入法,假如如今咱们想要输入一个“你”字,在输入"N"、"I"后先停下来
输入过程当中,keydown
和keyup
竟然没有成对,出现一个很奇怪key("Process")
的keyup
事件
过程当中,没有出现textInput
事件
出现了input
事件,而且data可能不是单个的字符,好比会是"ni
",而且inputType
是叫insertCompositionText
此时若是输入空格完成中文输入
输入完成后有textInput
事件,而且data
为最终的中文字符
输入完成后有input
事件,而且data
为最终的中文字符
第一次出现了compositionend
事件,它表明了中文的输入完成,data
为最终的中文字符,后面还会再见到它
keyup
事件最后出现,一如既往的仍是有Process
这个特殊的keyup
但若是是输入回车,仅输入英文
输入完成后有textInput
事件,而且data
为最终的英文字符
输入完成后有input
事件,而且data
为最终的英文字符
仍是有compositionend
件的,data
为最终的英文字符
keyup
只出现了一次
因为按下了回车,最后触发了一下change
事件
若是是鼠标点一下失去焦点,使得输入英文
不管如何compositionend
事件都会出来,带的仍是最终的英文字符
失去焦点也触发了change
事件
以上整个过程都没有触发keypress
事件。
最后咱们看一个一口气输入"你好"这个中文词语的事件过程
点击一下回格删除的按钮,咱们能够看到触发的事件顺序以下,注意并无触发textInput
事件
keydown
input
keyup
并不会触发textInput
事件,在key
相关的事件中,能够看到识别出Backspace
键
在input事件中,data
属性为null,可是inputType
能识别出deleteContentBackward
在没有输入任何内容的状况下直接按回车,此时触发的事件顺序是
keydown
keypress
keyup
在输入改变内容后按下回车,此时触发的事件顺序是
keydown
keypress
change
keyup
看一下change
事件中回传的event
吧
经过粘贴也能在文本框中输入内容,用快捷键粘贴依次触发的事件是
keydown
keydown
textInput
input
keyup
keyup
change
(若是失去焦点)
若是使用鼠标右键粘贴,那么不会触发跟key
有关的事件,重点看一下textInput
和input
里回传了哪些内容
在textInput
里,data
里是粘贴的内容,type
是textInput
在input
里,data
是null,但有inputType
为insertFromPaste
拖动字符串内容也能完成输入,比较有趣,依次触发
textInput
input
看一下textInput
,带有内容
再看一下input
,能精确识别出是拖动输入的
直接给出结论了,在用addEventListen
方法也便是DOM2事件代码的前提下,只有keydown
、keypress
、textInput
三种事件处理里调用event.preventDefault()
才会阻止住内容输入到输入框里。