在javascript中检测按键的最简单方法

IT技术 javascript jquery html keyboard easeljs
2021-01-20 15:00:04

我有一个用 javascript 编写游戏的想法(我将使用 EaselJS 制作它),我必须检测按键。在互联网上环顾四周后,我看到了很多建议(使用 window.onkeypress、使用 jQuery 等),但对于几乎每个选项都有一个反驳。你们有什么建议?为此使用 jQuery 听起来很容易,但我几乎没有使用该库的经验(而且我也不是 javascript 的资深人士)所以我宁愿避免它。如果 jQuery 是最好的选择,有人可以举一个很好的例子(解释会很棒)如何做到这一点?

我想这被问了很多,但我找不到任何明确的答案。提前致谢!

5个回答

使用普通的 Javascript,最简单的是:

document.onkeypress = function (e) {
    e = e || window.event;
    // use e.keyCode
};

但是有了这个,您只能为事件绑定一个处理程序。

此外,您可以使用以下内容将多个处理程序潜在地绑定到同一事件:

addEvent(document, "keypress", function (e) {
    e = e || window.event;
    // use e.keyCode
});

function addEvent(element, eventName, callback) {
    if (element.addEventListener) {
        element.addEventListener(eventName, callback, false);
    } else if (element.attachEvent) {
        element.attachEvent("on" + eventName, callback);
    } else {
        element["on" + eventName] = callback;
    }
}

在任何一种情况下,keyCode浏览器之间都不一致,因此需要检查和找出更多内容。请注意e = e || window.event- 这是 Internet Explorer 的正常问题,将事件放入window.event而不是将其传递给回调。

参考:

使用 jQuery:

$(document).on("keypress", function (e) {
    // use e.which
});

参考:

除了 jQuery 是一个“大型”库之外,jQuery 确实有助于解决浏览器之间的不一致问题,尤其是窗口事件……这是不可否认的。希望很明显,我为您的示例提供的 jQuery 代码更优雅、更短,但仍能以一致的方式完成您想要的操作。您应该能够相信e(事件)和e.which(键代码,用于了解按下了哪个键)是准确的。在普通的 Javascript 中,除非您完成 jQuery 库内部所做的一切,否则很难知道。

请注意,有一个keydown事件,与keypress. 您可以在此处了解有关它们的更多信息:onKeyPress Vs。onKeyUp 和 onKeyDown

至于建议使用什么,如果您准备学习该框架,我肯定会建议使用 jQuery。同时,我会说你应该学习Javascript的语法、方法、特性以及如何与DOM交互。一旦你理解了它是如何工作的以及发生了什么,你应该更习惯使用 jQuery。对我来说,jQuery 使事情更加一致并且更加简洁。最后,它是 Javascript,并包装了语言。

jQuery 非常有用的另一个例子是 AJAX。浏览器与 AJAX 请求的处理方式不一致,因此 jQuery 将其抽象化,因此您不必担心。

以下内容可能有助于您做出决定:

如果您想要跨浏览器兼容性,您可能还需要接触attachEvent()(顺便说一下,而不是我的反对票)。
2021-03-21 15:00:04
看起来很扎实,谢谢解释!我想我会使用 jQuery,我一直在研究它,如果我学会使用它,我想无论如何它都会使我受益。
2021-03-25 15:00:04
我认为值得注意的是这keypress在我的情况下不起作用,所以我不得不使用keydown.
2021-03-26 15:00:04
@DavidThomas 我不担心否决票,我宁愿得到正确的观点。答案是不是更好?我很乐意添加/更改任何内容
2021-04-04 15:00:04
@WilliamJones 那是因为它已被弃用!我刚刚检查了文档,并感到惊讶:developer.mozilla.org/en-US/docs/Web/API/Document/...
2021-04-08 15:00:04

KEYPRESS(回车键)
在代码片段内部单击,然后按回车键。

香草

document.addEventListener("keypress", function(event) {
  if (event.keyCode == 13) {
    alert('hi.');
  }
});

香草速记(ES6)

this.addEventListener('keypress', event => {
  if (event.keyCode == 13) {
    alert('hi.')
  }
})

jQuery

$(this).on('keypress', function(event) {
  if (event.keyCode == 13) {
    alert('hi.')
  }
})
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

jQuery 经典

$(this).keypress(function(event) {
  if (event.keyCode == 13) {
    alert('hi.')
  }
})
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

jQuery 速记(ES6)

$(this).keypress((e) => {
  if (e.keyCode == 13)
    alert('hi.')
})
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

更短(ES6)

$(this).keypress(e=>
  e.which==13?
  alert`hi.`:null
)
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

由于一些要求,这里有一个解释:

我重写了这个答案,因为随着时间的推移,事情已经被弃用了,所以我更新了它,因为评论中的一些人说它太多了“bla-bla”。这不是关于“keydown”,而是关于“keypress”。所以一些像“Esc”这样的非字符键不应该这样工作。

this当文档准备好时,为了简洁起见,我过去常常关注结果中的窗口范围,但这不是必需的。

推荐使用:
.which.keyCode方法实际上被废弃了,所以我会建议.code,但我个人仍然使用键代码为性能更快,只为我计数。jQuery 经典版本.keypress()并未像某些人所说的那样正式弃用,但它们不再受青睐,.on('keypress')因为它具有更多功能(实时状态、多个处理程序等)。'keypress'Vanilla 版本中事件也已弃用。今天人们应该更喜欢beforeinputkeydownkeyup

性能:
越快越好。这就是为什么我更喜欢.keyCode即使它被认为已弃用(在大多数情况下)。不过,这一切都取决于您(Promise 2020)。

性能测试

关于document.addEventListener("keypress", function(event):好的,但为什么我不能“捕获”[Esc] 键?
2021-03-27 15:00:04
因为 [Esc] 键应该与"keydown". 我说它已被弃用的原因......仔细阅读。最好keypress用于 ASCII 字符(D、L、%、1、Ä 等)和keydown非字符键(箭头键、Esc、Alt、Ctrl、Page up/down 等)。随着时间的推移,事情可能会发生变化......
2021-03-27 15:00:04
谢谢,@ Thielicious。我想我已经做到了。但是我也没有看到我上次给你的回复!至少这里没有,而且我当然没有删除它!似乎是其他人这样做了,或者看不到他们(听起来很奇怪)!(此外,如果我删除我的消息,你会回复他们吗?无论如何,再次感谢!(我希望这能得到传达!)
2021-04-10 15:00:04

使用event.key和现代JS!

没有数字代码了。您可以直接使用"Enter""ArrowLeft""r"或任何键名,使您的代码更具可读性。

注意:旧的替代方案 (.keyCode.which) 已弃用。

document.addEventListener("keypress", function onEvent(event) {
    if (event.key === "ArrowLeft") {
        // Move Left
    }
    else if (event.key === "Enter") {
        // Open Menu...
    }
});

Mozilla 文档

支持的浏览器

箭头键实际上是“ArrowUp”、“ArrowDown”、“ArrowRight”、“ArrowLeft”
2021-03-22 15:00:04
2021-03-25 15:00:04
为什么我不能“捕获”这些箭头键或 [Esc] 键?
2021-03-28 15:00:04

有几种方法可以处理;Vanilla JavaScript 可以很好地做到这一点:

function code(e) {
    e = e || window.event;
    return(e.keyCode || e.which);
}
window.onload = function(){
    document.onkeypress = function(e){
        var key = code(e);
        // do something with key
    };
};

或者更结构化的处理方式:

(function(d){
    var modern = (d.addEventListener), event = function(obj, evt, fn){
        if(modern) {
            obj.addEventListener(evt, fn, false);
        } else {
            obj.attachEvent("on" + evt, fn);
        }
    }, code = function(e){
        e = e || window.event;
        return(e.keyCode || e.which);
    }, init = function(){
        event(d, "keypress", function(e){
            var key = code(e);
            // do stuff with key here
        });
    };
    if(modern) {
        d.addEventListener("DOMContentLoaded", init, false);
    } else {
        d.attachEvent("onreadystatechange", function(){
            if(d.readyState === "complete") {
                init();
            }
        });
    }
})(document);
好的,但为什么我不能“捕获”[Esc] 键?
2021-04-01 15:00:04

不要过于复杂。

  document.addEventListener('keydown', logKey);
    function logKey(e) {
      if (`${e.code}` == "ArrowRight") {
        //code here
      }
          if (`${e.code}` == "ArrowLeft") {
        //code here
      }
          if (`${e.code}` == "ArrowDown") {
        //code here
      }
          if (`${e.code}` == "ArrowUp") {
        //code here
      }
    }
恭喜!这个答案应该得到所有的积分!除了是唯一一个可以“捕获”箭头键和 [Esc] 键(所有早期代码都失败的地方(至少对我而言))之外,如果实际上捕获了所有键盘键,甚至状态键!!
2021-03-15 15:00:04
虽然这个答案可能不是 OP 正在寻找的,因为它仅与按键有关(即使按键一般已被弃用,并且诸如 keydown/keyup/beforeinput 之类的新事件派上用场,而且这个问题已有 8 年历史了),但我仍然可能添加 keydown 在您按住并不总是很好的键时会继续触发事件。所以相反,添加event.repeat = false以防止这种情况。
2021-04-01 15:00:04
还有一件事:如何删除此事件侦听器?我尝试过document.removeEventListener(),但它不起作用:侦听器继续处于活动状态,即键盘继续受到监视!
2021-04-11 15:00:04