2017-07-16 42 views
2

我知道如何捕捉keyup和keydown事件。如何查看修饰键是否被按下而不捕捉keydown事件?

我希望我的程序能够查看哪些修饰键(例如:元键,控制键,alt键等)当前被按住,即使程序没有观察到这些键的按键事件。

我知道点击事件和其他事件可以告诉我哪些修饰键被按下时,但我的程序不能等待一个发生。

我需要我的程序定期检查修饰键(比如每隔100ms)。我会如何去做这件事?如果有帮助,我的程序使用jQuery。

+1

,除非你使用一个事件监听器无法做到的。 –

+1

你的意思是我需要一个实际的事件(而不是一个模拟的)才能被解雇,以便知道哪些修饰键被按下了? – Sophtware

+2

如果下面的答案是不可接受的,我会说你很可能有X Y的问题。不要告诉我们你想要做什么*,而要解释你实际上试图解决的问题。也就是说,你为什么想要这样做?可能有更好的方法。 – DelightedD0D

回答

3

您可以将这些值存储在一个变量中,并随时检查它们。事件侦听器将是必要的,当然,以更新变量:

// assume no hot key is pressed 
 

 
var object = { 
 
    ctrlKey: false, 
 
    altKey: false, 
 
    shiftKey: false 
 
}; 
 

 
// update whenever a keydown or keyup event is fired 
 

 
document.addEventListener("keydown", function(e) { 
 
    for(var key in object) { 
 
    if(object.hasOwnProperty(key)) 
 
     object[key] = e[key]; // update the object from the event e 
 
    } 
 
}); 
 

 
document.addEventListener("keyup", function(e) { 
 
    for(var key in object) { 
 
    if(object.hasOwnProperty(key)) 
 
     object[key] = e[key]; 
 
    } 
 
}); 
 

 
// testing example: 
 

 
function check() { 
 
    console.log("Checking:"); 
 
    console.log("Alt key:", object.altKey); 
 
    console.log("Ctrl key:", object.ctrlKey); 
 
    console.log("Shift key:", object.shiftKey); 
 
} 
 

 
setInterval(check, 1000); // calling check every second without waiting for an event to occur

+0

不幸的是,问题是我的程序不能从你的第一行做出假设。它不知道修饰键是否最初被按下。 – Sophtware

+1

@Sophtware程序没有这样的假设,它只是在未按下按键的情况下开始。除非您的用户在按住修饰键的同时加载页面,否则这应该起作用 – DelightedD0D

+0

@Sophtware嗯,我认为没有其他办法。模拟事件似乎并不知道是否按下了热键。 –