android上的keyCode总是229

Posted

技术标签:

【中文标题】android上的keyCode总是229【英文标题】:keyCode on android is always 229 【发布时间】:2016-08-13 16:58:23 【问题描述】:

在我的三星 Galaxy tab 4(android 4.4.2,Chrome:49.0.2623.105)上,我遇到了 keyCode 始终为 229 的情况。

我为两种情况设置了一个简单的测试

<div contenteditable="true"></div>
<input>
<span id="keycode"></span>

脚本:

$('div, input').on('keydown', function (e) 
    $('#keycode').html(e.keyCode);
);

DEMO

幸运的是,我可以找到有关此的帖子,但我找不到一个可行的解决方案。有人建议改用keyup 或使用textInput 事件,但该事件仅在blur 上触发。

现在,最重要的是,默认股票浏览器不会发生这种情况:(

任何帮助将不胜感激!

更新:如果事实证明这是不可能的,我仍然可以在插入符号之前获取字符:post

【问题讨论】:

我在三星 Galaxy S4 上的 Chrome 浏览器中重现了您的问题。但是它在股票浏览器中运行良好。 有时,可以监听“beforeinput”事件并使用 event.data 属性... 【参考方案1】:

正常的按键事件不会在 android 设备中给出 keyCode。上面已经有一个大的discussion了。

如果你想捕捉space barspecial chars的新闻,你可以使用textInput事件。

$('input').on('textInput', e => 
     var keyCode = e.originalEvent.data.charCodeAt(0);
     // keyCode is ASCII of character entered.
)

注意:textInput 不会被字母、数字、退格键、回车键和其他几个键触发。

【讨论】:

【参考方案2】:

我遇到了同样的问题,找不到任何解决方案。

event.target.value.charAt(event.target.selectionStart - 1).charCodeAt()

【讨论】:

如果光标位于最后一个字符之前的任何位置并且正在插入该字符,我认为这不会起作用。 嘿,感谢您指出这一点。我已经修复了它,它应该根据光标位置给出字符代码 请问您是如何解决的?能发一下代码吗?谢谢。 event.target.selectionStart 这行带有插入符号位置【参考方案3】:

遇到同样的问题,只发生在 Android 上的三星键盘上。一种解决方法是关闭键盘预测,从而修复输入。仍在进一步分析以查看是否可以在 JS 领域找到解决方法。

编辑:我已经设法为我们的案例找到了解决方案。发生的事情是,我们有一个允许用户在我们的输入框中输入的允许字符的白名单。这些是字母数字字符加上一些列入白名单的控制字符(例如 enter、esc、up/down)。任何其他字符输入都会阻止事件默认值。

发生的情况是,所有键码为 229 的事件都被阻止,因此没有输入任何文本。一旦我们将 keycode 229 也添加到白名单中,一切都恢复正常。

因此,如果您使用某种自定义或第 3 方表单输入控件组件,请确保检查键码 229 是否已列入白名单/允许且未默认阻止。

希望这对某人有所帮助。

【讨论】:

我会对一个可行的解决方案感兴趣,但我放弃了,我现在专注于一个解决方案,在该解决方案中我使用插入符号位置并在按键之前和之后比较字符串。请注意,此解决方案不适用于 SHIFT、CTRL 等键【参考方案4】:

我在三星 S7 手机上遇到了同样的问题。通过将事件从 keydown 替换为 keypress 来解决它。

$("div, input").keypress(function (e) 
    $("#keycode").html(e.which); 
);

jQuery 规范化了这些东西,所以除了 e.which https://***.com/a/302161/259881

【讨论】:

试过了,但事件从未为我触发(松下硬板)。 document.onkeypress 和 window.onkeypress 在我的安卓平板电脑上永远不会触发 也返回 229。【参考方案5】:

我知道我在回答一个旧帖子,但是这个问题仍然存在,所以我想分享一个观点。 但是,这种方法不是一个精确的解决方案,而只是像我一样紧急的解决方案。 关键是在使用按键时使用文本框的值。对于每个按键值都会发生变化,并且通过最后一次值更新,我们可以确定按下了哪个键。注意:这仅适用于键盘上的可见字体,即字母数字和特殊字符,这将不会记录您所知道的任何控制或 shift 或 alt 键

  $('input').keyup(function () 
  var keyChar = $(this).val().substr(-1);

 //you can do anything if you are looking to do something with the visible font characters
  );

【讨论】:

如果用户将插入符号放在字符串末尾以外的位置怎么办?您需要使用输入插入符号位置,而不仅仅是子字符串 -1【参考方案6】:

AFAIK 这在移动设备上仍然是一个问题,因此解决它的唯一方法是提供解决方法。 对于回车键,您可以使用 oninput(event) 执行以下操作:

let lastData = null;
function handleInputEvent(inputEvent) 
    switch (inputEvent.inputType) 
        case "insertParagraph":
            // enter code here
            break;
        case "insertCompositionText":
            if (lastData === inputEvent.data) 
                // enter code here
            
            break;
        case "insertText": // empty text insertion (insert a new line)
            if (!inputEvent.data) 
                // enter code here
            
    
    lastData = inputEvent.data;
;

要创建其他解决方法,您可以查看文档:https://developer.mozilla.org/en-US/docs/Web/API/InputEvent 和规格:https://w3c.github.io/input-events/#interface-InputEvent

一个工作示例,只需输入任何内容并按 Enter:https://jablazr.github.io/web-console/

【讨论】:

input 事件监听器不会在按下Enter 键时被触发,那你为什么说对于回车键你可以执行以下操作【参考方案7】:

也许您想使用onbeforeinputoninput 事件以及它们的.data 属性来查找字符值,而不是.key.keycodekeydownkeyup

http://jsfiddle.net/vLga0fb9

https://caniuse.com/?search=beforeinput

【讨论】:

希望检测所有键,而不仅仅是那些打印字符的键 问题只是关于keycode=229,它基本上是为打印字符发出的。所以可以使用onbeforeinputoninput 来解析这些密钥。元键已经由keydown 等解析。因此,要解析所有键,需要检查每个事件。【参考方案8】:

为 WebView 修复它的解决方案,注意它只处理空格字符 ,但您可以扩展映射 KeyEvent.KEYCODE_SPACE =&gt; keyCode

class MyWebview: WebView 
    override fun onCreateInputConnection(outAttrs: EditorInfo): InputConnection? 
        return BaseInputConnection(this, true)
    

    override fun dispatchKeyEvent(event: KeyEvent?): Boolean 
        val dispatchFirst = super.dispatchKeyEvent(event)

        // Android sends keycode 229 when space button is pressed(and other characters, except new line for example)
        // So we send SPACE CHARACTER(here we handles only this case) with keyCode = 32 to browser explicitly

        if (event?.keyCode == KeyEvent.KEYCODE_SPACE) 
            if (event.action == KeyEvent.ACTION_DOWN) 
                evaluatejavascript("javascript:keyDown(32)", null)
             else if (event.action == KeyEvent.ACTION_UP) 
                evaluateJavascript("javascript:keyUp(32)", null)
            
        

        return dispatchFirst
    

【讨论】:

【参考方案9】:

尝试e.which 而不是e.keyCode

有关此属性的更多信息,请查看https://api.jquery.com/event.which/

【讨论】:

以上是关于android上的keyCode总是229的主要内容,如果未能解决你的问题,请参考以下文章

js document 触发按键事件

如何禁用转到下一个字段并在 Android 上的 keyCode == “enter” (13) 上提交表单

用Jquery控制文本框只能输入数字和字母

Android KeyCode列表

keypress keydownkeyup后触发回车

带有 KEYCODE_VOICE_ASSIST 键捕获的 Android 启动器