input 如何监听输入中文

花项虎
• 阅读 9485

input 组合事件

compositionEvent 组合事件是拆分了不同步骤的事件的组合,是由 compositionStartcompositionUpdatecompositionEnd三个事件组合而成。

Start 和 End 事件只执行一次,Update 会执行多次。
输入前,会触发 Start 和 Update 事件;没有选中中文之前,会一直触发 Update 事件;选中文字后,会触发 End 事件;一个组合事件完成,以此循环。

compositionstart

输入法编辑器开始新的输入合成时会触发 compositionstart事件。
例如:当用户使用拼音输入法开始输入汉字时,这个事件就会被触发。

compositionupdate

字符被输入到一段文字的时候(这些可见字符的输入可能需要一连串的键盘操作、语音识别或者点击输入法的备选词)会触发 compositionupdate 事件。

compositionend

当文本段落的组成完成或取消时, compositionend 事件将被触发。

注意:清除键、粘贴、英文字母和数字是不会触发这几个事件的。Start 和 Update 事件会在 onChange 之前触发,End 事件在onChange之后触发。

例子

简单使用

<input 
  placeholder="Basic usage" 
  onChange={e => console.log('onchange', e.target.value)}
  onCompositionStart={e => console.log('onCompositionStart', e.target.value)}
  onCompositionUpdate={e => console.log('onCompositionUpdate', e.target.value)}
  onCompositionEnd={e => console.log('onCompositionEnd', e.target.value)}
/>

输入英文'suzhou', 只会触发onChange事件:

input 如何监听输入中文

输入中文‘苏州’,触发事件如下:

input 如何监听输入中文

输入中文‘苏州’后, 删除‘州’,只会触发onChange事件:

input 如何监听输入中文

直接使用 onCompositionEnd事件,只能监听到输入改变,不能监听到删除。

监听输入的中文字符变化,如何实现?

let isOnComposition = false
  
function handleComposition(e) {
  console.log(e.type, e.target.value)
  if (e.type === 'compositionend') {
    isOnComposition = false
    if (!isOnComposition) {
      onChange(e);
    }
  } else {
    isOnComposition = true
  }
}

function onChange(e) {
  if (!isOnComposition) {
    console.log('onChange', e.target.value)
  }
}

ReactDOM.render(
 <input
  placeholder="Basic usage" 
  onChange={onChange}
  onCompositionStart={handleComposition} 
  onCompositionUpdate={handleComposition} 
  onCompositionEnd={handleComposition} 
/>, mountNode);

输入英文‘suzhou’,只会触发 onchange 事件:

input 如何监听输入中文

输入中文‘苏州’,然后删除‘州’,触发事件如下:

input 如何监听输入中文

组合事件与 'onchange' 结合使用,就实现了监听中文字符输入变化。

input 在手机端触发软键盘的表现

输入框聚焦(触发 focus 事件)后,会弹出软键盘, 表现如下:

IOS 软键盘弹起表现

输入框获取焦点后,键盘弹起,页面(webview)没有被压缩,页面可使区域高度(height)还是原高度,只是页面(webview)整体往上滚了,且最大滚动高度(scrollTop)为软键盘高度。

Android 软键盘弹起表现

输入框获取焦点后,键盘弹起,页面(webview)高度会发生改变,高度为可视区高度(原高度减去软键盘高度),除了因为页面内容被撑开可以产生滚动,webview 本身不能滚动。

IOS 软键盘收起表现

触发软键盘上的“收起”按钮键盘或者输入框以外的页面区域时,输入框失去焦点,软键盘收起,会触发 blur事件。

Android 软键盘收起表现

触发输入框以外的区域时,输入框失去焦点,软键盘收起。但是,触发键盘上的收起按钮键盘时,软键盘收起,输入框不会失去焦点,不会触发 blur事件。

综合上面键盘弹起和收起在 IOSAndroid 上的不同表现,需要分开处理来监听软键盘的弹起和收起:

  • IOS 上,监听输入框的 focus 事件来获知软键盘弹起,监听输入框的 blur 事件获知软键盘收起。
  • Android 上,监听 webview 高度会变化,高度变小获知软键盘弹起,否则软键盘收起。
点赞
收藏
评论区
推荐文章
blmius blmius
4年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
美凌格栋栋酱 美凌格栋栋酱
7个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
Easter79 Easter79
3年前
vue element
1.真正理解vmodelinput元素上的vmodel其实是一个语法糖,其真正作用有两个:(1)创建一个props,其键为value;(2)监听input事件,改变value。键名与事件名都可以另外设置。当定义一个组件时,vmodel是绑定在input的外层的,所以需要手动实现vmodel。2.provide/injectprov
一文详解:浅谈Android消息机制原理
Message产生用户滑动屏幕,产生了一系列input事件(一个Down事件,若干个Move事件,一个Up事件),这些事件被系统包装成了一系列Message(一个DownMessage,若干个MoveMessage,一个UpMessage)Message是用来传递信息的,上述Message中就包含了这些input事
LinMeng LinMeng
4年前
解决ios软键盘收回时屏幕空白问题
添加事件:window.scrollTo(x,y)在input的释焦事件中添加blur事件,参数X要在窗口文档显示区左上角显示的文档的x坐标。参数y要在窗口文档显示区左上角显示的文档的y坐标。添加jQuery插件mounted(){//解决ios软键盘弹出屏幕空白$("input,select,te
Stella981 Stella981
3年前
PHP导入导出EXCELl,CSV
PHP导入导出Excel,CSVHTML<formaction"{:U('Admin/Unit/importcsv')}"method"post"name"myform"id"myform"enctype"multipart/formdata"<input
Stella981 Stella981
3年前
KaliTools说明书+BurpSuit实战指南+SQL注入知识库+国外渗透报告
!(https://oscimg.oschina.net/oscnet/d1c876a571bb41a7942dd9752f68632e.gif"15254461546.gif")0X00KaliLinux Tools中文说明书!(https://oscimg.oschina.net/oscnet/
Stella981 Stella981
3年前
JQuery中对option的添加、删除、取值
jQuery获取Select选择的Text和Value:1\.$("select\_id").change(function(){//code...});  //为Select添加事件,当选择其中一项时触发2\.varcheckText$("select\_id").find("option:selected").text();  
Stella981 Stella981
3年前
ELK学习笔记之配置logstash消费kafka多个topic并分别生成索引
0x00 filebeat配置多个topicfilebeat.prospectors:input_type:logencoding:GB2312fields_under_root:truefields:添加字段
Stella981 Stella981
3年前
Noark入门之异步事件
引入异步事件主要是为了各模块的解耦,每当完成一个动作时,向系统发布一个事件,由关心的模块自己监听处理,可选择同步处理,异步处理,延迟处理。何时发布事件,当其他模块关心此动作时<br比如获得道具时,任务系统模块要判定完成进度,BI模块需要上报等等都可以监听此事件,已达模块解耦0x00事件源一个实现xyz.noark.core.event