【问题标题】:How do I move focus to next input with jQuery?如何使用 jQuery 将焦点移至下一个输入?
【发布时间】:2011-01-28 03:40:55
【问题描述】:

我正在使用带有 jQ​​uery 的自动完成插件,它工作正常。但是,在 IE 中,当用户在自动完成中选择一个项目时,焦点不会移动到下一个输入字段。自然,它可以在 Firefox 中运行。该插件没有内置解决方案,但确实提供了“选项”。有没有办法强制它移动到下一个输入字段?

【问题讨论】:

  • ?你的意思是。如果您在自动完成程序中选择了某些内容,为什么焦点会移动到输入字段?
  • 我的“表单”实际上是一个 并且下一个输入是同一个表内的一个
    。是的,在自动完成器中选择某些内容后,我需要它移动到下一个输入。

标签: javascript jquery autocomplete


【解决方案1】:

你可以这样做:

$("input").change(function() {
  var inputs = $(this).closest('form').find(':input');
  inputs.eq( inputs.index(this)+ 1 ).focus();
});

此处发布的其他答案可能对您不起作用,因为它们取决于下一个输入是下一个同级元素,而通常情况并非如此。这种方法上升到表单并搜索下一个输入类型元素。

【讨论】:

  • 'input:visible,select:visible' 工作得更好一些,可以找到选择框并跳过隐藏字段。
  • 这个答案得到了很多人的支持,但没有被接受;我猜那是因为它依赖于嵌套在“表单”元素中的输入字段
  • 太棒了,非常简单但非常有用。谢谢。
  • “此处发布的其他答案可能对您不起作用,因为它们取决于下一个输入是下一个同级元素,而通常情况并非如此。” -- +1 与现实世界保持联系。很有帮助。
【解决方案2】:

JQuery UI 已经有了这个,在下面的示例中,如果我输入了最大字符数,我包含了一个 maxchar 属性来关注下一个可聚焦元素(输入、选择、文本区域、按钮和对象)

HTML:

text 1 <input type="text" value="" id="txt1" maxchar="5" /><br />
text 2 <input type="text" value="" id="txt2" maxchar="5" /><br />
checkbox 1 <input type="checkbox" value="" id="chk1" /><br />
checkbox 2 <input type="checkbox" value="" id="chk2" /><br />
dropdown 1 <select id="dd1" >
    <option value="1">1</option>
    <option value="1">2</option>
</select><br />
dropdown 2 <select id="dd2">
    <option value="1">1</option>
    <option value="1">2</option>
</select>

Javascript

$(function() {
    var focusables = $(":focusable");   
    focusables.keyup(function(e) {
        var maxchar = false;
        if ($(this).attr("maxchar")) {
            if ($(this).val().length >= $(this).attr("maxchar"))
                maxchar = true;
            }
        if (e.keyCode == 13 || maxchar) {
            var current = focusables.index(this),
                next = focusables.eq(current+1).length ? focusables.eq(current+1) : focusables.eq(0);
            next.focus();
        }
    });
});

【讨论】:

  • 这个答案怎么会有这么少的赞成票?您可以从字面上复制和粘贴 $(function() {, down to, });并且一旦输入字段已满,它就会移动到下一个字段,并且当用户完成时,它会占回车键。如此普遍和独立。谢谢!
  • 也可以将“focusables.keyup(function(e) {”更改为“focusables.keydown(function(e) {”并调用e.preventDefault();以防止按钮的初始行为执行。在我的情况下,我要求让数字键盘上的加号键模拟 Tab 键,这个解决方案效果很好!
【解决方案3】:

山姆的意思是:

$('#myInput').focus(function(){
    $(this).next('input').focus();
})

【讨论】:

  • 是的,这不只是意味着我点击了一个字段,但被选中的是下一个字段?
  • @Unipartisandev 这意味着严格专注。您可以通过单击来聚焦元素,但也可以使用 TAB 聚焦元素。如果您通过 TAB 聚焦两次,您将获得第 4 个元素,因为您每次聚焦任何东西时都会“跳过”其中一个。
【解决方案4】:

尝试使用类似的东西:

var inputs = $(this).closest('form').find(':focusable');
inputs.eq(inputs.index(this) + 1).focus();

【讨论】:

  • 请注意,我没有意识到 :focusable 伪选择器需要 jQuery UI 插件,以防其他人在尝试使用它时出错。
  • 优雅简洁。真的很不错的代码!如果您希望导航模拟键盘输入行为,:tabbable 可能是比 :focusable 更好的选择。
【解决方案5】:

为什么不简单地给出你想跳转到一个id的输入字段并做一个简单的焦点

$("#newListField").focus();

【讨论】:

  • 它对制作通用解决方案没有用处。
  • 正如桑迪所说,如果您使用的代码可能会用于多个领域,那么您将不得不编写一堆冗余代码。
【解决方案6】:

使用eq 获取特定元素。

关于index的文档

$("input").keyup(function () {
   var index = $(this).index("input");          
   $("input").eq(index + 1).focus(); 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>

<input type="text" maxlength="1"  />
<input type="text" maxlength="1"  />

<input type="text" maxlength="1"  />

<input type="text" maxlength="1"  />
<input type="text" maxlength="1"  />
<input type="text" maxlength="1"  />

【讨论】:

    【解决方案7】:

    您能否发布一些 HTML 作为示例?

    同时,试试这个:

    $('#myInput').result(function(){
        $(this).next('input').focus();
    })
    

    这是未经测试的,所以它可能需要一些调整。

    【讨论】:

    • @c0mrade 我不是这个意思。
    【解决方案8】:

    我刚刚编写了一个 jQuery 插件,可以满足您的需求(很恼火我自己找不到安迪解决方案(tabStop -> http://plugins.jquery.com/tabstop/

    【讨论】:

      【解决方案9】:
        function nextFormInput() {
            var focused = $(':focus');
            var inputs = $(focused).closest('form').find(':input');
            inputs.eq(inputs.index(focused) + 1).focus();
        }
      

      【讨论】:

        【解决方案10】:

        你可以使用

        $(document).on("keypress","input,select",function (e) {
            e.preventDefault();
            if (e.keyCode==13) {
                $(':input).eq($(':input').index(this) + 1)').focus();
            }
        });
        

        【讨论】:

          【解决方案11】:

          如果您在脚本中使用 event.preventDefault() 则将其注释掉,因为 IE 不喜欢它。

          【讨论】:

          • IE 喜欢 preventDefault 如果您实际上将事件作为参数传递给您调用它的函数,就像这样: $(document).on('click','.mylink',function (事件){ event.preventDefault(); });
          【解决方案12】:

          最简单的方法是将它从标签索引中一起删除:

          $('#control').find('input[readonly]').each(function () {
              $(this).attr('tabindex', '-1');
          });
          

          我已经在几个表单上使用了它。

          【讨论】:

            【解决方案13】:

            这就是我的情况。性能密集度可能较低。

            $('#myelement').siblings('input').first().focus();
            

            【讨论】:

            • 这里不会考虑下一个输入可能不是一个输入,而是一个Select、TextArea、Button等。
            【解决方案14】:
            var inputs = $('input, select, textarea').keypress(function (e) {
              if (e.which == 13) {
                e.preventDefault();
                var nextInput = inputs.get(inputs.index(this) + 1);
                if (nextInput) {
                  nextInput.focus();
                }
              }
            });
            

            【讨论】:

            • 对代码进行某种形式的解释也会对 SO 读者有所帮助。
            【解决方案15】:
            onchange="$('select')[$('select').index(this)+1].focus()"
            

            如果您的下一个字段是另一个选择,这可能会起作用。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2023-03-27
              • 2020-04-02
              • 2010-11-16
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多