如何检测何时移位+;在Javascript键控事件中按下NumKey?

如何检测何时移位+;在Javascript键控事件中按下NumKey?,javascript,Javascript,我已经编写了下面的代码,如果在键盘上按[Shift]键,则将其写入控制台“true”,否则将写入“false” <script> var el = document.getElementById("myInput"); el.addEventListener("keyup", function (e) { console.log(e.shiftKey); }); </script>

我已经编写了下面的代码,如果在键盘上按[Shift]键,则将其写入控制台“true”,否则将写入“false”

<script>
    var el = document.getElementById("myInput");
    el.addEventListener("keyup", function (e) {            
        console.log(e.shiftKey);            
    });
</script>

var el=document.getElementById(“myInput”);
el.addEventListener(“键控”,函数(e){
控制台日志(如shiftKey);
});
由于某些原因,当按10键上的数字触发事件时,此代码不起作用。如果我按住Shift键并按Numpad5,它将记录为false。我在Chrome、Firefox和IE中看到了同样的行为

我需要能够检测用户在按下10键上的数字时是否按住[Shift]


编辑:为了回应@sagar的评论,我专门用1-10键进行了测试,因为我希望我的用户按这个键。其他键将暂时忽略。我想知道用户何时按下数字1-10的键,以及是否按下了[Shift]。

您可以根据
e.getModifierState(“NumLock”)判断您的情况
状态
是否打开或关闭,因为当它打开时,您的
e.shiftKey
false
,如果它关闭时,您的
e.shiftKey
true

Num lock
进行测试

var el=document.getElementById(“myInput”);
el.addEventListener(“键控”,功能(e){
log(例如getModifierState(“NumLock”))
});

创建一个具有按键编号的对象,用户必须按该按键才能执行此操作:

const KeysEnum={
“输入”:16,
“转移”:13,
}
让按键按下={
};
常量HandleEventShift和Interpress=()=>{
console.log(“用户按Shift键回车”);
}
window.document.addEventListener('keydown',函数(事件){
按键按下[event.keyCode.toString()]=true;
if(按下键[KeysEnum.SHIFT]&按下键[KeysEnum.ENTER]){
HandleEventShift和Interpress();
按键按下[KeysEnum.SHIFT]=false;
按下键[KeysEnum.ENTER]=false;
}

});这是一个有点特殊的情况,特殊的键+数字

钥匙事件包含一个条目
shiftKey
ctrlKey

要处理右数字键盘和顶部数字键的数字,我们可以测试
event.code
是否包含数字

document.addEventListener('keydown',函数(e){
/*如果shift键按下*/
如果(如换档键){
/*测试e.code是否包含数字*/
如果(/\d/.test(e.code)){
控制台日志(“移位键+编号”);
}  
}

},false)
不幸的是,这似乎是Windows操作系统的一个限制,我不知道为什么会存在这个限制。我看到过在其他环境中开发人员遇到同样问题的StackOverflow示例

现在,这里有一个似乎有效的解决方案。我不喜欢它,我想我不应该这样做,但这是我能找到的最好的东西

我发现,当NumLock打开时,如果我按住[Shift]并按下[Num5],在[Num5]的keydown事件之前会触发[Shift]的keydup事件。在我的工作站上,如果我抓取这两个事件的时间戳,它们将是5ms或更少的部分。我只编写了检查这两个时间戳的代码,如果它们相隔10毫秒或更短,我的应用程序会响应输入,因为用户按住[Shift]并按下[Num5]


由于此代码在浏览器中运行,我认为其他平台不会有此限制,它仍然会检查事件以指示[Shift]已按下。

使用其他键(而不是num)代码工作正常?测试代码时,它会按照您的要求工作。也许键盘的响应方式有所不同?它是带功能钥匙锁的笔记本电脑还是其他什么?尝试使用不同的键盘?@BA_Webimax我想你是对的,在我的键盘上它甚至没有记录任何东西,因为numpad上没有“基于移位”的键(或者至少我是这么认为的),我认为在num lock打开/关闭时,有某种标志打开/关闭。这会产生意想不到的行为。当我在笔记本电脑上测试时,在这两种情况下打开/关闭num lock都会导致结果变化。如果Num Lock off,则记录为真,否则为假。此外,在分析日志时,我发现如果打开Num Lock并按shift+Num pad(仅数字),则将有两个事件。一个用于shift键,另一个用于数字键。可能是操作系统级对num-lock、num-pad和shift键的解释。我没想到NumLock和它有任何关系。但是,我仍然需要知道是否按下了[Shift]。有什么方法可以做到这一点吗?是的,你说得对,我花了一些时间来研究这个问题,我发现当数字锁处于活动状态时,95到105之间的
e.codeKey
即使使用
e.shiftKey
也总是返回false。很抱歉,我没有找到工作的方法。我突然想到要尝试这样的方法。这听起来像是很多额外的工作,如果用户在按住键的同时用鼠标移开焦点,它就会中断。我不理解使用keyCode来检测移位而不是使用e.shiftKey的问题。我使用它作为带有枚举和击键对象的快捷键。工作很好:)你使用shiftKey的意图是什么?你能详细说明你想做什么吗?我的意图很简单:我希望程序在按住[Shift]键的情况下,在按下一个键时执行一个动作,否则执行另一个动作。这不是答案。在我的问题中,我已经表明我正在查看e.shiftKey的值,即使按下[Shift]键,它也会显示为false。看起来这和NumLock有关。这不是答案,而是你问题的有效解决方案。这不是我问题的有效解决方案,因为它取决于