使用中文输入法时对键盘事件的处理

中文输入法中光标跟随能力触发的浏览器事件探究 一套操作下来,这套中文输入法下光标跟随的功能算是完美实现了。回顾一下我们解决这个问题所趟过的坑,实际上也反映着浏览器 JS DOM 标准在不断进化,不断补足历史遗留的坑点。当然,它还远远称不上完美,仍然存在大量的能力缺失,如我们在这个问题中遇到的判断光标偏移量的解决方案,本质上还是一种 hack。而扩展 JS 的能力边界,使其变得更强大,更好用,这正是我们作为前端开发人员需要努力的方向。 阅读详情

最近很久没有更新博客了,不是没有东西写,而是没有时间写。公司项目上事情比较多,又在工会谋了份差事;家里房子装修,尽管有老爸盯着,但很多时候还是要自己跑来跑去。所以有时候有了写博客的想法,却老是坐不下来细细写。这些就算为自己这段时间的荒废找个小小的借口吧。

其实最主要的问题还是在于自己对博客的定位。之前一直想每篇博客都尽量找到一些比较好的主题,写的比较详细,这样看起来比较专业。但是这样要求的话,每一篇就要花狠多时间准备,很多时间编写,无形中也给自己带来了很多压力。这也是久久没有动笔的一个主要原因。后来在看很多牛人的博客的时候,发现他们也经常放一些小的但是很有用的东西在博客上。都是平时开发的时候遇到的小问题和解决的过程。这样的记录其实并不需要花太多的时间,而且能够巩固自己对知识点的掌握,也便于以后再次查阅。于是我觉得这样的方式挺好的,尤其是比较忙的时候,这样短小精炼的博客,同样能够给自己带来不少的长进,也能促进自己勤写博客的习惯养成。

闲话就讲到这里,接下来就进入今天的主题:使用中文输入法时,对键盘事件的处理。

问题的起源是这样的:组里有个同事发现现有项目上的一个自动补全的输入框不响应中文输入。英文输入的时候,超过两个字就开始向后台查询复合条件的选项。但中文输入的时候,在输入法上不管输入多少字,输入框没有任何反应,按了空格或者回车后,字进入了输入框,依然没有能够出发补全的功能。 于是这个问题就到了”前端专家“我的手里。

如何入手呢,一开始当然是看现象。 发现中文输入的时候,打出来的字都是在输入法的框里,于是猜想键盘事件都被输入法给截获了。但让我不解的是,为什么当字被输入到输入框里,还是没有反映。我第一反映是到google看输入框。于是分别打开chrome,firefox,ie看现象。

首先是Chrome,表现是最完美的,在输入框中输入中文的时候,输入的拼音在中文被输入之前填写在输入框里,匹配的内容应该是根据输入框里的英文字母进行匹配,所以令人很满意。

其次到了firefox,从下图中我们可以看到。当打开中文输入法打字的时候,并没有任何文字被输入到输入框中,所以也就没有任何匹配项出现。之后当按了回车或者空格,将文字输入到输入框中之后,才会有响应的匹配项显示。

再来看一下IE,结果和firefox一样,输入法打开的时候,也没有内容被捕获和匹配。

看完这三个浏览器的现象,大概证实了自己的猜想,输入框捕获了一些键盘事件,从而导致浏览器无法获取用户输入进行匹配。但当内容被填入输入框的时候,匹配被触发。 接下来一个很自然的想法,是不是onchange事件出发了匹配函数。于是自己开始动手试验:

写了一个最简单的例子,input box分别绑定onchange,onkeydown,onkeyup,onkeypress事件,查看事件被出发的情况:

复制代码
 1 <html>
 2 <head>
 3     <script type="text/javascript">
 4         function onChange(e){
 5             console.log("onchange!");
 6         }
 7         function onKeyDown(e){
 8             console.log("onkeydown");
 9         }
10         function onKeyUp(e){
11             console.log("onkeyup");
12         }
13         function onKeyPress(e){
14             console.log("onkeypress");
15         }
16     </script>
17 
18 </head>
19 
20 <body>
21     <input type="text" onchange="onChange()" onkeydown="onKeyDown()" onkeyup="onKeyUp()" onkeypress="onKeyPress()"/>
22 </body>
23 </html>
复制代码

然后开始用各个浏览器进行测试:首先是英文输入状态下

 普通按键 abcalt.shift,ctrlESCBackspaceEnter 
Chromeonkeydown,
onkeypress,
onkeyup
onkeydown,
onkeyup
onkeydown,
onkeyup
onkeydown,
onkeyup

onkeydown,
onkeypress,(当value发生变化的时候)
onchange,
onkeyup

 
Firefoxonkeydown,
onkeypress,
onkeyup
onkeydown,
onkeyup
onkeydown,
onkeypress,
onkeyup
onkeydown,
onkeypress,
onkeyup
onkeydown,
onkeypress,(当value发生变化的时候)
onchange,
onkeyup
 
IE10onkeydown,
onkeypress,
onkeyup
onkeydown,
onkeyup
onkeydown,
onkeypress,
onkeyup
onkeydown,
onkeyup
onkeydown,
onkeypress,
onkeyup
 

从上面的表格中可以看出,不同的浏览器对不同的按键触发的事件还是有所差别的。尤其是IE,按回车的时候不会出发onchange事件。

此外所有的浏览器,在onblur的时候,如果input的value发生了变化,都会触发onchange事件。但是在输入的过程中,onchange事件并不回被触发,于是否定了我自己的对于onchange事件触发查询的猜想。

接下来是在使用中文输入法的时候触发的事件列表

 普通输入abc空格,填入内容 
Chrome每次按键
onkeydown,
onkeyup
onkeydown,
onkeyup
 
Firefox只在第一次按键时触发
onkeydown
onkeyup 
IE10每次按键
onkeydown,
onkeyup
onkeydown,
onkeyup
 
    

从上面的表中可以看出,如果想在用户输入过程中,通过onkeydown或者onkeyup事件来捕获用户的输入,并且触发匹配调用是不太可行的,尤其是在firefox上,用户的键盘事件根本没有办法立刻获取。所以我们也就可以理解,为什么google的搜索框,在firefox中,也只能等待中文内容被天津输入框之后才能进行匹配搜索。

但是对于IE,依然能够获得keydown和keyup事件,那就够获得keycode,自然研究能够知道用户按了什么键,通过用户按键进行匹配应该也是可以做到的。为什么ie上对中文输入的反映与firefox是一样的呢。

继续搜索才发现,原来在中文输入框的情况下,键盘事件并不能传递真实的用户按键keycode。于是对代码进行修改,加入了keycode和charcode的输出:这里还遇到了firefox和ie对event参数的兼容性问题,前台开发真是不易啊。

复制代码
 1 <html>
 2 <head>
 3     <script type="text/javascript">
 4         function onChange(){
 5             console.log("onchange!");
 6         }
 7         function onKeyDown(e){
 8             e = e || window.event;
 9             console.log("onkeydown" + " keyCode:"+e.keyCode+" charCode:"+e.charCode);
10         }
11         function onKeyUp(e){
12             e = e || window.vent;
13             console.log("onkeyup" + " keyCode:"+e.keyCode+" charCode:"+e.charCode);
14         }
15         function onKeyPress(e){
16             e = e || window.event;
17             console.log("onkeypress" +" keyCode:"+e.keyCode+" charCode:"+e.charCode);
18         }
19     </script>
20 
21 </head>
22 
23 <body>
24     <input type="text" onchange="onChange()" onkeydown="onKeyDown(event)" onkeyup="onKeyUp(event)" onkeypress="onKeyPress(event)"/>
25 </body>
26 </html>
复制代码

各个浏览器的测试结果如下:

 aESC中文输入法a中文输入法接着按b空格,填入中文内容  
Chrome
onkeydown keyCode:65 charCode:0
onkeypress keyCode:97 charCode:97
onkeyup keyCode:65 charCode:0
onkeydown keyCode:27 charCode:0
onkeyup keyCode:27 charCode:0
onkeydown keyCode:229 charCode:0
onkeyup keyCode:65 charCode:0
onkeydown keyCode:229 charCode:0
onkeyup keyCode:66 charCode:0
onkeydown keyCode:229 charCode:0
onkeyup keyCode:32 charCode:0
  
Firefox
onkeydown keyCode:65 charCode:0
onkeypress keyCode:0 charCode:97
onkeyup keyCode:65 charCode:0
onkeydown keyCode:27 charCode:0
onkeypress keyCode:27 charCode:0
onkeyup keyCode:27 charCode:0
onkeydown keyCode:0 charCode:0没有事件onkeyup keyCode:32 charCode:0  
IE10onkeydown keyCode:65 charCode:0  
onkeypress keyCode:97 charCode:97  
onkeyup keyCode:65 charCode:0 

onkeydown keyCode:27 charCode:0 
onkeypress keyCode:27 charCode:27 
onkeyup keyCode:27 charCode:0

onkeydown keyCode:229 charCode:0 
onkeyup keyCode:65 charCode:0

onkeydown keyCode:229 charCode:0 
onkeyup keyCode:66 charCode:0

onkeydown keyCode:229 charCode:0 
onkeyup keyCode:32 charCode:0

  

 这里有人可能会对keyCode和charCode产生好奇。我也是写这篇博客的时候才了解到这个知识点:keyCode表示按下键的数字代码,也叫键码,charcode表示按键的Unicode,也叫字符编码。这里有一篇文章介绍都比较详细,大家可以具体去看一下:http://blog.sina.com.cn/s/blog_65c2ec5e0101blj6.html

 本文的重点是中文输入,大家可以看到,在chrome和ie中,使用中文输入法输入的时候,所有的keydown事件,keycode都是229,keyup事件的keycode表示正确。因此通过对keyup事件的捕获,应该能获取用户的按键情况。但是对于Firefox,只能等到用户按空格或回车将输入的内容填入框中,才能捕获keyup事件。然后通过输入的内容来进行匹配查询。

所以这个中文输入法自动匹配问题的最终解决方案也比较明显了:捕获keyup事件,然后通过输入框里的内容进行匹配查询。

查看原有的code,果然只对keydown和keypress(针对opera)事件进行了捕获,而没有用到keyup,所以修改的内容就是将keydown事件改为keyup事件。

 

一个小小的中文输入问题需要这么多的搜索和调试才能完美解决,而且这里只对chrome,firefox,ie做了支持,如果需要加上opera,safari,需要的工作可能更多。但相信这些问题碰到一个少一个,记录下来也希望能为别人带来一些便利。同时也盼望着将来各浏览器厂商之间规范的统一和相互兼容,让前端工程师能有更加顺畅的开发过程。

中文输入法不触发onkeyup事件的解决办法 主要介绍了中文输入法不触发onkeyup事件的解决办法,需要的朋友可以参考下 立即下载

相关推荐

Qwen3-VL、Qwen3-Next与Qwen3.5多模态架构深度解剖

多模态大模型的核心不在参数规模,而在于视觉与文本如何协同建模。本文从基础概念切入,解析视觉语言模型中视觉编码器、跨模态注意力、特征对齐与token压缩等关键原理;阐述ViT、CLIP-ViT及动态压缩模块(HDTC)在语义表征、空间感知与计算效率上的技术权衡;强调结构设计如何决定模型在医学影像、工业质检、遥感分析等高要求场景中的真实能力边界;最终聚焦通义千问最新三套VL架构——Qwen3-VL、Qwen3-Next与Qwen3.5——揭示其背后迥异的融合哲学与工程取舍,为选型、微调与推理优化提供底层依据。

weixin_33778544的博客 818

[转]使用中文输入法时对键盘事件的处理

本文转自:http://www.cnblogs.com/owenChen/p/3215421.html 最近很久没有更新博客了,不是没有东西写,而是没有时间写。公司项目上事情比较多,又在工会谋了份差事;家里房子装修,尽管有老爸盯着,但很多时候还是要自己跑来跑去。所以有时候有了写博客的想法,却老是坐不下来细细写。这些就算为自己这段时间的荒废找个小小的借口吧。 其实最主要的问题还是在于自己对博客的...

weixin_34293059的博客 494

Matlab图像处理频域滤波实现——高斯低通、高通、带通带阻滤波器

如果你想要进一步了解更多的相关知识,

小嘤熊的博客 1万+

suggestion开发小结以及 对键盘事件的总结(针对中文输入法状态)

重要的键盘事件: 事件顺序:keydown -> keypress ->keyup 对于输入法开启时: keypress: 这三个事件中最最特别的事件的说,如果巧妙运用可以事半功倍: 1. 首先对于大部分功能键是没有keypress事件的 Caps lock,shift,alt,ctrl,num lock、、、庆幸的是enter拥有此...

weixin_30621711的博客 250

基于Unidbg的小红书加密协议动态分析与算法还原实战

在移动应用安全领域,加密协议与签名机制是保障数据传输安全、实现客户端身份验证的核心技术。其原理通常涉及哈希算法、对称/非对称加密以及自定义的混淆逻辑,旨在防止请求被篡改或重放。理解这些协议对于安全研究、风控策略制定及合规的数据交互分析具有重要价值。在实际的工程实践中,面对高度混淆和加固的Native代码(SO库),传统的静态分析往往难以深入。此时,沙盒模拟执行技术提供了一种动态、可控的分析方案。通过搭建一个虚拟的移动应用运行环境,研究人员可以在无需真机、规避反调试机制的情况下,完整地追踪和观察加密算法的执行

weixin_29315091的博客 327

【零基础教程】HEC-RAS 1D/2D全流程模拟指南|从水动力到水质建模一次搞定!

HEC-RAS由美国陆军工程兵团水文研究中心研制,具有完整的一二维耦合的水动力及水环境模拟功能,也具有闸、涵洞、桥梁以及泵站等水利构筑物的模拟能力;同时也可以与HEC研制的水文模型(HMS)、洪水淹没风险和损失分析软件(FDA)等耦合,是免费软件中使用最方便、应用最广泛的软件之一。2.HEC-RAS与HEC-HMS的耦合(不详细讲HEC-HMS)3.淹没风险分析软件HEC-FDA与HEC-RAS耦合。案例十八:HEC-RAS与HEC-HMS的耦合。案例十九:HEC-RAS与HEC-FDA的耦合。

weixin_48230888的博客 873

Win32 键盘事件 - 击键消息、字符消息、插入符号(光标)

注:以下内容为学习笔记,多数是从书本、资料中得来,只为加深印象,及日后参考。然而本人表达能力较差,写的不好。因非翻译、非转载,只好选原创,但多数乃摘抄,实为惭愧。但若能帮助一二访客,幸甚! 以下内容主要来自《Windows 程序设计》 1.焦点 程序用于从消息队列中读取消息的MSG结构中包含一个hwnd字段。此字段指出了接收消息的窗口句柄。消息循环中的DispatchMessag

孤舟钓客 1万+

Kali Linux实战:用Impacket的secretsdump.py快速提取Windows域控哈希(附避坑指南)

本文详细介绍了如何在Kali Linux中使用Impacket的secretsdump.py脚本快速提取Windows域控哈希,包括环境准备、原理剖析、实战操作及常见问题解决方案。特别适合CTF竞赛和网络信息安全爱好者学习,提升渗透测试效率。

weixin_33670786的博客 410

bug记录:使用微软输入法输入中文输入框出现多余字符

问题描述: 当我在页面输入【sdf】时: 出现原因: input输入框内限制事件使用的是:onkeyup 改为:onkeypress 即可

JiAyInNnNnN123的博客 1287

人工智能之数学基础:弄懂数学本质,让我们不再害怕数学

数学的用途远远超过了人们的想象,甚至无处不在,任何领域都需要用到数学知识,人工智能也不例外。我将尽可能地将数学知识和机器学习算法相结合,让大家知道这些数学知识咋人工智能领域中的应用,使得数学的学习不会过于枯燥,同时也帮助大家扫清在学习算法过程中的数学障碍。除此之外,我还希望帮助大家建立一种不一样的数学思维,不再将数学看成是符号的演算、公式的推导,而是将数学看成是一种描述这个世界的工具,这样你就会发现这个世界处处有数学。当我们面对问题的时候,你是否会对问题进行抽象,然后通过数学来解决问题?

huanfeng_AI的博客 634

振动分析-46-设备振动监测和故障诊断能力提升需要理解和掌握的知识体系

提升振动分析能力对于确保机械设备的高效运行和预防故障至关重要。

qq_20466211的博客 665

Qt / Qml 中捕获(中文)输入法事件(按下 & 提交)

最近工作中遇到一个奇怪的问题:本来想在TextEdit(QTextEdit) 中捕获一下键盘按键按下的事件。然而,当输入法为英文时( 正常输入字符 ),可以捕获到按键事件,但当我切换到中文时,弹出输入法选框后,却无法再像英文那样捕获到事件。

梦起丶的博客 4085

Android 系统低内存lowmemorykiller关于阈值修改 minfreeAbsKbytes优化

在系统rom定制化开发中,在对于运行内存ram 1G和2G的设备中,对于内存使用高峰期时,minfreeAbsKbytes优化很关键 调整合理的minfree,让内存合理的使用很关键,接下来分析相关功能的实现

安卓兼职framework和app工程师的博客 524

JS的中文输入法下KeyDown()的keyCode值总为229

$(document).keydown(function (e) { var currKey = 0, CapsLock = 0, e = e || event; theKey = e.keyCode || e.which || e.charC...

chuanjiang9220的博客 1481

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

jQuery - 中文輸入法與KeyDown/KeyPress事件

最近專案中引用了Telerik ASP.NET擴充元件AutoComplete輸入欄位,測試時發現偶爾會不聽始喚,輸入文字時無法觸發資料查詢,在Javascript Source Code裡反覆追蹤測試,燃燒了可觀的寶貴春青,終於理出頭緒: 問題在中文輸入法! 過去模糊地知道中文輸入在瀏覽器的鍵盤事件行為上有些特殊,但從未深究,這回算是比較清楚研究其中的差別。其實最明顯的差異是: 切到中文輸入法...

weixin_30950237的博客 335

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

输入法下keyup失效的解决方案

来源:Realazy 作者:Realazy 在某些情况下,比如自动补全(auto complete)的输入框中,需要使用keyup事件来监听键盘的输入以迅速作出回应。 关键在于keyup, 如果世界是美好的,那么就不会有这篇blog. 可是…… 世界是不美好的。我们活在中文世界,我们要用输入法。在输入法开启的情况下,您会碰到不美好的事情:keyup失效。对于您绑定到keyup的任...

人生五十年 2199

js 中 实现扫码枪在中文输入法下扫码与实际差异的问题(大小写字母和数字的已没问题特殊字符还不知道咋处理所以没实现特殊字符)

在网上找了各种方法针对与扫码枪在中文输入法的情况下键入值异常(与实际不一致的问题)有说用type=password的来模拟text框 用定位来覆盖(这种没啥用,看需要吧,因为搞完后没输入法 如果从中间去手动改这个值 定位不准确等)后来又看到一种比较靠谱的 就是监听按键速度来区分是人工还是扫码枪 这个可以识别到输入类型 但是 获取的值还是有问题(可能我打开方式不对 因为录入和监听是同步进行的 也就是说 至少录入两位才能监听到 这时候再去改输入框 type 其实录入的操作已经同步做完了 所以...

createWrite的博客 4029

javascript中关于onkeydown的值总是返回229问题

参看:https://www.xuebuyuan.com/994208.html 现象:键盘按下的时候一点反应都没有,后来发现无论你按下什么按键(字母按键),它的event.keyCode都返回229。 原因:用onkeydown的时候是中文输入法(或没有切到字母输入状态) 解决:用onkeyup代替onkeydown接管键盘输入 ...

xiaoxiaoyusheng2012的专栏 897

中文输入法与上下左右键盘事件冲突问题解决

因为我们在做一些键盘处理时,可能会用到上下左右按键进行其他处理。比如表单输入框的跳转,这时候就会出现一个bug。如果我是正常使用中文输入法在打字,正常情况按上下左右键是可以进行选字操作的。因为我这里键盘事件的缘故,按键会导致跳到下一个输入框了,无法正常选字。

weixin_42190844的博客 1425

中文输入法输入事件composition的使用

中文输入法输入事件composition的使用 最近遇到一个问题:如果一个 INPUT 中,用户使用中文输入法,那么原生的键盘事件就会发生变化,无法获取正确的 keycode 及对应的输入内容。从前端的能力,只能操作浏览器相关的 API,不能获取中文输入法的内置 API。查阅资料后,可以使用 composition 事件来监听相关的时间。 不同中文输入法的情况可能大同小异(例如搜狗输入法,中文输入时,keycode 就是225,这样无法检测到点击的键) composition 事件组合分成三个事件:comp

MichaelAn的博客 3405

Unity WebGL输入法终极配置指南:5分钟实现完美中文输入

你是否在Unity WebGL项目中遇到过**中文输入法**无法正常工作的困扰?想要在浏览器中实现流畅的中文输入体验吗?WebGLInput项目正是为解决这一痛点而生的终极解决方案!🚀 ## 什么是WebGLInput? **WebGLInput**是一个专门为Unity WebGL平台设计的输入法支持插件,它完美解决了传统WebGL应用中输入框无法与浏览器输入法正常交互的问题。无论你是开发

gitblog_00566的博客 1171

Python游戏开发避坑:解决俄罗斯方块键盘事件与中文输入法冲突

在游戏开发中,键盘事件处理是用户交互的核心基础。其原理在于操作系统将物理按键转换为事件信号,并通过事件队列传递给应用程序。正确处理这些事件对于实现流畅、响应迅速的游戏操控至关重要,直接决定了游戏的用户体验和可玩性。在Python的Pygame等框架中,开发者常使用`pygame.event.get()`或`pygame.key.get_pressed()`来捕获和处理按键。然而,在实际工程实践中,尤其是在中文环境下,一个隐蔽的“杀手”——中文输入法(IME)——会拦截并转换系统级键盘事件,导致游戏无法接收到

weixin_29288313的博客 276

Ubuntu20.04安装中文百度输入法

在Ubuntu中安装搜狗输入法等基于fcitx的输入法前,可能需要重新安装fcitx源,因为Ubuntu自带的fcitx版本可能与某些输入法不兼容。它允许应用程序不必具体考虑在不同语言环境下的输入问题,系统会根据相应的locale自动寻找合适的输入法。它支持多种输入法,包括拼音(全拼、简拼、双拼)以及基于码表的输入法(如五笔、郑码等)。XIM是一个较老的输入法协议,与现代的输入法框架相比,可能在功能和兼容性方面有所欠缺。fcitx为许多流行的中文输入法(如搜狗输入法)提供了桌面图形环境支持。

Moresweet 猫甜 4653

在输入法为中文时,打出英文需要回车添加到textarea上,如何阻止在输入法唤起时回车 导致消息发送出去?

需要明确 keyCode=13 和 keyCode=229 的区别?因此,keyCode 13 是标准回车键的键码值,而 keyCode 229 可能表示当前正在输入法处理的字符。在处理键盘事件时,需要根据具体情况对这两个键码进行区分和处理。

Xpy 的博客 582

记录--被中文输入法坑死了

这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 PM:在PC端做一个@功能吧,就是那种...。 我:你不用解释????我知道那个功能,监听keydown事件,然后e.keycode === 50,那可太简单了。 那可太简单了,可太简单了,太简单了,简单了,单了,了......(掉进坑里的回声) 坑1:KeyBoardEvent.keycode 废弃的属性你就坚持用吧,一用一个不...

林恒的博客 889
上一篇: JS通过正则限制 input 输入框只能输入整数、小数(金额或者现金) 两位小数
下一篇: html javaScript 只能输入数字
ole_triangle_java
博客等级 码龄10年 82粉丝 83原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值