在做搜索等功能时,很多时候我们需要实时获取用户输入的值,而常常会得到类似 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. ipv6 mac地址转化为linklocal地址

    mac  3c:32:66:67:dd:46 linklocal地址 前六位固定  fe80:: 第七位  mac地址第一个byte进行如下计算 (byte) ((byte) (macbyte &am ...

  2. 在VMware装了linux系统,如何在windows系统中用xshell连接

    网上有好几种方法,不过我觉得这种比较简单 1.找到VMware菜单  打开 编辑>虚拟网络编辑器 如图: 点下面的更改设置 点确定就可以了,什么都不用改.然后回到linux系统中ifconfig ...

  3. 使用 Wintersmith + Serverless Framework 快速创建个人站点

    首先我们来介绍下,Wintersmith 是一个简单而灵活的静态站点生成器.采用 markdown 构建,这个是我们的基础条件. Serverless Framework:在 GitHub 上有三万颗 ...

  4. PAT甲级——1061 Dating

    1061 Dating Sherlock Holmes received a note with some strange strings: Let's date! 3485djDkxh4hhGE 2 ...

  5. Nesterov方法的python实现

    牛顿动量法,相比于上一篇Momentum,不一样的地方是应用了临时更新 这里用python对其进行简单实现,如下: # coding=utf-8 """ 基于小批量梯度下 ...

  6. 西甲官方APP承认监听球迷,或给国内应用带来新思路

    在此前,一般巨头或者官方推出的产品.应用等总是值得信赖的.出问题的话一般都是"不可抗拒的外力因素",比如被黑客攻破导致用户隐私被窃取等.但自从Facebook的用户隐私泄露丑闻被曝 ...

  7. Factual question|具体特殊

    Factual question:答案一定出于文章,不是总结 流程:找定位词做连连看,找对定位词,先看此句,然后看选项回文对照.如果找不到找上下两句话. 为了缩小范围,定位词是具体特殊,不要抽象词,可 ...

  8. kafka + spark Streaming + Tranquility Server发送数据到druid

    花了很长时间尝试druid官网上说的Tranquility嵌入代码进行实时发送数据到druid,结果失败了,各种各样的原因造成了失败,现在还没有找到原因,在IDEA中可以跑起,放到线上就死活不行,有成 ...

  9. cs231n spring 2017 lecture3 Loss Functions and Optimization

    1. Loss function是用来量化评估当前预测的好坏,loss function越小表明预测越好. 几种典型的loss function: 1)Multiclass SVM loss:一般的S ...

  10. java中Redis5大基本类型的用法

    存储格式 基本用法 通过Jedis(封装了redis的Java客户端)对redis进行操作. Jedis工具类 public class JedisPoolUtil { private static ...