测试代码简单到吓人,甚至于事件都可以写在一个字符串里,用空格分开,不过我觉得太长了不好看,测试浏览器为Chrome 80。
<!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里跟输入有关的事件。
事件概览
跟输入有关的事件大致有如下,所有事件都注意大小写,不然准备好怀疑人生
input
change
keydown
keypress
keyup
textInput
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()
才会阻止住内容输入到输入框里。