Android 浏览器上未引发 JavaScript 按键事件

Posted

技术标签:

【中文标题】Android 浏览器上未引发 JavaScript 按键事件【英文标题】:JavaScript keypress event not raised on Android browser 【发布时间】: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 事件处理程序。 可能是什么问题?

【问题讨论】:

在这里尝试@The System Restart 的建议:***.com/questions/10580295/… 【参考方案1】:

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

【讨论】:

keydown 不提供字符而是提供键码。因此,keydown 不能替代 keypress。 @Meixner 这是很久以前的事了,所以我不知道 Android 是否仍然不支持 Keypress。有了这个解决方案,虽然想法是你从键码中找到字符 "keypress" 仍然不支持屏幕键盘。 keypress 仍然适用于 iphone 但不适用于 Android,而 keydown 不适用于 iphone 和 android 注意:beforeinput 应该可以取消,但它不在 Chrome 上。 ***.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 事件。我已经在***.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/下载它

【讨论】:

以上是关于Android 浏览器上未引发 JavaScript 按键事件的主要内容,如果未能解决你的问题,请参考以下文章

android上未显示自定义标记图标[关闭]

Android Oreo 上未添加地理围栏

在某些 Android 设备上未发现 Chromecast 设备

在调试时授予位置权限,但在 android 系统上未授予

Flutter:Android模拟器上未安装发布apk

Android API 23 上未显示 EditText 视图