检查钥匙是否关闭?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了检查钥匙是否关闭?相关的知识,希望对你有一定的参考价值。
有没有办法检测javascript当前是否存在关键字?
我知道“keydown”事件,但这不是我需要的。按键后一段时间,我希望能够检测到它是否仍然按下。
P. S.最大的问题似乎是,经过一段时间后,密钥开始重复,启动keydown和keyup事件,如恶魔。希望只有一个简单的isKeyDown(key)函数,但如果没有,则需要克服/解决这个问题。
有没有办法检测JavaScript当前是否存在关键字?
不。唯一的可能性是监测每个keyup
和keydown
并记住。
一段时间后,密钥开始重复,启动keydown和keyup事件,如恶魔。
它不应该。你肯定会得到keypress
重复,并在许多浏览器中你也会重复keydown
,但如果keyup
重复,这是一个错误。
不幸的是,它不是一个完全闻所未闻的错误:在Linux,Chromium和Firefox上(当它在GTK +下运行时,它在流行的发行版中,如Ubuntu)都会为持有的密钥生成重复的keyup-keypress-keydown序列,这是不可能区别于真正快速锤击钥匙的人。
我知道这是一个非常古老的问题,但是有一个非常轻量级的(〜.5Kb)JavaScript库可以有效地“修补”使用DOM API时键盘事件处理程序的不一致触发。
图书馆是Keydrown。
这是通过更改设置监听器的键来完成我的目的的操作代码示例:
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();
});
我已经将Keydrown整合到我的客户端JavaScript中,以便在我正在编写的红灯绿灯游戏中获得适当的暂停动画。您可以查看整个游戏here。 (注意:如果您将来阅读此内容,游戏应该是代码完整且可玩的:-D!)
我希望这有帮助。
我扫描了上述答案,建议的keydown
/ keyup
方法仅在特殊情况下才有效。如果用户使用alt-tabs,或使用键手势打开新的浏览器窗口或选项卡,那么将注册keydown
,这很好,因为此时无法判断该键是否是Web应用程序的内容监控,或者是标准的浏览器或操作系统快捷方式。回到浏览器页面,它仍然认为密钥被保留,虽然它在此期间被释放。或者只是保持一些键,同时用户使用鼠标切换到另一个选项卡或应用程序,然后在我们的页面外部发布。
可以通过Shift
等监视修改键(mousemove
等),假设在回退时预期存在至少一个鼠标交互,这种情况经常发生。
对于大多数所有其他键(除了修饰符,Tab
,Delete
,但包括Space
,Enter
),监视keypress
将适用于大多数应用程序 - 按下的键将继续触发。由于keypress
射击的周期性,重置密钥有一些延迟。基本上,如果keypress
不继续射击,那么可以排除大部分键。虽然我没有探讨如何处理Tab
和Backspace
,但这与修饰符相结合是非常不透明的。
我确信那里有一些库可以抽象出这个DOM的弱点,或者也许是一些DOM标准的变化可以解决它,因为这是一个相当古老的问题。
$('#mytextbox').keydown(function (e) {
if (e.keyCode == 13) {
if (e.altKey) {
alert("alt is pressed");
}
}
});
如果按alt + Enter,您将看到警报。
除了使用keyup
和keydown
监听器来跟踪键何时关闭和备份,实际上还有一些属性可以告诉您某些键是否已关闭。
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
,keyup
和keypress
的事件对象,因此您不必使用mousemove。
我尝试用document.createEvent('KeyboardEvent')
和document.createEvent('KeyboardEvent')
生成我自己的事件对象,并寻找e.shiftKey
等,但我没有运气。
我在Mac上使用Chrome 17
我的解决方案
var keys = {};
window.onkeyup = function(e) { keys[e.keyCode] = false; }
window.onkeydown = function(e) { keys[e.keyCode] = true; }
我现在可以检查是否在脚本中的任何其他位置按下了任何键
keys["code of the key"]
如果是,则按下该键。
我不相信有任何像isKeyDown函数,但你可以编写自己的函数。
基本上,创建一个数组,其长度是您要监视的键数。然后使用documents / pages / controls keyUp和keyDown事件,使用该键的状态更新数组。
然后编写一个函数来检查某个键是否关闭并返回一个bool。
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];
}
那应该完成你想要的。
其他人之前已经问过这样的问题(虽然我现在没有看到任何明显的欺骗)。
我认为答案是keydown
事件(以及它的双胞胎keyup
)都是你获得的信息。重复操作非常牢固地连接到操作系统,并且应用程序没有太多机会向Bios查询密钥的实际状态。
如果你需要让它工作,你可以做什么,也许还有,就是以编程方式去除反弹键。基本上,你可以自己评估keydown
和keyup
但忽略一个keyup
event如果它在最后一个keydown
之后发生得太快......或者基本上,你应该延迟你对keyup
的反应足够长以确保没有其他keydown
事件跟随类似的东西0.25秒的keyup
。
这将涉及使用计时器活动,并记录先前事件的毫秒时间。我不能说这是一个非常有吸引力的解决方案,但......
/*
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');
}
当用户持续按住Alt键一段时间(约2秒)时,会出现一组标签(class ='key hidden')。释放Alt键时,标签消失。使用jQuery和Bootstrap。
结束此处以检查浏览器是否已内置了某些内容,但似乎没有。这是我的解决方案(非常类似于Robert的答案):
"use strict";
let is_key_down = (() => {
let 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;
})();
然后,您可以使用is_key_down('ArrowLeft')
检查是否按下了某个键。
看看this的答案,并使用onkeyup
和onkeydown
。 Here是关于这些事件的更具体的信息。
以上是关于检查钥匙是否关闭?的主要内容,如果未能解决你的问题,请参考以下文章
关于js----------------分享前端开发常用代码片段