37

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

我在 Android 4.1.2 Jelly Bean 上运行 Chrome 27.0.1453.90。这个问题可以用简单的东西来复制:
alert(event.keyCode);

4

10 回答 10

18

以下解决方案也适用于我。也可能对其他人有用。

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)
}
于 2015-05-27T13:25:20.150 回答
3

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

  • 首先,您需要在您的 Android 手机上启用 USB 调试,以便您可以在台式机上查看浏览器的日志。
  • 其次,在您的手机和桌面上的控制台中刷新您的 Web 应用程序,输入“monitorEvents(document)”或您想要检查的任何元素。
  • 在手机上执行您要检查的操作。

这就是我发现keydown事件实际上是由一个名为“textInput”的独特事件触发的,该事件包含event.originalEvent.data中的信息。

希望这可以节省您的时间并祝您好运!

于 2015-08-27T21:27:20.433 回答
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();
        }

    }

});

希望这可以帮助面临这个问题的人。祝你好运。

于 2015-03-03T11:48:06.330 回答
2

我们最近在一款国产安卓手机魅族MX3上遇到了这个问题,它基于安卓4.4.4深度定制操作系统。

默认浏览器和 Chrome 工作得很好,但是由于一些我们不知道的奇怪原因,event.keyCodeevent.charCodeevent . 在其他一些浏览器(例如CM 浏览器或微信应用的 webview )中一直返回 0 )。

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

但是我们只能使用这种策略来确定可见字符的字符代码,这满足了我们目前的需要感谢上帝。

希望大家能从中得到一些启发。

于 2014-11-15T08:52:59.277 回答
1

获取keyCode的真正方法是使用

event.which

事件对象的这个属性是标准化的event.keyCode属性。您也可以在此处的 jQuery 文档或此处的 MDN中阅读有关它的信息

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

最好的方法是在“输入”事件中使用并获取所有时间的最后一个宪章。输入事件可以像我在此处的回答中一样进行控制。

于 2013-12-23T19:18:11.823 回答
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>

以供参考

于 2014-09-18T06:47:51.587 回答
0

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

这将让您记录 keyCode 但它不会记录退格键,并且它可能会强制移动设备上的键盘仅输入数字。

于 2018-01-29T09:28:57.640 回答
0

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

你可以使用 event.data(Inserted data key) 和 event.inputType(backspace or del in mobile)

为了实现您需要的功能,您必须根据 Android 手机的用户代理应用条件

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 因为如果我们想对用户输入进行一些限制,我们需要处理并将其重新分配给输入

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

于 2020-03-12T18:49:32.443 回答
0

如果有人还在挖掘它。问题出现在三星 android设备的库存键盘上。

而是使用onkeyup.

于 2015-12-02T17:29:22.763 回答
-1

需要使用charCode而不是keyCode

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

<script language="javascript">
function funName(th,ev)
{   
   alert(ev.charCode);
}
</script>
于 2017-12-20T15:13:33.220 回答