和表单元素相关的事件有:change、input、compositionstart/compositionupdate/compositionend、focusin/focus、focusout/blur、submit。
change
change 事件可以被 <input>、<textarea>、<select>、checkbox/radio 元素触发,.
注意,对于文本输入内容的改变,也就是说在文本域(input、textarea)输入内容时候,该事件不会触发,直到当文本元素失去焦点 时,触发该事件。
对于 <select>、checkbox/radio 则只要发生变化就能正常触发该事件。
input
这个事件和上一个事件相似也是处理表单元素的变化:当 <input>、<textarea>、<select> 元素的值更改时,input 事件会同步的触发。
如果想要处理 <input>、<textarea> 的每个修改,那么这个事件是最好的:
<!-- 每次修改,并不会弹出对话框,直到该元素失去焦点才弹出 --> |
而对于 checkbox/radio 元素,当用户单击控件时,input 事件不会触发,因为 value 属性没有更改。
<!-- 每次修改,并不会弹出对话框,直到该元素失去焦点才弹出 --> |
一些键盘事件如 keyup、keypress 也可以用来监控文本的改变,但是键盘事件对于控制键,比如 Ctrl、 Shift 等也会触发。
注意:这个事件的 Cancelable 值为 false。因此无法取消,event.preventDefault() 不起作用。
compositionstart、compositionupdate、compositionend
当我们在使用 input 或者 keyup 事件监控用户的输入的时候,当用户的输入语言是中文的时候,会出现一些问题,比如用户输入“事件”,如果我们监控了 input 事件,则实际上会导致了多次触发事件,比如下面这个例子:
用户使用中文输入法输入 “shijian” 并选中 “事件” 词语,控制台会打印以下结果:
ele.addEventListener('input', function (e) { |
如果我们根据用户的输入实时向服务端查询数据,则发出了多个无效查询,这堆拼音并不是我们想要查询的内容,我们想要处理的输入文本是“事件”,这个时候,这几个事件就派上了用场。
首先看一下这三个事件在 MDN 的描述:
compositionstart:事件触发于一段内容的输入之前(类似于 keydown 事件,但是该事件仅在若干可见字符的输入之前,而这些可见字符的输入可能需要一连串的键盘操作、语音识别或者点击输入法的备选词。compositionupdate:事件触发于内容被输入到一段文字的时候(此时类似于 input 事件,这些可见字符的输入可能需要一连串的键盘操作、语音识别或者点击输入法的备选词)。compositionend:事件触发于一段文字的输入之后。
再来看一下事件触发顺序:
ele.addEventListener('keydown', function (e) { |
知道了这些内容,这样我们就可以这样解决上面的问题:
function inputListener(ele, callback) { |
focusin、focus 与 focusout、blur
当元素获得焦点的时候可以触发 focusin、focus,两者不同之处在于 focusin 事件冒泡 focus 事件不冒泡,而同理,元素失去焦点的时候可以触发 focusout、blur,两者不同之处在于 focusout 事件冒泡 blur 事件不冒泡。
注意,并不是所有元素都支持这几个事件的。
submit
执行提交表单的行为触发的事件。
触发表单事件有三种方式:
- 点击
<input type="submit">、<input type="image">(type="image"是图形的提交按钮) - 在表单域按(input,textarea 等)
Enter键 - 调用
form.submit()
使用 event.preventDefault() 可以阻止数据被提交。
注意,在表单元素使用 Enter 提交表单的时候,会触发提交按钮的上的一个点击事件,尽管并没有发生点击:
<form> |