我正在尝试开发一个JavaScript游戏引擎,我遇到了这个问题:
问题是,当我按下右键然后按空格键时,角色跳跃然后停止移动.
我使用该keydown功能来按下键.如何检查是否一次按下多个键?
我想在React中的div上使用keyDown事件.我做:
componentWillMount() {
document.addEventListener("keydown", this.onKeyPressed.bind(this));
}
componentWillUnmount() {
document.removeEventListener("keydown", this.onKeyPressed.bind(this));
}
onKeyPressed(e) {
console.log(e.keyCode);
}
render() {
let player = this.props.boards.dungeons[this.props.boards.currentBoard].player;
return (
<div
className="player"
style={{ position: "absolute" }}
onKeyDown={this.onKeyPressed} // not working
>
<div className="light-circle">
<div className="image-wrapper">
<img src={IMG_URL+player.img} />
</div>
</div>
</div>
)
}
Run Code Online (Sandbox Code Playgroud)
它工作正常,但我想在React风格中做得更多.我试过了
onKeyDown={this.onKeyPressed}
Run Code Online (Sandbox Code Playgroud)
在组件上.但它没有反应.我记得它适用于输入元素.
Codepen:http://codepen.io/lafisrap/pen/OmyBYG
我该怎么做?
我正在构建一个应用程序,其中所有键输入必须由Windows本身处理.
我为每个控件设置了tabstop为false,除了一个面板之外,女巫可以抓住焦点(但我不知道它是否有效).
我将KeyPreview设置为true,我正在处理此窗体上的KeyDown事件.
我的问题是,有时箭头键不再响应:
当我只按箭头键时,不会触发keydown事件.
如果我按下带有控件修饰符的箭头键,则会触发keydown事件.
你知道我的箭头键突然停止发射事件的原因吗?
我需要弄清楚哪个字符被输入到jQuery keydown函数调用的处理程序中的文本字段中.key.which只给我键码,但我需要弄清楚哪个ASCII字符key代表.我该怎么做呢?
我正在为Mac OSX开发一个打字导师应用程序,即使应用程序没有被关注,也需要将键击转发给它.
有没有办法让系统向应用程序转发击键,可能是通过NSDistributedNotificationCenter?我用谷歌搜索了自己,并且找不到答案......
编辑: 下面的示例代码.
感谢@NSGod指出我正确的方向 - 我最终使用addGlobalMonitorForEventsMatchingMask:handler:方法添加了一个全局事件监视器,它工作得非常好.为了完整起见,我的实现看起来像这样:
// register for keys throughout the device...
[NSEvent addGlobalMonitorForEventsMatchingMask:NSKeyDownMask
handler:^(NSEvent *event){
NSString *chars = [[event characters] lowercaseString];
unichar character = [chars characterAtIndex:0];
NSLog(@"keydown globally! Which key? This key: %c", character);
}];
Run Code Online (Sandbox Code Playgroud)
对我来说,棘手的部分是使用块,所以我会给出一些描述,以防它帮助任何人:
关于上面代码的注意事项是它是NSEvent上的所有单个方法调用.该块作为参数直接提供给函数.你可以认为它有点像内联委托方法.仅仅因为这需要一段时间才能让我沉沦,我将在这里一步一步地完成它:
[NSEvent addGlobalMonitorForEventsMatchingMask:NSKeyDownMask
Run Code Online (Sandbox Code Playgroud)
这第一位没问题.您在NSEvent上调用类方法,并告诉它您要监视哪个事件,在本例中为NSKeyDownMask.一个支持的事件类型的面罩的名单,可以发现在这里.
现在,我们来到棘手的部分:处理程序,它需要一个块:
handler:^(NSEvent *event){
Run Code Online (Sandbox Code Playgroud)
我花了一些编译错误才能做到这一点,但是(谢谢Apple)他们是非常有建设性的错误信息.首先要注意的是克拉^.这标志着块的开始.在那之后,在括号内,
NSEvent *event
Run Code Online (Sandbox Code Playgroud)
其中声明了您将在块中使用的变量来捕获事件.你可以打电话给它
NSEvent *someCustomNameForAnEvent
Run Code Online (Sandbox Code Playgroud)
没关系,你只是在块内使用该名称.然后,这就是它的全部内容.确保关闭大括号和括号以完成方法调用:
}];
Run Code Online (Sandbox Code Playgroud)
而且你已经完成了!这真的是一种"单线".在您的应用程序中执行此调用的位置无关紧要 - 我在AppDelegate的applicationDidFinishLaunching方法中执行此操作.然后,在块中,您可以从应用程序中调用其他方法.
我正在尝试在我正在制作的网站上创建快捷方式.我知道我可以这样做:
if(e.which == 17) isCtrl=true;
if(e.which == 83 && isCtrl == true) {
alert('CTRL+S COMBO WAS PRESSED!')
//run code for CTRL+S -- ie, save!
e.preventDefault();
}
Run Code Online (Sandbox Code Playgroud)
但下面的示例更容易,代码更少,但它不是组合键按压事件:
$(document).keypress("c",function() {
alert("Just C was pressed..");
});
Run Code Online (Sandbox Code Playgroud)
所以我想知道如果通过使用第二个例子,我可以做类似的事情:
$(document).keypress("ctrl+c",function() {
alert("Ctrl+C was pressed!!");
});
Run Code Online (Sandbox Code Playgroud)
这可能吗?我试过了它并没有用,我做错了什么.
我对keypress,keydown和keyup的各种行为感到困惑.似乎我错过了一个重要的文档,一个解释了这个三重奏的细微之处和细微差别.有人可以帮我弄清楚我需要阅读哪个文件才能更有效地使用这些事件吗?如果您需要详细信息,请参阅下文.
@ov:你让我展示一些代码,但这并不是我试图解决的代码中的特定问题.我正在尝试处理这些事件处理程序的行为,并要求了解它们的人指出一个好的文档.
我使用jQuery构建输入表单并将其插入到我的文档中.它工作得很好,大多数情况下.我希望表单像我在其中看到的大多数其他输入表单一样响应键盘:esc键应该忽略表单与单击取消按钮相同,并且因为表单上有一个<textarea>,cmd+ enter应该与单击时相同确定按钮.使用按键事件似乎很简单.问题是Chrome不会为密钥或+ 调用我的按键处理程序.它会激发+ 和+ 以及字母数字,但不是+ .esccmdenterctrlenteroptionentercmdenter
所以我会改用密钥.我得到KEYUP了esc,和KEYUP的cmd,和KEYUP的enter,伟大的.但我没有得到KEYUP了enter,而我按住键cmd.
第三次是魅力,你可能会认为keydown似乎工作,但有了keydown,你会得到重复键.我知道,你所要做的就是在第一次调用时解除处理程序的绑定,但三种不同的事件类型表现得如此不同似乎很奇怪.为什么是这样?那里有一个明显的文件,我显然还没读过吗?
我读过jQuery Event Keypress:按下了哪个键?和我如何检查与jQuery单击事件过程中按下键?
但是我的问题是,如果你能为所有浏览器获得相同的关键事件?目前我知道Firefox给command按钮(Mac)代码224,而Chrome和Safari给它91值.是最好的方法来简单地检查用户正在使用什么浏览器并基于按下的键或是否有办法我可以在所有浏览器中获得1个关键代码吗?注意我得到的值是:
var code = (evt.keyCode ? evt.keyCode : evt.which);
Run Code Online (Sandbox Code Playgroud)
如果可能的话,我很想不使用插件只是因为我只需要知道按下的command/ ctrl(windows系统)键.
是否可以使用CSS控制tabindex,如果是,哪些浏览器支持它以及哪些元素?
编辑
我应该说,我的目标是在div上捕获keydown事件.我看到这个页面http://www.quirksmode.org/js/events/keys.html#测试键盘事件,它显示了keydown触发除文档和正文以外的任何内容或某种表单元素或链接的唯一方法是要在其上声明tabindex.但我在W3C网站上看到:
以下元素支持tabindex属性:A,AREA,BUTTON,INPUT,OBJECT,SELECT和TEXTAREA.
所以我有点困惑,为了使标准兼容并使我的用例工作,该怎么办?
EDIT2
我的整个用例是一个带有很多内容的div,带有一个人工滚动条.我可以用鼠标事件滚动它,但到目前为止键盘没有运气.
我是Python的新手,我只是用Python创建了一个游戏和一个菜单.问题是,使用(raw_)input()要求我在每次按键后按Enter键,我想按下向下箭头将立即选择下一个菜单项,或者在游戏中向下移动.目前,它需要我喜欢键入"向下"然后按Enter键.我也做了很多研究,但我不想下载大型模块(例如pygame)来实现单个keyDown()方法.那么有什么更简单的方法,我找不到?
编辑:
刚刚发现可以解决这个问题msvcrt.getch().它不是keyDown(),但它有效.但是,我不知道如何使用它,这看起来很奇怪,这里有什么帮助吗?这就是我现在所得到的:
from msvcrt import getch
while True:
key = getch()
print(key)
Run Code Online (Sandbox Code Playgroud)
但是,它一直给我所有这些无意义的字节,例如,向下箭头是这样的:
b'\xe0'
b'P'
Run Code Online (Sandbox Code Playgroud)
我不知道如何使用它们,我试图与chr()进行比较,甚至使用ord(),但不能真正进行任何比较.我想要做的基本上是这样的:
from msvcrt import getch
while True:
key = getch()
if key == escape:
break
elif key == downarrow:
movedown()
elif key == 'a':
...
Run Code Online (Sandbox Code Playgroud)
等等......有什么帮助吗?