首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JS -将字母数字键盘keyCode映射到拨号盘号码2-9

JS -将字母数字键盘keyCode映射到拨号盘号码2-9
EN

Stack Overflow用户
提问于 2016-07-04 08:33:08
回答 2查看 933关注 0票数 6

我正在尝试创建一个拨号小部件,捕捉"keydown“事件并突出显示相应的拨号号码。

因此,例如,在键盘上单击"A“,就会在UI上突出显示"2”:

我成功地绘制了前5位数字(2-6位)。由于它们每个包含3个字母,所以我能够像这样映射keyCode:

Math.floor(KeyCode- 65) / 3) + 2)。

Q:是否有一种方法可以在一行中完成,那么PQRS和WXYZ将适合这个解决方案吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-07-06 15:19:43

如果你真的需要它,那可能有用:

代码语言:javascript
复制
    Math.min(9, Math.floor(((KeyCode - (KeyCode < 83 ? 65 : 66)) / 3) + 2))

但你也必须确保KeyCode实际上是一封信。

您讨论的显而易见的解决方案要好得多,因为它具有可读性、可配置性和peform的速度都一样快:

代码语言:javascript
复制
    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;
    }
票数 5
EN

Stack Overflow用户

发布于 2016-07-12 00:42:48

地图是最明显的解决方案,我正在研究数学解

如果您正在寻找一个解析表达式,您可以将例如二次或指数函数与给定的键码到数字的映射相匹配:

代码语言:javascript
复制
// Exponential fit:
Math.floor(33.2 - 65.5 * Math.exp(-0.0115 * KeyCode));

或者,您可以通过比较操作符对键码> 82和键码> 89处出现的“异常”进行编码。

代码语言:javascript
复制
// Comparison:
Math.floor((KeyCode - 65 - (KeyCode > 82) - (KeyCode > 89)) / 3 + 2);

指数拟合的优点是键码项只出现一次,而后面的表达式则更易读。

示例实现/测试:

代码语言:javascript
复制
// 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));
}

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38180125

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档