在做搜索等功能时,很多时候我们需要实时获取用户输入的值,而常常会得到类似 w'm 这样的拼音。为了解决这个问题,我在网上搜索了下相关问题,发现了两个陌生的事件:compositionstartcompositionend

compositionstart & compositionend

MDN 上找到了关于他们的描述,compositionstartcompositionend。简单点描述如下:

  • compositionstart:在输入中文或者语音等需要等待一连串的输入的操作之前,compositionstart 事件会触发。
  • compositionend:在输入中文或者语音等完毕或取消时,compositionend 事件会触发。

input 和 compositionend 的触发顺序导致的问题

注:以下为 chrome 浏览器下的测试结果,关于其他浏览器请看兼容说明!

和大多数人的想法一样,我考虑使用一个布尔值来判断是否在等待输入法的输入,然后在 input 事件中根据其布尔值决定是否获取输入的值,初始代码如下:

var isInputZh = false;

elem.addEventListener('compositionstart', function (e) {
isInputZh = true;
}, false);
elem.addEventListener('compositionend', function (e) {
isInputZh = false;
}, false);
elem.addEventListener('input', function (e) {
if (isInputZh) return;
var value = this.value;
console.log(value);
doSomething(value);
}, false);

嗯。。看起来好像没啥问题,运行后,却有些让人摸不着头脑。在一段中文输入完毕后却并没有在控制台输出任何数据。嗯。。测试后发现 compositionend 事件是在 input 事件之后触发的。

解决方法

最后只能用常规方法去解决:在 compositionendinput 事件中都得加入对输入值的处理。代码如下:

var isInputZh = false;
var search = document.querySelector('input'); search.addEventListener('compositionstart', function (e) {
isInputZh = true;
}, false);
search.addEventListener('compositionend', function (e) {
isInputZh = false; doSomething(search.value);
}, false);
search.addEventListener('input', function (e) {
if (isInputZh) return;
var value = this.value; doSomething(value);
}, false);

关于兼容说明

以上测试是在 chrome 浏览器下进行的,在 FirefoxEdge 浏览器下发现 input 事件在 compositionend 事件之后触发,且在输入数字时发现 FirefoxEdge 也会触发 compositionend 事件,以上内容仅在 chrome 浏览器中适用。

写在最后

原文发在 github。如果大家有什么好的解决方案欢迎在评论中提出。

解决oninput事件在中文输入法下会取得拼音的值的问题的更多相关文章

  1. 解决oninput在输入中文时,会获取拼音的问题

    (1)起因:在今天做项目测试的时候发现的问题,在用微软自带的输入法的时候,输入中文,文本框会获得拼音 如图所示: (2)解决办法:经过一段时间的百度查找,最后通过这篇文章找到了解决的方法,这里给出网址 ...

  2. 移动APP 中文输入法下的搜索优化

    最近做了一个移动端的搜索功能,带有suggest.实现上并没有什么可说的,但是在后续优化上,特别是在中文输入法的情况下的优化使我学到一些新东西,所以决定写一篇文章. 下面是我简化后的基本功能实现,监听 ...

  3. input事件以及中文输入法的处理

    在项目的开发过程中,相信大家都处理过监听用户输入的事情,一般我们会用到onkeyup.onkeydown.onkeypress.onchange.oninput事件,虽然都很熟悉了,但是还是有必要巩固 ...

  4. wp中TextBox在中文输入法下清空问题

    如图,在中文输入法下我希望点击“X”,然后把TextBox清空,一般来说,直接用TextBox.Text = "";或者TextBox.Text = String.Empty;就可 ...

  5. 树莓派3B/3B+ 清华镜像系统和安装中文输入法Fcitx及Google拼音输入法

    你还在为树莓派无法安装中文输入法而到处找教程吗? 你还在为树莓派每次下载都要远隔重洋获取资源,龟速下载而烦恼吗? 为了解决这个问题,在这篇树莓派教程中,我将手把手叫你怎样安装 清华镜像系统和中文输入法 ...

  6. compositionEnd 和 input 事件(中文输入法问题)

    网上用 compositionstart + compositionend + input 解决中文输入法问题的办法 node.addEventListener('compositionstart', ...

  7. 配置 .vimrc 解决 Vim / gVim 在中文 Windows 下的字符编码问题

    转载自:-杨博的日志 - 网易博客 Vim / gVim 在中文 Windows 下的字符编码有两个问题: 默认没有编码检测功能 如果一个文件本身采用的字符集比 GBK 大(如 UTF-8.UTF-1 ...

  8. input中用中文输入法下的全角·替换英文输入法下的句号.

    核心语句 <input type="text" onkeyup="this.value=this.value.replace(/\./g, '·')" o ...

  9. html5手机网页开发,中文输入法下软键盘遮挡输入框

    安卓手机解决办法 微信UI框架weui中给出了解决方法:weui框架http://weui.github.io/weui/example.js // .container 设置了 overflow 属 ...

随机推荐

  1. Jarque-Bera test|pp图|K-S检验|

    Jarque-Bera test: 如何绘制pp图?   找该直线的截距和斜率,通过截距和斜率的值找到正态参数均值和方差,可对这些正态参数进行正态检验. K-S检验的的特点? 并不是只针对正态分布,是 ...

  2. 02-信贷路由项目rose框架拆分dubbo

    项目架构和 rose 框架搭建见  https://www.cnblogs.com/yuanpeng-java/p/9835984.html 1.dubbo 框架架构及组成 2.注册中心安装及配置 h ...

  3. 让Spring不再难懂-ioc篇

    写过java的都知道:所有的对象都必须创建:或者说:使用对象之前必须先创建.而使用ioc之后,你就可以不再手动创建对象,而是从ioc容器中直接获取对象. 就好像我们无需考虑对象的销毁回收一样,因为ja ...

  4. Windows可以往外ping,外部却ping不通本机

    网络背景:192.168.1.17.192.168.1.19.192.168.1.20 三台机器都在一个exsi宿主机下网络非常简单 问题描述:17和19都可以ping通20:20却不能ping通17 ...

  5. 【ubuntu】乱七八糟

    https://blog.csdn.net/totorocyx/article/details/80032556 https://blog.csdn.net/weixin_40662331/artic ...

  6. python关于文件操作

    今日所得 文件操作模式的补充 文件光标的移动控制 截断文件 修改文件 函数的简单介绍 文件操作模式的补充 """ r w a 将上面的三个模式称为纯净模式 r+ w+ a ...

  7. Logarithmic transformation|Data transfer|MASS|Box-Cox

    数据转换(Data transfer) 方差分析的前提是方差齐性,可以使用transfer改变方差使得方差变齐.不正态和outlier. Logarithmic transformation使方差聚合 ...

  8. cs231n spring 2017 lecture14 Reinforcement Learning

    (没太听明白,下次重新听) 1. 增强学习 有一个 Agent 和 Environment 交互.在 t 时刻,Agent 获知状态是 st,做出动作是 at:Environment 一方面给出 Re ...

  9. [LC] 81. Search in Rotated Sorted Array II

    Suppose an array sorted in ascending order is rotated at some pivot unknown to you beforehand. (i.e. ...

  10. CF-1111C-Creative Snap

    前两天过年,所以两天前的比赛题目现在才来回顾. 这题是一个最平常的递归,加一个剪枝.题目说如果一段距离没有复仇者看守,消耗的能量为A,A一定是正整数.由此可知对于没有复仇者看守的段,不拆一定比拆成两半 ...