Android WebVIew中的键盘长键按下

Posted

技术标签:

【中文标题】Android WebVIew中的键盘长键按下【英文标题】:Keyboard Long Key Press in Android WebVIew 【发布时间】:2021-09-26 16:45:27 【问题描述】:

任何人都知道如何在 android WebView 中处理长按键盘键。我以为我可以简单地使用 KeyboardEvent repeat 属性 (https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/repeat) 但是当我使用以下代码对其进行测试时,尽管按住键,但返回的重复属性始终为 false。

document.addEventListener('keydown', logKey);

function logKey(event) 
    console.log(event.repeat);

上面的代码在桌面浏览器上按预期工作并返回一次 false,然后重复返回 true,同时按住一个键。但是在 Android WebView 中,它反复返回 false。

您知道问题出在哪里,或者有另一种处理长键盘按键的方法吗?

更新 为了澄清,我试图绑定到长按键事件而不是忽略它。如果一个键被按住一段时间,我想触发一个函数。

【问题讨论】:

【参考方案1】:

你可以重写document.onkeydown函数,然后通过抗抖动机制处理对应的key值。毕竟,我们需要处理的是键值,而不是长键。代码如下:

var throttle = function(func, delay) 
            var prev = Date.now();
            return function() 
                var context = this;
                var args = arguments;
                var now = Date.now();
                if (now - prev >= delay) 
                    func.apply(context, args);
                    prev = Date.now();
                
            
        
function onkeypress(evt) 
    var keycode = evt.which ? evt.which : evt.keyCode;
    console.log(keycode);


document.onkeypress = throttle(onkeypress, 500);

【讨论】:

感谢您的回复。您能否详细说明关于使用“抗抖动机制”的含义?例如,我将如何听长按 Enter 键? 在Android上,长按键表示一段时间内上报了很多按键事件,但您只需要在指定时间内处理一次即可。 再次感谢您的回复,但除非我弄错了,否则这不会按预期工作。使用此代码,如果我按下 Enter 键一次,然后只需等待超过半秒的延迟,然后再次按下,就会触发该功能。我想要相反的行为,只有在您按住 enter 键指定的时间量时才会触发该功能。 可以减少油门功能的时间,如:document.onkeypress = throttle(onkeypress, 150); 糟糕,也许你应该处理 onkeyup 函数。

以上是关于Android WebVIew中的键盘长键按下的主要内容,如果未能解决你的问题,请参考以下文章

检测蓝牙键盘上的 Tab 键按下

markdown JavaFx场景键按下(键盘)

WPF用键盘左右键按下获取按钮焦点,离开执行按钮事件

鼠标右键按下和放开的键代码是多少

android 处理Back键按下事件

JavaScript onkeydown事件入门实例(键盘某个按键被按下)