我正在尝试创建一个拨号小部件,捕捉"keydown“事件并突出显示相应的拨号号码。
因此,例如,在键盘上单击"A“,就会在UI上突出显示"2”:

我成功地绘制了前5位数字(2-6位)。由于它们每个包含3个字母,所以我能够像这样映射keyCode:
Math.floor(KeyCode- 65) / 3) + 2)。
Q:是否有一种方法可以在一行中完成,那么PQRS和WXYZ将适合这个解决方案吗?
发布于 2016-07-06 15:19:43
如果你真的需要它,那可能有用:
Math.min(9, Math.floor(((KeyCode - (KeyCode < 83 ? 65 : 66)) / 3) + 2))但你也必须确保KeyCode实际上是一封信。
您讨论的显而易见的解决方案要好得多,因为它具有可读性、可配置性和peform的速度都一样快:
function toDialNumber(KeyCode) {
var keyMap = {1:"", 2:"ABC", 3:"DEF", 4:"GHI", 5:"JKL", 6:"MNO", 7:"PQRS", 8:"TUV", 9:"WXYZ"};
var letter = String.fromCharCode(KeyCode);
for(key in keyMap) if(keyMap[key].indexOf(letter)>=0) return key;
return false;
}发布于 2016-07-12 00:42:48
地图是最明显的解决方案,我正在研究数学解
如果您正在寻找一个解析表达式,您可以将例如二次或指数函数与给定的键码到数字的映射相匹配:

// Exponential fit:
Math.floor(33.2 - 65.5 * Math.exp(-0.0115 * KeyCode));或者,您可以通过比较操作符对键码> 82和键码> 89处出现的“异常”进行编码。
// Comparison:
Math.floor((KeyCode - 65 - (KeyCode > 82) - (KeyCode > 89)) / 3 + 2);指数拟合的优点是键码项只出现一次,而后面的表达式则更易读。
示例实现/测试:
// Quadratic fit:
var sqr = (k) => -0.0018 * k * k + 0.59 * k - 28.6 | 0;
// Exponential fit:
var exp = (k) => 33.2 - 65.5 * Math.exp(-0.0115 * k) | 0;
// Comparison:
var cmp = (k) => (k - 65 - (k > 82) - (k > 89)) / 3 + 2 | 0;
for (var k = 65; k <= 90; ++k) {
console.log(String.fromCharCode(k), sqr(k), exp(k), cmp(k));
}
https://stackoverflow.com/questions/38180125
复制相似问题