Chrome for Android中的keycode始终为零

时间:2013-06-17 00:33:26

标签: javascript google-chrome javascript-events keycode

我需要在我的网站上检测自定义搜索框的密钥代码,但Chrome for Android上的密钥代码始终返回为零(退格区除外,返回8)。有没有其他人经历过这一点,你是如何解决它的?我们的网站适用于除Chrome for Android以外的所有移动浏览器,因为我们无法检测到非零键码或字码。

我在Android 4.1.2 Jelly Bean上运行Chrome 27.0.1453.90。这个问题可以通过以下简单的方法复制:
alert(event.keyCode);

10 个答案:

答案 0 :(得分:14)

below solution 也适合我。也可能对其他人有用。

var getKeyCode = function (str) {
    return str.charCodeAt(str.length - 1);
}

document.getElementById("a").onkeyup = function (e) {
    var kCd = e.keyCode || e.which;
    if (kCd == 0 || kCd == 229) { //for android chrome keycode fix
        kCd = getKeyCode(this.value);
    }
    alert(kCd)
}

答案 1 :(得分:2)

我们最近在中国制造的Android手机魅族MX3上遇到了这个问题,该手机具有基于 Android 4.4.4 的深度定制操作系统。

默认的浏览器和Chrome工作正常,但由于一些我们不知道的奇怪原因, event.keyCode event.charCode 事件。哪个在其他一些浏览器中一直返回0(例如CM Browser或微信应用的webview)。

我们通过检查您输入的最后一个字符(例如'A'或''(空格))解决了这个问题,然后我们使用charCodeAt将其转换为ascii代码,例如“A”.charCodeAt(0)返回97,这是我们需要的实际字符代码。

但是我们只能使用这个策略来确定可见字符的字符代码,这符合我们当前需要感谢上帝。

希望你们能从中获得灵感。

答案 2 :(得分:2)

我遇到了与SonyXperia和HTC的Android设备相同的问题。我正在开发混合应用程序,我通过从文本字段中的 event.keyCode() 事件中读取输入字符的 keydown 来验证金额文本字段,以便我只能输入数字和点(。)字符。我试过但它不起作用,在这些设备中总是返回0。 后来我带来了 keyup 事件的其他解决方案以及通过正则表达式进行字符匹配:

$("#AmountField").keyup(function (e) {

    var regex = /^[0-9\.]$/;
    var str = $(this).val();
    var subStr = str.substr(str.length - 1);
    if(!regex.test(subStr)) {

        if(str.length >0){
            $(this).val(str.substr(0, (str.length - 1)));
        }else{ 
            $(this).val();
        }

    }

});

希望这对面临这个问题的人有所帮助。祝你好运。

答案 3 :(得分:2)

我遇到了这个问题,这就是我如何解决问题的方法。

  • 首先,您需要在Android手机上启用USB调试 您可以在桌面计算机上查看浏览器的日志。
  • 其次,在桌面类型" monitorEvents(document)"上刷新手机和控制台内的Web应用程序。或者你想要检查的任何元素。
  • 在手机上执行要检查的操作。

这就是我发现keydown事件实际上被一个名为" textInput"的唯一事件触发的方式。其中包含event.originalEvent.data中的信息。

希望这能节省您的时间和好运!

答案 4 :(得分:1)

获取keyCode的真正方法是使用

event.which

事件对象上的此属性标准化event.keyCode属性。您也可以在jQuery文档here或MDN here

中阅读相关内容

另外,我在Android设备上有很多键盘事件的经验。 由于设备碎片(设备或外部键盘应用程序之间的ROM不同),Android浏览器有时会出现键盘事件。最好的方法是尝试使用所有键盘事件(keydown,keyup和keypress)并比较每个结果以获得按下的键。

最好的方法是在“输入”事件中使用并始终获得最后一个章程。输入事件可以像我的回答here一样控制。

答案 5 :(得分:1)

<input type="text" id="char" size="15" onblur="showKeyCode()" value="a">
<input type="button" value="Show Key Code" onclick="showKeyCode();">
<script>
function showKeyCode()
{
    var character = document.getElementById ( "char" ).value.substr(this.length - 1);
    var  code = character.charCodeAt();

    var stringall = document.getElementById ( "char" ).value;
    var msg = "The Key Code for the \""+character+"\" character is "+code+".";
    alert(msg);
 }
</script>

For reference

答案 6 :(得分:1)

如果有人还在挖它。问题出现在股票三星键盘上 android个设备。

而是使用onkeyup

答案 7 :(得分:0)

需要使用 charCode 而不是 keyCode

<input type="text" onKeyPress="return funName(this,event)" />

<script language="javascript">
function funName(th,ev)
{   
   alert(ev.charCode);
}
</script>

答案 8 :(得分:0)

将输入的类型更改为tel:<input type="tel">

这将允许您记录keyCode,但它不会记录退格键,并且可能会强制移动设备上的键盘只有数字。

答案 9 :(得分:0)

因此,在大多数Android浏览器中,如果您使用keydown或keyup,您将无法从key或keyCode或代码中获取数据

您可以使用event.data(插入的数据键)和event.inputType(退格键或移动设备中的del键)

要实现此功能,您需要基于android mobile的用户代理应用条件

if (navigator.userAgent.match(/Android/i)) {
    node.addEventListener('input', handleInput, false);
  } else {
    node.addEventListener('keydown', handleKeyDown, false);
  }


  const handleKeyDown = event => {
    event.preventDefault();
    if (!event.key) {
      return false;
    }
    genericFunctionHandleThings(event.key, event.code === 'Backspace');
  };

 const handleInput = event => {
    event.preventDefault(); // Here event.preventDefault doesn't stop user from typing
    genericFunctionHandleThings(event.data, event.inputType === 'deleteContentBackward');
    node.value = storedOrProcessedValue;
  };

在这里我使用了node.value = storedOrProcessedValue,因为如果我们想对用户键入进行一些限制,我们需要处理并将其重新分配给输入

您可以将其与输入类型的文本,URL,电子邮件,电话一起使用,这些我已经测试过,我需要检查其余部分