检查一个键是否closures?

有没有一种方法来检测一个键是否在JavaScript中closures?

我知道“keydown”事件,但这不是我所需要的。 按下一段时间后,我希望能够检测是否仍然按下。

PS最大的问题似乎是,经过一段时间的关键开始重复,像恶魔发射keydown和keyup事件。 希望只有一个简单的isKeyDown(key)函数,但如果不是,那么这个问题将需要克服/解决。

有没有一种方法来检测一个键是否在JavaScript中closures?

不。 唯一的可能性是监视每个keyupkeydown并记住。

经过一段时间后,钥匙开始重复,发射像一个恶魔keydown和keyup事件。

它不应该。 你肯定会得到keypress重复,在许多浏览器中,你也会得到重复的keydown ,但如果keyup重复,这是一个错误。

不幸的是,它并不是一个完全没有听说过的bug:在Linux,Chromium和Firefox(当它在GTK +中运行时,它在Ubuntu等stream行的发行版中)都会为持有的密钥生成重复的keyup-keypress-keydown序列,这是无法与真正快速敲击钥匙的人区分开来的。

除了使用keyupkeydown监听器来追踪关键字何时closures和备份之外,实际上还有一些属性告诉你某些关键是否closures。

 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*/} } 

这在所有浏览器生成的事件对象(如keydownkeyupkeypress事件对象)上都可用,所以您不必使用mousemove。

我试图用document.createEvent('KeyboardEvent')document.createEvent('KeyboardEvent')生成我自己的事件对象,并寻找e.shiftKey等,但我没有运气。

我在Mac上使用Chrome 17

我的解决scheme

 var keys = []; window.onkeyup = function(e) {keys[e.keyCode]=false;} window.onkeydown = function(e) {keys[e.keyCode]=true;} 

我现在可以通过检查来检查脚本中的其他任何按键是否被按下

 keys["code of the key"] 

如果这是真的,则按下该键。

我不相信有什么像isKeyDown函数,但你可以写自己的。

基本上,创build一个数组,其长度是您要监视的键的数量。 然后使用文档/页面/控件keyUp和keyDown事件,使用该键的状态更新数组。

然后编写一个函数,检查某个键是否closures,并返回一个布尔值。

 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事件(及其双关键)是你得到的所有信息。 重复连接相当牢固地进入操作系统,应用程序没有太多机会向BIOS询问密钥的实际状态。

你可以做什么,也许不得不如果你需要得到这个工作,就是以编程方式去反弹键。 从本质上讲,你可以自己评估keydownkeyup但是如果在最后一个keydown之后发生的速度太快,你可以忽略一个keyup事件…或者实际上,你应该延迟你的keyup响应足够长的时间,以确保没有另一个keydown事件像keyup 0.25秒。

这将涉及使用计时器活动,并logging以前事件的毫秒时间。 我不能说这是一个非常有吸引力的解决scheme,但是…

 /* 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都被使用。

看看这个答案,并使用onkeyuponkeydown 。 这里是关于这些事件的更具体的信息。

 $('#mytextbox').keydown(function (e) { if (e.keyCode == 13) { if (e.altKey) { alert("alt is pressed"); } } }); 

如果按Alt + Enter,您将看到警报。