这两天有个大新闻,oracle向一位ios开发者的产品提起诉讼,原因是他在自己的产品名称中使用JavaScript这个单词,而且JavaScript是当年sun注册的商标,而后来sun又卖给了oracle。于是大家开始讨论,是时候给JavaScript改个名字了。
今天来谈一下在手机中文输入法输入到input时的一些事件问题。我们对一个input是否在输入内容,往往非常惬意的使用input或change事件。但是在遇到手机中文输入法时,可能事情没那么容易。
对于中文输入法而言,input事件监听到的,是每一次点击键盘的操作,而非最终选择的中文字。这和英文输入有点不同,中文输入不是所见即所得,而是音/象拼形,所以是两步走,先拼再选。input只能监听拼这个步骤,而选则要依靠另外一个事件:compositionend。
当文本段落的组成完成或取消时, compositionend 事件将被激发 (具有特殊字符的激发, 需要一系列键和其他输入, 如语音识别或移动中的字词建议)。
与它配合的事件是compositionstart。
compositionstart事件触发于一段文字的输入之前(类似于 keydown 事件,但是该事件仅在若干可见字符的输入之前,而这些可见字符的输入可能需要一连串的键盘操作、语音识别或者点击输入法的备选词)。
这两个事件用在语音输入上非常有用。语音输入没有拼的过程,因此没有input事件,当语音输入被激发时,可以通过compositionstart事件的回调函数来执行一些事情,语音输入完(有的时候要你选一些词)可以用compositionend事件的回调来做一些事。但是和input对应,在语音输入过程中,一般的语音输入是直接出文字的,也就是说在input框里面,会按照你当前说的话,翻译成文字,虽然这段文字还是被选中状态,这种状态怎么监听呢?用compositionupdate事件。
compositionupdate 事件触发于字符被输入到一段文字的时候(这些可见字符的输入可能需要一连串的键盘操作、语音识别或者点击输入法的备选词)
但是我们本文是在说输入法,所以暂时用不上compositionupdate。
对于中文输入法我们可以看作这样一个流程:compositionstart -> input -> compositionend。
let input = document.getElementById('input') let typing = false input.addEventListener('compositionstart', function() { typing = true }, false) input.addEventListener('input', function() { if (typing) { // 这里可以做点其他事情,比如通过拼音去联想用户要输入的中文字,然后提前进行后台搜索 } // 如果你不想进行任何处理,可以不用监听input事件,这个时候,连compositionstart都可以省了 }, false) input.addEventListener('compositionend', function() { // 这里写当用户选择了要输入的中文字之后要执行的动作 typing = false }, false)
但是很明显,当用户点击一个input,打开软键盘的时候,你是不知道用户处于中文输入法还是英文输入法状态的,这个时候compositionstart都会被触发,但是英文输入法会直接被输入到文本框里面。不过也有例外,iphone的英文输入法键盘会有联想,也可以进行选择,因此,这种情况下最好将三个事件一起配合使用。
2018-04-20 4503 事件