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

来源:互联网 发布:淘宝冷门类目 编辑:程序博客网 时间:2024/05/18 03:28

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

compositionstart & compositionend

MDN 上找到了关于他们的描述,compositionstart 和 compositionend。简单点描述如下:
- compositionstart:在输入中文或者语音等需要等待一连串的输入的操作之前,compositionstart 事件会触发。
- compositionend:在输入中文或者语音等完毕或取消时,compositionend 事件会触发。

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

和大多数人的想法一样,我考虑使用一个布尔值来判断是否在等待输入法的输入,然后在 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);

写在最后

原文发布在 github 上,如果大家有什么好的解决方案欢迎在下面提出。最后,欢迎 star 我的项目。

阅读全文
'); })();
0 0
原创粉丝点击
热门IT博客
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 森林里看到熊怎么办 日本乘坐新干线行李怎么办 cad2014一直安装失败怎么办 哺乳期发烧38度怎么办 cad文字现实问号怎么办 有人做法害自己怎么办 不显示常去地点怎么办 计算机一级没过怎么办 电脑界面变小了怎么办 模拟城市的污水怎么办 想离职又犹豫怎么办 老人死了银行钱怎么办 总包资质不行怎么办 新桑塔纳噪音大怎么办 剑魂不能三连流怎么办 孩子做错了事情怎么办 我该怎么办教学反思 陌陌申诉失败怎么办 包工包料税率怎么办 工程不想干了怎么办 武汉买了烂尾楼怎么办 iphone7换屏指纹怎么办 私人老板怎么办离职证明 图片文字不清晰怎么办 中审判决不服怎么办 汽车没有缸压怎么办 工作宿舍环境差怎么办 全国卷1作文高分怎么办 羽绒服机洗后羽绒成块怎么办 墙纸颜色太深怎么办 壁纸颜色深压抑怎么办 卧室颜色深了怎么办 磁砖太滑怎么办 厨房 油箱加满了油怎么办 买的房烂尾了怎么办 住进新房喉咙不舒服怎么办 懒人火锅不热怎么办 侄子有生理要求怎么办 丈夫死后妻子怎么办 缺陷精子率98怎么办 狗狗攻击性强怎么办