android 上的 keyCode 始终为 229

问题描述 投票:0回答:12
javascript android html keyevent
12个回答
35
投票

在 Android 设备中,正常的按键事件不会给出 keyCode。对此已经进行了一次大的讨论

如果您想捕获

space bar
special chars
的按下,可以使用
textInput
事件。

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

注意:

textInput
不会在字母、数字、退格键、回车键和其他几个键上触发。


15
投票

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

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

7
投票

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

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

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

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

希望这对某人有帮助。


3
投票

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

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

jQuery 标准化了这些东西,所以除了 e.which 之外不需要使用任何东西 https://stackoverflow.com/a/302161/259881


3
投票

也许您想使用

onbeforeinput
oninput
事件及其
.data
属性来查找字符值,而不是使用
keydown
keyup
以及
.key
.keycode

http://jsfiddle.net/vLga0fb9

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


1
投票


我知道我正在回答一篇旧帖子,但这个问题仍然存在,所以我想分享对此的看法。
然而,这个方法并不是一个精确的解决方案,而只是像我一样的紧急解决方案。
关键是在使用按键时使用文本框的值。对于每个按键,值都会改变,通过最后一次值更新,我们可以确定按下了哪个键。
注意:这仅适用于键盘上的可见字体,即字母数字和特殊字符,这不会记录任何控制或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
投票

据我所知,这在移动设备上仍然是一个问题,因此解决它的唯一方法是提供解决方法。
对于回车键,您可以使用 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/


1
投票
e.target.value.endsWith(',')

你可以用这个。适用于

android
设备。

类似的东西

    $(document).on("keyup", '.tagsinput', function (e) {
        // console.log('|'+e.target.value.endsWith(',')+'|')
        // elif 

        if (e.keyCode == 188 || e.keyCode == 13 || e.target.value.endsWith(',')) { // KeyCode For comma is 188
            // alert('comma added');
            word = e.target.value.split(',')[0]
            console.log(word.length)
            if (word.length != 0) {
                console.log(word);
                tagsarray.push(word)
                e.target.value = ''
                tagarea.innerHTML += `<div class="block" id="${word}"><span class="tagscircle">${word}</span><div class="inline-block" attr-val="${word}" onclick="removeTag(event)"><svg attr-val="${word}" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" role="img" width="1em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 24 24"><path fill="none" stroke="currentColor" stroke-linecap="round" stroke-width="2" d="M20 20L4 4m16 0L4 20"/></svg></div></div>`
                resultsBox1.innerHTML = ''
            }
            else {
                e.target.value = ''

            }

        }
    });

0
投票

我发现,对于检测

enter
键的特定用例,将输入的
enterkeyhint
设置为
done
修复了“enter”键的此问题。一旦我这样做了,它的关键代码不再是229,而是正确的“输入”代码。


0
投票

对于 React,我的代码是

 <input onInput={handleKeyDown} />

函数是

  const handleKeyDown = (e) => {           
    const keyCode = e.nativeEvent.data.charCodeAt(0);
     // Do what you wish with the keyCode

    
  };

-1
投票

针对 WebView 修复此问题的解决方案,注意它仅处理空格字符

,但您可以扩展映射
KeyEvent.KEYCODE_SPACE => 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
    }
}

-12
投票

尝试用

e.which
代替
e.keyCode

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

© www.soinside.com 2019 - 2024. All rights reserved.