測試代碼簡單到嚇人,甚至於事件均可以寫在一個字符串裏,用空格分開,不過我以爲太長了很差看,測試瀏覽器爲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()
纔會阻止住內容輸入到輸入框裏。