检查一个键是否closures?
有没有一种方法来检测一个键是否在JavaScript中closures?
我知道“keydown”事件,但这不是我所需要的。 按下一段时间后,我希望能够检测是否仍然按下。
PS最大的问题似乎是,经过一段时间的关键开始重复,像恶魔发射keydown和keyup事件。 希望只有一个简单的isKeyDown(key)函数,但如果不是,那么这个问题将需要克服/解决。
有没有一种方法来检测一个键是否在JavaScript中closures?
不。 唯一的可能性是监视每个keyup
和keydown
并记住。
经过一段时间后,钥匙开始重复,发射像一个恶魔keydown和keyup事件。
它不应该。 你肯定会得到keypress
重复,在许多浏览器中,你也会得到重复的keydown
,但如果keyup
重复,这是一个错误。
不幸的是,它并不是一个完全没有听说过的bug:在Linux,Chromium和Firefox(当它在GTK +中运行时,它在Ubuntu等stream行的发行版中)都会为持有的密钥生成重复的keyup-keypress-keydown序列,这是无法与真正快速敲击钥匙的人区分开来的。
除了使用keyup
和keydown
监听器来追踪关键字何时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*/} }
这在所有浏览器生成的事件对象(如keydown
, keyup
和keypress
事件对象)上都可用,所以您不必使用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询问密钥的实际状态。
你可以做什么,也许不得不如果你需要得到这个工作,就是以编程方式去反弹键。 从本质上讲,你可以自己评估keydown
和keyup
但是如果在最后一个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都被使用。
看看这个答案,并使用onkeyup
和onkeydown
。 这里是关于这些事件的更具体的信息。
$('#mytextbox').keydown(function (e) { if (e.keyCode == 13) { if (e.altKey) { alert("alt is pressed"); } } });
如果按Alt + Enter,您将看到警报。