在做搜索等功能时,很多时候我们需要实时获取用户输入的值,而常常会得到类似 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. poj-3665 iCow(暴力吧)

    http://poj.org/problem?id=3665 题目描述 Fatigued by the endless toils of farming, Farmer John has decide ...

  2. 吴裕雄--天生自然C语言开发:循环

    while(condition) { statement(s); } #include <stdio.h> int main () { /* 局部变量定义 */ ; /* while 循环 ...

  3. 基于 maven 的ssm 框架搭建

    1.新建一个 maven 工程, war 包 2.引入 pom 文件(springmvc+spring+mybatis) 3.引入配置文件 4.引入页面,编写 contorller 层测试 5.编写查 ...

  4. 手撸GBDT原理(未完成)

    一直对GBDT里面的具体计算逻辑不太清楚,在网上发现了一篇好博客. 先上总结的关系图 GBDT对类别变量是怎么处理的? 这些东西都是在网上发现的,讲的挺好的. GBDT原理与Sklearn源码分析-回 ...

  5. derby数据库

    derby数据库 https://www.cnblogs.com/zuzZ/p/8107915.html Derby数据库的使用 https://www.cnblogs.com/wkfvawl/p/1 ...

  6. django框架进阶-中间件-长期维护

    ##################    为什么使用中间件?      ####################### 先说几个需求, 1,url的白名单,url=[ "XX"] ...

  7. python语法基础-基础-变量和数据类型

    ###############   第一个python程序   ############### print("hello python") # 打印hello python # 分 ...

  8. django框架基础-视图系统-长期维护

    ##################   什么是视图?     ####################### 视图: 1,一个视图函数(类),简称视图,是一个简单的Python 函数(类),它接受W ...

  9. HDU1166 敌兵布阵 [线段树模板]

    题意:在序列中修改单点和查询区间和 #include<iostream> #include<cstdio> #include<cstring> #define ls ...

  10. the Uneducated are|anymore|that| so as to |die from|die of|

    定冠词加上某些形容词可以泛指一类人,谓语动词一般用复数形式,the uneducated泛指未受过教育的人, the Uneducated are more to be pitied than bla ...