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

Javascript 如何将未处理的按键发送到特定的输入字段?,javascript,jquery,jquery-events,Javascript,Jquery,Jquery Events,我试着做以下看似简单的事情 如果按下一个键会在文本输入字段中键入一个字符,而该按键尚未在其他地方处理(例如,没有输入字段具有焦点),则聚焦一个特定输入字段并在那里键入字符 这是为了在需要快速响应的浏览器游戏中为用户节省一次鼠标点击,但它同样可以用于聊天应用程序。如果用户不小心忘记了关注这个(大而明显的)输入字段,那么我想优雅地处理它,而不是惩罚他们 注意事项: 如果任何输入字段都有焦点,则事件应该转到该字段,而不是其他字段 不键入字符的键(Enter、箭头键、PgUp、PgDn等)应保留其默认

我试着做以下看似简单的事情

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

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

注意事项:

  • 如果任何输入字段都有焦点,则事件应该转到该字段,而不是其他字段
  • 不键入字符的键(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();
  }
});
但是,这不起作用,原因有二:

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

  • 最干净的解决方法是什么?

    您不能为用户手动触发按键(潜在的安全冲突),在这种情况下,
    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))
    应该可以工作。