`
yushine
  • 浏览: 200477 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

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

阅读更多

【转】http://realazy.org/blog/2007/10/31/solution-of-keyup-failing-when-ime-is-on/

在某些情况下,比如自动补全(auto complete)的输入框中,需要使用keyup事件来监听键盘的输入以迅速作出回应。

关键在于keyup, 如果世界是美好的,那么就不会有这篇blog. 可是……

世界是不美好的。我们活在中文世界,我们要用输入法。在输入法开启的情况下,您会碰到不美好的事情:keyup失效。对于您绑定到keyup的任何回调函数,除非您把输入法切换回英文状态,否则它会无动于衷。如果能称之为bug,我会很高兴,因为bug会有修复的可能,如果是特征(feature),那么,我只好叹息一下。
问题

在开启输入法的情况下,三个浏览器的具体问题如下:
IE:触发keydown和keyup, 不触发keypress. 能够获得输入值。
Firefox:触发keydown和keypress, 不触发keyup. 输入值未能获得。在回车后会触发keyup, 可获得输入值。
Opera:keydown, keypress和keyup都不触发,输入值也未能获。

(如果您能帮我试用一下Safari,我会很高兴并谢谢您。这里有一个测试页面:http://tonextone.com/test/eventTest.html)
解决方案

总结出以上问题,没有兴奋反而陷入绝望,因为没有google出解决方案(是的,对于拉丁语系的老外来说,不会存在输入法)。但是,wait, 谷歌搜索的自动补全不是工作得好好的吗?于是研究一下这个 http://www.google.cn/ac.js。嘿嘿,虽然混淆得还可以,但还是可以发现蛛丝马脚的。它使用一个计时器,当输入框处于聚焦(focus)状态时,每 10 毫秒执行一次回调函数。

虽然挺耗资源(所以建议在输入框失焦(blur)时,一定要清除这个计时器),但也只能如此了。作前端开发的,不仅要与语言(JavaScript, CSS, HTML) 斗,还要与浏览器斗,其乐无穷也。

更新:IE 有一个 onpropertychange 事件处理器可以随时检测变化,对应之,Firefox 和 Opera 有一个 oninput 事件处理器也可以达到目的。遗憾的是,在输入法开启的情况下,Opera对于 oninput 也没法随时监听(表现在:输入英文字母可以监听到,而中文则失效)。如果不考虑 Opera, IE使用 onpropertychange 而 Firefox 使用 oninput, 也可解决我们上述问题。

另外需要注意的是, oninput 比较诡异,您可以<input oninput="jsFunc()" ... />来绑定,也可以用addEventListener来绑定,就是不能使用 DOM 0 的element.oninput = function(){} 的形式来绑定,否则不生效。

未曾测试Safari, 有心者可自行测试之。

分享到:
评论

相关推荐

    中文输入法以及浏览器兼容的问题1

    为解决这一问题,开发者需要在compositionend事件处理程序中添加条件判断,针对特定的用户代理(即搜狗和百度浏览器),在这些浏览器下不执行发送文本内容的操作,以确保其他输入法的正常输入。 总的来说,处理中文...

    易语言_api切换输入法_英文.zip

    在处理用户交互时,输入法的切换是一个常见的需求,特别是在需要确保用户输入英文字符的场景下。本资料包“易语言_api切换输入法_英文.zip”提供了实现这一功能的方法。 API,全称为应用程序接口,是操作系统提供给...

    76在VB中切换中文输入法

    在VB(Visual Basic)编程环境中,切换中文输入法是一项常见的需求,特别是在开发具有用户交互界面的应用程序时。本文将深入探讨如何在VB中实现这一功能,以满足中文输入的需求。 首先,我们需要理解VB中的基本输入...

    jquery 强制设置文本框处于英文输入法状态

    解决这个问题的一种方法是利用jQuery监听键盘事件,并在用户开始输入前切换输入法模式。jQuery提供了丰富的事件处理函数,如`.keydown()`, `.keyup()`, 和 `.keypress()`,可以用于监听用户的键盘操作。结合...

    输入法的回车与消息发送快捷键回车的冲突解决方法

    keydown事件发生在按键被按下的时候,接着触发keypress,松开按键的时候触发keyup事件 中文输入法: firfox:输入触发keydown,回车确认输入触发keyup chrome:输入触发keydown、keyup,回车确认输入只触发keydown ...

    JavaScript开发的拼音输入法

    JavaScript开发的拼音输入法是一种基于Web的输入解决方案,它利用JavaScript这门客户端脚本语言的强大功能,为用户提供方便快捷的中文输入体验。在浏览器环境中,JavaScript可以与用户进行实时交互,使得拼音输入法...

    中文输入法不触发onkeyup事件的解决办法

    在英文输入法下,`onkeyup`事件通常是一个有效的选择,它会在用户释放键盘按键时触发。然而,当用户切换到中文输入法时,`onkeyup`事件不再正常工作,导致实时监控文本框输入的功能失效。这个问题主要是由于中文...

    输入法快捷设置及源码

    标题中的“输入法快捷设置及源码”表明这是一个关于创建自定义输入法快捷键的项目,使用了Delphi编程语言。Delphi是一款基于Object Pascal的集成开发环境,以其高效的编译器和直观的可视化设计界面著称,尤其适合...

    切换输入法

    4. 使用VB的Form或Control事件,如KeyDown或KeyUp,监听用户的输入行为,根据需要触发输入法切换。 5. 在适当的时候调用API函数,发送键盘事件,实现输入法切换。 6. 测试和调试程序,确保在各种情况下都能正确无误...

    在WINCE中实现日语输入法自动切换的方法

    - `dwFlags`:标志位,可以指定按键事件类型,如`KEYEVENTF_KEYDOWN`(按下)、`KEYEVENTF_KEYUP`(释放)和`KEYEVENTF_SILENT`(无声音)。 - `dwExtraInfo`:附加信息,一般为0。 在`SetIMStatus`函数中,通过...

    jQuery云输入法加手写输入法功能源码.zip

    《jQuery云输入法与手写输入法功能实现详解》 在现代网页开发中,为了提供更优秀的用户体验,尤其是在中文输入...通过研究和理解这个源码,开发者不仅可以掌握相关技术,还能为自己的项目带来更丰富的输入解决方案。

    C#WinForm中的KeyDownKeyPress和KeyUp事件相关知识点

    ### C# WinForm中的KeyDown, KeyPress和KeyUp事件相关知识点 #### 一、按键的类型与识别 在C# WinForm应用中,处理用户的键盘输入是常见需求之一。Windows窗体通过引发键盘事件来响应用户的键盘操作。这些事件主要...

    MTK平台输入法ZI详细解说

    【MTK平台输入法详解】 MTK平台输入法是针对基于联发科(Mediatek)芯片的手机系统设计的一种输入方法,它涉及到人机交互界面的关键组件,为用户提供便捷的文字输入体验。本文将深入解析MTK平台上的两种主要输入方式...

    修改jQuery.Autocomplete插件 支持中文输入法 避免TAB、ENTER键失效、导致表单提交

    一开始尝试的解决方案是将“keydown”事件改为“keyup”事件,这在某种程度上能解决中文输入匹配的问题,但会破坏插件中如回车(ENTER)、制表符(TAB)等其他重要键位的事件绑定机制。比如在表单内的输入框中,...

    Vb实现像输入法一样的悬浮窗口

    通过监听`TextBox`的`KeyDown`和`KeyUp`事件,可以捕捉用户的按键行为,进而提供相应的服务,如候选词显示等。 此外,为了实现类似输入法的候选词列表,可以使用`ListBox`或`ListView`控件,根据用户输入动态填充...

    vue element-ui 绑定@keyup事件无效的解决方法

    在Vue.js和Element-UI框架的开发过程中,有时会遇到绑定`@keyup`事件失效的情况。这通常是由于Element-UI组件内部已经处理了键盘事件,导致外部定义的事件监听器无法正常工作。针对这个问题,我们可以采取一些策略来...

    C# KeyUp事件中MessageBox的回车(Enter)键回调问题解决方案

    这个解决方案的核心思想是将键盘事件处理逻辑移动到不会被`MessageBox`触发的事件中,以及正确地阻止或管理事件的默认行为。在编写涉及用户界面交互的代码时,理解这些事件的工作原理和如何控制它们的行为至关重要,...

    Visual Basic中的键盘输入法.rar_visual basic_用VB写个T9键盘的程序_输入法 _键盘

    在VB窗体中,我们可以使用`KeyDown`和`KeyUp`事件来捕获用户按下和释放键盘键的动作。这两个事件在`Form`对象或任何控件上都可以使用。例如,以下代码展示了如何在窗体上响应`KeyDown`事件: ```vb Private Sub ...

Global site tag (gtag.js) - Google Analytics