javascript - 为什么在 onkeydown 方法中返回 false 在 Android 上的 Chrome 中不起作用?
问题描述
我有一些代码在我的桌面浏览器中运行良好:
document.getElementById('oneshot-timer-input').onkeydown = function(KeyboardEvent) {
if (KeyboardEvent.key == "Backspace") {
data.splice(-1,1);
} else if (KeyboardEvent.key.length == 1 && !isNaN(Number(KeyboardEvent.key))) {
if (data.length < 6) {
if (data.length > 0 || KeyboardEvent.key != "0") {
data.push(KeyboardEvent.key);
}
}
}
updateInputField();
return false;
}
输入字段的值通过以下方式在另一个函数中设置:
document.getElementById('oneshot-timer-input').value = timeOutput;
它基本上保留默认操作,并在满足某些条件时设置输入字段的值(仅接受数字和退格)。基值为00h 00m 00s
。输入数字时,它会替换从右开始的零。
这在我的桌面浏览器中工作得很好,但是当我在手机上打开页面时,它会将最新的数字添加到基值的末尾,因此它会读取00h 00m 01s1
例如。不过,它永远不会超过 1 个额外的数字,所以另一个例子可能是12h 34m 56s6
. 我在这里缺少与 Android 相关的东西吗?
解决方案
所以我错过了明显的:Android 为每个键返回一个带有 keyCode 229 的未识别键,至少在查看 onkeydown 方法时是这样。
我在“textInput”上添加了另一个 EventListener,它可以完美地处理输入。但是,退格仍然是一个问题,因为这根本不会触发键事件。可悲的是,这意味着输入字段中的文本确实被删除了,但不是按照预期的那样。
执行:
var ua = navigator.userAgent.toLowerCase();
var isAndroid = ua.indexOf("android") > -1;
if (!isAndroid) {
document.getElementById('oneshot-timer-input').onkeydown = function(KeyboardEvent) {
var keyCode = KeyboardEvent.keyCode;
if (keyCode == 8 || (keyCode >= 48 && keyCode <= 57) || (keyCode >= 96 && keyCode <= 105)) {
KeyboardEvent.preventDefault();
handleKeyCode(KeyboardEvent.keyCode, KeyboardEvent.key);
} else if (KeyboardEvent.key == "Escape") {
setTimerState(TimerStateEnums.unlock, true);
} else if (KeyboardEvent.key == "Enter") {
document.getElementById("play-pause").checked = true;
play_pause(document.getElementById("play-pause"));
}
}
} else {
document.getElementById("oneshot-timer-input").addEventListener('textInput', function(TextEvent) {
TextEvent.preventDefault();
console.log(TextEvent);
var char = TextEvent.data;
var keyCode = char.charCodeAt(0);
handleKeyCode(keyCode, char);
return false;
});
}
推荐阅读
- java - Hibernate 在每个应用程序运行时创建模式?
- vue.js - 如何在导航守卫之前调用方法
- firefox - 如何在 Firefox(本地开发)中使用 Geolocation API?
- ios - 从后台线程更改视图控制器
- amazon-web-services - 迁移 SSL HTTPS 时,root apache tomcat 上的会话过多
- node.js - 在 Firebase 中注册新用户时如何发送电子邮件验证?
- python - yfinance - 错误:命令出错,退出状态为 1:python setup.py egg_info 检查日志以获取完整的命令输出
- mysql - MySQL:选择至少有 m 属性的第 n 行?
- ios - 按“isComplete”过滤数组
- c# - 如何存储使用 2 个键查找值的数据对象