Javascript 检查钥匙是否已关闭?
有没有一种方法可以检测JavaScript中的键当前是否已关闭 我知道“按键”事件,但那不是我需要的。按键后的一段时间,我希望能够检测到它是否仍被按下Javascript 检查钥匙是否已关闭?,javascript,input,keyboard,Javascript,Input,Keyboard,有没有一种方法可以检测JavaScript中的键当前是否已关闭 我知道“按键”事件,但那不是我需要的。按键后的一段时间,我希望能够检测到它是否仍被按下 另外,最大的问题似乎是,在一段时间后,钥匙开始重复,像恶魔一样触发按键和按键事件。希望只有一个简单的isKeyDown(key)函数,但如果没有,那么这个问题需要解决。以前有人问过这类问题(尽管我现在没有看到任何明显的重复) 我认为答案是keydown事件(以及它的孪生keydup)就是您所获得的所有信息。重复是非常牢固地连接到操作系统中的,应用
另外,最大的问题似乎是,在一段时间后,钥匙开始重复,像恶魔一样触发按键和按键事件。希望只有一个简单的isKeyDown(key)函数,但如果没有,那么这个问题需要解决。以前有人问过这类问题(尽管我现在没有看到任何明显的重复) 我认为答案是
keydown
事件(以及它的孪生keydup
)就是您所获得的所有信息。重复是非常牢固地连接到操作系统中的,应用程序没有多少机会查询BIOS中密钥的实际状态
您可以做的,如果您需要让它工作,您可能必须做的是以编程方式取消键反弹。基本上,您可以自己评估keydown
和keydup
,但如果keydup
事件在上一次keydown
之后发生得太快,则忽略该事件。。。或者本质上,您应该将对keyup
的响应延迟足够长的时间,以确保不会发生另一个keyup
事件,比如0.25秒的keyup
这将涉及使用计时器活动,并记录以前事件的毫秒时间。我不能说这是一个非常吸引人的解决方案,但是…我不相信有任何东西像isKeyDown函数,但是你可以自己编写 基本上,创建一个数组,其长度是要监视的键数。然后使用documents/pages/controls键向上和键向下事件,使用该键的状态更新数组 然后编写一个函数,检查某个键是否已关闭并返回布尔值
var keyEnum = { W_Key:0, A_Key:1, S_Key:2, D_Key:3 };
var keyArray = new Array(4);
function onKeyDown()
{
// Detect which key was pressed
if( key == 'w' )
keyArray[keyEnum.W_Key] = true;
// Repeat for each key you care about...
}
function onKeyUp()
{
// Detect which key was released
if( key == 'w' )
keyArray[keyEnum.W_Key] = false;
// Repeat for each key you care about...
}
function isKeyDown(key)
{
return keyArray[key];
}
这应该能实现你想要的
有没有一种方法可以检测JavaScript中的键当前是否已关闭
没有。唯一的可能是监视每个keypup
和keypdown
并记住
一段时间后,按键开始重复,像恶魔一样触发按键向下和按键向上事件
不应该。你肯定会重复使用keypress
,在许多浏览器中,你也会重复使用keydown
,但如果keydup
重复,那就是一个bug
不幸的是,这并不是一个完全前所未闻的错误:在Linux、Chromium和Firefox上(当它在GTK+下运行时,它在流行的发行版(如Ubuntu)中)都会为持有的键生成重复的keypup-keypress-keypdown序列,这与某人快速敲击键是不可能区分的
$('#mytextbox').keydown(function (e) {
if (e.keyCode == 13) {
if (e.altKey) {
alert("alt is pressed");
}
}
});
如果按alt+enter键,您将看到警报。除了使用
keyup
和keydown
侦听器跟踪is键何时向下和向上移动外,实际上还有一些属性可以告诉您某些键是否向下
window.onmousemove = function (e) {
if (!e) e = window.event;
if (e.shiftKey) {/*shift is down*/}
if (e.altKey) {/*alt is down*/}
if (e.ctrlKey) {/*ctrl is down*/}
if (e.metaKey) {/*cmd is down*/}
}
这在所有浏览器生成的事件对象上都可用,例如来自keydown
、keydup
和keypress
的对象,因此您不必使用mousemove
我试图用document.createEvent('KeyboardEvent')
和document.createEvent('KeyboardEvent')
生成我自己的事件对象,并寻找e.shiftKey
等等,但我没有运气
我在Mac上使用Chrome 17以下代码是我正在使用的:
/*
Tracks what keys are currently down on the keyboard
*/
function keyboard_module(onUpdate){
var kb = {};
var unicode_mapping = {};
document.onkeydown = function(e){
var unicode=e.charCode? e.charCode : e.keyCode
var key = getKey(unicode);
kb[key] = true;
if(onUpdate){
onUpdate(kb);
}
}
document.onkeyup = function(e){
var unicode=e.charCode? e.charCode : e.keyCode
var key = getKey(unicode);
delete kb[key];
if(onUpdate){
onUpdate(kb);
}
}
function getKey(unicode){
if(unicode_mapping[unicode]){
var key = unicode_mapping[unicode];
}else{
var key= unicode_mapping[unicode] = String.fromCharCode(unicode);
}
return key;
}
return kb;
}
function testing(kb){
console.log('These are the down keys', kb);
}
var keyboard = keyboard_module(testing);
....
//somewhere else in the code
if(keyboard['K']){/*do something special */}
var altKeyDownCount = 0;
window.onkeydown = function (e) {
if (!e) e = window.event;
if (e.altKey) {
altKeyDownCount++;
if (30 < altKeyDownCount) {
$('.key').removeClass('hidden');
altKeyDownCount = 0;
}
return false;
}
}
window.onkeyup = function (e) {
if (!e) e = window.event;
altKeyDownCount = 0;
$('.key').addClass('hidden');
}
var-altKeyDownCount=0;
window.onkeydown=函数(e){
如果(!e)e=window.event;
如果(如altKey){
altKeyDownCount++;
如果(30
当用户按住Alt键一段时间(约2秒)时,会出现一组标签(class='key hidden')。释放Alt键时,标签将消失。jQuery和引导都使用。我的解决方案:
var pressedKeys = {};
window.onkeyup = function(e) { pressedKeys[e.keyCode] = false; }
window.onkeydown = function(e) { pressedKeys[e.keyCode] = true; }
我现在可以通过检查来检查脚本中是否有任何键被按下
pressedKeys["code of the key"]
如果这是真的,按键被按下。我知道这是一个非常老的问题,但是有一个非常轻量级的(~5Kb)JavaScript库,它可以有效地“修补”使用DOM API时键盘事件处理程序不一致的触发 图书馆在建 下面是一个操作代码示例,它通过更改设置侦听器的键就可以很好地满足我的需要:
kd.P.down(function () {
console.log('The "P" key is being held down!');
});
kd.P.up(function () {
console.clear();
});
// This update loop is the heartbeat of Keydrown
kd.run(function () {
kd.tick();
});
我已经在客户端JavaScript中加入了Key溺水,以便在我正在编写的一个红灯绿灯游戏中实现适当的暂停动画。您可以查看整个游戏。(注意:如果您将来阅读此文章,游戏应该是代码完整且可玩的:-D!)
我希望这能有所帮助。最后在这里检查浏览器中是否已经内置了一些东西,但似乎没有。这是我的解决方案(与Robert的答案非常相似):
然后,您可以检查是否使用键按下了键。
is\u key\u down('ArrowLeft')
我扫描了上面的答案,建议的键按下
/键向上
方法仅在特殊情况下有效。如果用户alt键移开,或使用按键手势打开新的浏览器窗口或选项卡,则会注册一个向下键
,这很好,因为此时无法判断该键是web应用程序正在监视的内容,还是标准的浏览器或操作系统快捷方式。回到浏览器页面,它仍然会认为密钥被持有,尽管它是同时被释放的。或者,当用户用鼠标切换到另一个选项卡或应用程序时,只需按住某个键,然后将其释放到页面之外
国防部
"use strict";
const is_key_down = (() => {
const state = {};
window.addEventListener('keyup', (e) => state[e.key] = false);
window.addEventListener('keydown', (e) => state[e.key] = true);
return (key) => state.hasOwnProperty(key) && state[key] || false;
})();
window.onkeyup = up;
window.onkeydown = down;
function up(e) {
if (e.key === 'F5') return; // if you want this to work also on reload with F5.
window.onkeyup = null;
window.onkeyup = null;
if (e.key === 'Control') {
alert('Control key was released. You must have held it down while opening the file, so we will now load the file into the editor.');
}
}
function down() {
window.onkeyup = null;
window.onkeyup = null;
}
if (KeyPressing.isKeyPressed(13)){ //Pass the keyCode integer as parameter
console.log('The Enter key is being pressed!')
}else{
console.log('The Enter key is NOT being pressed!')
}
setInterval(() => {
if (KeyPressing.isKeyPressed(13)){
console.log('The Enter key is being pressed!')
}else{
console.log('The Enter key is NOT being pressed!')
}
}, 1000) //Update data every 1000ms (1 second)