如何将未处理的按键发送到特定的输入字段?

时间:2012-03-27 19:47:01

标签: javascript jquery javascript-events

我正在尝试做以下事情,看似简单。

  

如果按下的键会在文本输入字段中键入一个字符,并且该按键尚未在其他地方处理(例如,没有输入字段具有焦点),则关注一个特定输入字段并键入那里的角色

这是为了在需要快速响应的浏览器游戏中为用户保存鼠标点击,但它同样可以用在聊天应用程序中。如果用户意外忘记关注这个(大而明显的)输入字段,那么我想优雅地处理它而不是惩罚它们。

注意事项:

  • 如果任何输入字段具有焦点,则该事件应该去那里,而不是其他地方。
  • 不键入字符的键(Enter,箭头键,PgUp,PgDn,...)应该保留默认行为。

使用jQuery,我想出了类似的东西:

$(document).keypress(function(e) {
  var input = $("#my-input-field");
  if (e.which >= ' ' && !input.is(":focus")) {
    input.focus();
    input.trigger(e);
    e.preventDefault();
  }
});

然而,由于两个原因,这不起作用:

  1. 即使特定输入字段处理事件,事件仍会冒泡到document。可能的解决方案:
    • keypress个事件处理程序连接到所有输入字段,并在每个字段中调用stopPropagation,但这听起来像是一个可怕的黑客等待出错。
    • 在上面的处理程序中检查输入字段当前是否具有焦点,如果是,则忽略它,但这听起来像我会遗漏一些其他东西使用按键的角落情况。
  2. 调用.trigger(e)不起作用。它会调用我的自定义事件处理程序,但不会触发实际插入字符的defaut keypress行为。
  3. 最干净的出路是什么?

2 个答案:

答案 0 :(得分:6)

考虑到这一点,事件按此顺序触发:keydownkeyupkeypress

您可以使用以下内容:

$(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'