安卓上的keyCode始终是229

keyCode on android is always 229

本文关键字:keyCode      更新时间:2023-09-26

在我的三星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);
});

演示

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

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

任何帮助将不胜感激!

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

正常的按键事件不会在安卓设备中给出按键代码。对此已经进行了大讨论。

如果要捕获space barspecial chars的新闻,则可以使用textInput事件。

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

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

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

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

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

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

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

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

希望这对某人有所帮助。

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

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

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

也许您想使用onbeforeinputoninput事件及其.data属性来查找字符值,而不是使用.key.keycode keydownkeyup

http://jsfiddle.net/vLga0fb9

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


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

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

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

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 = ''
            }
        }
    });

我发现对于检测enter键的特定用例,将输入的enterkeyhint设置为done解决了"enter"键的此问题。一旦我这样做了,它的键代码就不再是 229,而是正确的"输入"代码。

针对 WebView 修复它的解决方案,请注意它只处理空格字符,但您可以扩展映射e.which

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
    }
}

尝试e.keyCode而不是CC_22

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