我正在尝试做以下事情,看似简单。
如果按下的键会在文本输入字段中键入一个字符,并且该按键尚未在其他地方处理(例如,没有输入字段具有焦点),则关注一个特定输入字段并键入那里的角色。
这是为了在需要快速响应的浏览器游戏中为用户保存鼠标点击,但它同样可以用在聊天应用程序中。如果用户意外忘记关注这个(大而明显的)输入字段,那么我想优雅地处理它而不是惩罚它们。
注意事项:
使用jQuery,我想出了类似的东西:
$(document).keypress(function(e) {
var input = $("#my-input-field");
if (e.which >= ' ' && !input.is(":focus")) {
input.focus();
input.trigger(e);
e.preventDefault();
}
});
然而,由于两个原因,这不起作用:
document
。可能的解决方案:
keypress
个事件处理程序连接到所有输入字段,并在每个字段中调用stopPropagation
,但这听起来像是一个可怕的黑客等待出错。.trigger(e)
不起作用。它会调用我的自定义事件处理程序,但不会触发实际插入字符的defaut keypress
行为。最干净的出路是什么?
答案 0 :(得分:6)
考虑到这一点,事件按此顺序触发:keydown
,keyup
,keypress
。
您可以使用以下内容:
$(document.body).on('keydown', function(e) {
if(document.activeElement.tagName.toLowerCase() != 'input') {
$('#my-default-input').focus();
}
});
然后keydown事件将完成,它将稍后触发keyup事件(在现在聚焦的字段上)并且应该将字符写入字段,然后触发keypress事件,其他事件(如果有的话)绑定到字段可以使用。
可以更改if语句的内容以过滤掉某些按键,或者将其他标记(例如<canvas>
)添加到“请勿触摸”列表中。
另请注意,我没有对此进行测试,但理论上应该可行。 :)
答案 1 :(得分:1)
您无法手动触发用户的按键(潜在的安全违规),在这种情况下,所有trigger()
都会触发分配给按键事件的任何事件侦听器。您可以使用.val()修改文本框的值。只需添加角色即可。
您可以测试是否在文档按键侦听器中的if($(e.target).is('input'))
文本框中完成了按键操作。如果您愿意,也可以添加支票'textarea'
。