【问题标题】:JavaScript keypress event not raised on Android browserAndroid 浏览器上未引发 JavaScript 按键事件
【发布时间】:2014-01-30 01:44:45
【问题描述】:

我创建了一个简单的代码来处理keypress 事件:

var counter = 0;        
$('input').on('keypress', function () {
    $('div').text('key pressed ' + ++counter);
});

JSFiddle.

但在移动浏览器(Android 4+、WindowsPhone 7.5+)上不会引发 keypress 事件处理程序。 可能是什么问题?

【问题讨论】:

标签: javascript android jquery keypress hybrid-mobile-app


【解决方案1】:

我相信 keypress 现在已被弃用。您可以查看Dom Level 3 Spec。使用 keydownkeyup 应该可以。该规范还建议您应该使用 beforeinput 而不是 keypress 但我不确定这是什么支持。

【讨论】:

  • keydown 不提供字符而是提供键码。因此,keydown 不能替代 keypress。
  • @Meixner 这是很久以前的事了,所以我不知道 Android 是否仍然不支持 Keypress。有了这个解决方案,虽然想法是你从键码中找到字符
  • "keypress" 仍然不支持屏幕键盘。
  • keypress 仍然适用于 iphone 但不适用于 Android,而 keydown 不适用于 iphone 和 android
  • 注意:beforeinput 应该可以取消,但它不在 Chrome 上。 stackoverflow.com/questions/53140803/…
【解决方案2】:

使用keyup 事件:

// JavaScript:
var counter = 0;        
document.querySelector('input').addEventListener('keyup', function () {
    document.querySelector('div').textContent = `key up ${++counter}`;
});

// jQuery:
var counter = 0;        
$('input').on('keyup', function () {
    $('div').text('key up ' + ++counter);
});

【讨论】:

  • 如果您想对更改做出反应,您甚至可以使用 oninput。但是,如果您需要的是实际输入的键,那么这些都不会在 Android 上为您提供帮助。
  • @ÍhorMé 你有解决安卓键盘事件的办法吗?
  • @Mrunal 普遍来说,你应该使用 oninput 事件。我已经在stackoverflow.com/questions/30743490/… 发布了用于在所有(或至少许多)平台上处理输入文本的代码,如果这就是您所追求的。不过,它是用 4 间隔的制表符格式化的,而 Stack 有完全疯狂的 8 间隔制表符,但请注意。
【解决方案3】:

使用jQuery的输入事件,像这样:

$( 'input' ).on( 'input', function() {
    ...
} );

这样你就不能使用 e.which 来确定按下了哪个键,但我在这里找到了一个很好的解决方法:http://jsfiddle.net/zminic/8Lmay/

【讨论】:

    【解决方案4】:
    $(document).ready(function() {
      var pattForZip = /[0-9]/;
      $('#id').on('keypress input', function(event) {
        if(event.type == "keypress") {
          if(pattForZip.test(event.key)) {
            return true;
          }
          return false;
        }
        if(event.type == 'input') {
          var bufferValue = $(this).val().replace(/\D/g,'');
          $(this).val(bufferValue);
        }
      })
    })
    

    【讨论】:

    • 请尝试为您的解决方案添加更多信息。欢迎来到 Stack Overflow。 :)
    【解决方案5】:

    是的,有些android浏览器不支持keypress事件,我们只需要使用keydown或keyup但会得到不同的keycode,为了避免不同的keycode使用下面的函数通过发送char值来获取keycode。

    例如:

    function getKeyCode(str) {
      return str && str.charCodeAt(0);    
    }
    function keyUp(){
     var keyCode = getKeyCode("1"); 
    }
    

    【讨论】:

      【解决方案6】:

      我认为使用其他事件代替“按键”是个坏主意。 您需要做的只是在您的项目中包含一个 jQuery 文件。 一个名为 jQuery.mobile.js 或任何版本的非常相似的文件(例如 jQuery.ui.js)可以帮助你。

      你可以从https://jquerymobile.com/download/下载它

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-12-07
        • 2018-08-08
        • 1970-01-01
        • 2012-04-21
        • 2013-10-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多