当前位置: 首页 > 科技观察

input实现回车和失去焦点,考虑输入法

时间:2023-03-17 10:59:21 科技观察

大家好,我是前端西瓜哥。最近遇到一个需求,就是我们在input中输入内容后,按下回车键,让input失去焦点。此外,它还可以触发一些业务逻辑,比如将数据保存到服务器。我们使用事件对象来判断Enter是否被按下(event.key==='Enter'),如果按下,则调用input.blur()。一般认为,用户用输入法输入内容后回车,是因为输入法使用不当。回车后,可以将内容输入到input中,但仍处于WorkInProcess(半成品)状态。我不想触发失焦逻辑。希望用户可以继续编辑。例如,你不希望在聊天框中输入输入法后立即发送消息。有两种选择。event.isComposing很容易想到使用keydown。使用输入法时也会触发keydown(MacOS会,Window没测试过,好像不会)。触发器被触发了,但是我们可以通过事件对象的isComposing属性来判断是否正在使用输入法。handleKeydown=(e)=>{if(e.key==='Enter'&&!e.isComposing){e.currentTarget.blur();另外,浏览器支持输入法事件:compositionstart表示开始使用输入法输入内容;compositionupdate表示正在使用输入法输入内容;compositionend表示使用输入法输入内容。keypresskeypress已经被弃用了,但是主流浏览器为了兼容老代码还是会支持的,当然不推荐了。说到很多废弃的特性,我们有时候还是会用到,毕竟浏览器不敢真的去掉。keypress和keydown非常相似,不同的是keydown是在任意键按下时触发,而keypress只有在字符键按下时才会触发。简单的说,修改文本内容的字符会被触发,比如a、1等,像shift不会被触发,但是Enter会被触发,因为它是在敲“回车”。有一个特点,在输入法中输入内容时,包括按空格或回车将内容填入输入框,都不会触发keypress。改用keypress而不是keydown可以保证输入法的回车不会触发事件,自然也就不会触发后续逻辑。