【问题标题】:Execute function only by correct series of keys仅通过正确的一系列键执行功能
【发布时间】:2013-08-11 21:37:50
【问题描述】:

我并不完全是专业的,只是出于好奇,因为直到最近。所以我只有最基本的OF基础知识。

我目前的实验是这样的;您可以编写一系列按键,以执行特定功能,并且仅以正确的顺序执行吗?我说的就像一个游戏组合(即:著名的Konami Code彩蛋,由'↑'、'↑'、'↓'、'↓'、'←'、'→'、'←'、'→组成'、'B'、'A' 和 '开始')

例如,如果我使用“onkeydown”来执行此操作,它只会注册那个键,而不考虑之前或之后按下的任何键(或者我相信)。如果没有,我将不得不以某种方式记录之前发生的事情,然后......离开我的小鱼联盟。

有没有办法做这样的事情,希望更简单,更容易?请不要指望我知道很多,请不要使用 JQuery 或其他此类 js 库:D 用法。

您能以 Konami 代码为例进行编写吗?此模式的 js 字符代码为 38 38 40 40 37 39 37 39 66 65 13,将 Nintendo 的“Start”替换为“Enter”键。

【问题讨论】:

  • 我不确定你所说的 Konami Code 是什么意思,但这里有一个简单的例子:jsfiddle.net/KhK2j。它肯定可以更好地改进/组织并清理一下,但它现在可以工作:)
  • @lan 这看起来像他想要的 :)
  • @Ian 它工作得很好,谢谢!我猜是非正式接受的答案。但只是一件小事......可以设置一个计时器以在代码开始后完成代码吗? (比如说,当按下 ↑ 时,整个代码需要 10 秒才能完成或自动重置?或者甚至可能有 2 秒的限制来按下系列中的下一个键或自动重置?)
  • @Terrornado 好吧,这就是我将如何更全面地实现(仍然不完全是我会怎么做)你的第一个问题:jsfiddle.net/pP49S。您可以将finishTimerLength 更改为您希望等待它超时的毫秒数
  • 再次感谢!此外,正确的序列是否可以被混淆或隐藏起来,让任何阅读源脚本的人(至少是初学者)看不到?

标签: javascript keyboard keyboard-shortcuts


【解决方案1】:

这是一个有效的例子,如果你搞砸了,你可以简单地重新启动序列,它会原谅你。此外,如果您想要不同的组合,只需更改“键”即可。

<!DOCTYPE html>
<html>
<head>
<script>
var keys=[38,38,40,40,37,39,37,39,66,65];
var buff=[];
function collect(e){
  buff.push(e.keyCode);
  if(buff.length>keys.length){
    buff=buff.splice(1);
  }
  if(keys==buff.toString()){ 
    alert("Let's Play!");
  }
  e.preventDefault();
  e.stopPropagation();
}
</script>
</head>
<body>
<DIV contenteditable=true onkeydown="collect(event)">Click here to accept keystrokes</DIV>
</body>
</html>

我将密钥捕获放在 DIV 中,但您可以将其添加到 document.body 中,它会在页面上的所有位置进行监听。

【讨论】:

  • 如何将它添加到 document.body 而不仅仅是页面的一部分?
  • 只需将 onkeydown 事件放在 标签而不是
    标签中。
【解决方案2】:

只需听键并与某些东西进行比较:

var konami = [38,38,40,40,37,39,37,39,66,65],
    pushed = [];

document.onkeyup = function(e) {
    pushed.push(e.which);

    for (var i=0; i<pushed.length; i++) {
        if (pushed[i] != konami[i]) pushed = [];
    }

    if (pushed.length == konami.length) alert('konami code');
}

FIDDLE

【讨论】:

  • 感谢您的解释,所以我认为“pushed”正在与“konami”进行比较? 'if (pushed.length == konami.length) alert('konami code');'可以编辑为 'if (pushed.length == konami.length) { blah blah blah some script 我想在输入 konami 代码时发生 } ?
猜你喜欢
  • 2018-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-02
  • 1970-01-01
  • 1970-01-01
  • 2014-03-15
相关资源
最近更新 更多