为什么在 onkeydown 方法中返回 false 在 Chrome on Android 中不起作用?
Why does returning false in onkeydown method not work in Chrome on Android?
我有一些代码可以在我的桌面浏览器中完美运行:
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
。输入数字时,它会从右边开始替换零。
这在我的桌面浏览器中工作得很好,但是当我在 phone 上打开页面时,它会将最新的数字添加到基值的末尾,因此它显示 00h 00m 01s1
例子。但是它永远不会超过 1 个额外的数字,所以另一个例子可能是 12h 34m 56s6
。我在这里缺少 Android 相关的东西吗?
所以我遗漏了显而易见的东西:Android returns 一个未识别的密钥,每个密钥的密钥代码都是 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;
});
}
我有一些代码可以在我的桌面浏览器中完美运行:
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
。输入数字时,它会从右边开始替换零。
这在我的桌面浏览器中工作得很好,但是当我在 phone 上打开页面时,它会将最新的数字添加到基值的末尾,因此它显示 00h 00m 01s1
例子。但是它永远不会超过 1 个额外的数字,所以另一个例子可能是 12h 34m 56s6
。我在这里缺少 Android 相关的东西吗?
所以我遗漏了显而易见的东西:Android returns 一个未识别的密钥,每个密钥的密钥代码都是 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;
});
}