Javascript 如何将未处理的按键发送到特定的输入字段?
我试着做以下看似简单的事情 如果按下一个键会在文本输入字段中键入一个字符,而该按键尚未在其他地方处理(例如,没有输入字段具有焦点),则聚焦一个特定输入字段并在那里键入字符 这是为了在需要快速响应的浏览器游戏中为用户节省一次鼠标点击,但它同样可以用于聊天应用程序。如果用户不小心忘记了关注这个(大而明显的)输入字段,那么我想优雅地处理它,而不是惩罚他们 注意事项:Javascript 如何将未处理的按键发送到特定的输入字段?,javascript,jquery,jquery-events,Javascript,Jquery,Jquery Events,我试着做以下看似简单的事情 如果按下一个键会在文本输入字段中键入一个字符,而该按键尚未在其他地方处理(例如,没有输入字段具有焦点),则聚焦一个特定输入字段并在那里键入字符 这是为了在需要快速响应的浏览器游戏中为用户节省一次鼠标点击,但它同样可以用于聊天应用程序。如果用户不小心忘记了关注这个(大而明显的)输入字段,那么我想优雅地处理它,而不是惩罚他们 注意事项: 如果任何输入字段都有焦点,则事件应该转到该字段,而不是其他字段 不键入字符的键(Enter、箭头键、PgUp、PgDn等)应保留其默认
- 如果任何输入字段都有焦点,则事件应该转到该字段,而不是其他字段
- 不键入字符的键(Enter、箭头键、PgUp、PgDn等)应保留其默认行为
$(document).keypress(function(e) {
var input = $("#my-input-field");
if (e.which >= ' ' && !input.is(":focus")) {
input.focus();
input.trigger(e);
e.preventDefault();
}
});
但是,这不起作用,原因有二:
文档
中冒泡出现。可能的解决方案:
- 将
事件处理程序连接到所有输入字段,并在每个字段中调用keypress
,但这听起来像是一个等待出错的可怕黑客stopPropagation
- 在上面的处理程序中检查输入字段当前是否有焦点,如果有,则忽略它,但这听起来像是我遗漏了一些其他使用按键的情况
.trigger(e)
无效。它确实调用我的自定义事件处理程序,但不会触发实际插入字符的defautkeypress
行为最干净的解决方法是什么?您不能为用户手动触发按键(潜在的安全冲突),在这种情况下,
trigger()
所做的一切就是触发分配给按键事件的任何事件侦听器。您可以使用.val()修改文本框的值。只需添加角色即可
您可以在文档keypress listener中使用
if($(e.target).is('input'))
测试按键是否在文本框中完成。如果您愿意,还可以添加一个复选框'textarea'
。想想看,事件按以下顺序触发:keydown
,keyup
,keypress
您可以使用以下内容:
$(document.body).on('keydown', function(e) {
if(document.activeElement.tagName.toLowerCase() != 'input') {
$('#my-default-input').focus();
}
});
然后keydown事件将完成,随后将触发keyup事件(在现在聚焦的字段上),并将字符写入该字段,然后触发与该字段关联的其他事件(如果有)可以使用的keypress事件
if语句的内容可以更改为过滤掉某些按键,或将其他标记(如
)添加到“请勿触摸”列表中
还要注意的是,我还没有测试过这一点,但理论上它应该可以工作。:) 虽然这种技术确实有效,但它使过滤变得很困难,因为我们现在得到的是键码,而不是字符码。然而,根据这个列表:我设法想出了一些效果相当好的方法。谢谢即使这不是真的必要,也可以使用。:)不,我们这里说的是关键代码,不是字符代码。它们不是一回事,它们几乎总是一样的。即使是不可打印的字符和一些修饰符也映射到正确的ASCII值(UTF-8采用了该值,JS将其用于字符串)。只有当您需要区分键盘数字和键盘的数字行,或者需要拾取非标准修改键(如Apple或Windows键)时,它才会有所不同,然后您需要。由于您希望重定向“常规”键
/[A-Za-z0-9.,\-+]/.test(String.fromCharCode(e.keyCode))
应该可以工作。