【问题标题】:Moving a focus when the input text field reaches a max length当输入文本字段达到最大长度时移动焦点
【发布时间】:2010-12-29 21:15:38
【问题描述】:

我有一张信用卡号码表。该号码与真实信用卡一样分为四部分。

我想在表单中添加一种 JavaScript 风格,当用户在一个字段中键入四个字母时,焦点会自动转到下一个标签。但不在最后一个标签中。通过这样做,用户不必键入“tab”键来移动焦点。

可以在标签中添加一些额外的类、id 或名称。

<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title>MoveFocus</title>
    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script>
    <script type="text/javascript" charset="utf-8">
     $(function() {
     // some code goes here.
    });
    </script>
</head>


<body>
  <form action="post.php" method="post" accept-charset="utf-8">
    <input type="text" value="" id="first" size="4" maxlength="4"/> -
    <input type="text" value="" id="second" size="4" maxlength="4"/> -
    <input type="text" value="" id="third" size="4" maxlength="4"/> -
    <input type="text" value="" id="fourth" size="4" maxlength="4"/>
    <p><input type="submit" value="Send Credit Card"></p>
  </form>
</body>
</html>

【问题讨论】:

  • ...当然,有些用户按 Tab 键,然后错过字段。不要划分字段,只需使用单个字段。它使用户的事情变得更容易(这是所有其他网站所做的)。
  • 并不是说我是每个用户,但我讨厌使用电话、CC 和 SS 号码这样做的网站。我更喜欢将下一个按键解释为进入下一个框并输入它的网站。在您的情况下,等待第五次按键,如果是数字,请将焦点移到下一个框并将第一个字符设置为按下的数字。如果是右箭头键,移动到下一个框,不要设置任何字符。只是我对可用性的看法。
  • 哦,如果用户在输入任何给定框中的最后一个字符时出错,他们可能希望退格键继续工作。
  • 需要一个反对自动对焦和 Tabbing 的联盟......这些 UI 太智能了,妨碍了正常使用

标签: javascript jquery jquery-events usability


【解决方案1】:

我以前没有使用过这个工具,但它可以满足你的需求。你可以看看它的来源以获得一些想法:

This Plugin on GitHub

根据您的情况,您可以添加以下代码:

<script type="text/javascript" src="jquery.autotab.js"></script>
<script type="text/javascript">
$(document).ready(function() {
    $('#first').autotab({ target: '#second', format: 'numeric' });
    $('#second').autotab({ target: '#third', format: 'numeric', previous: '#first' });
    $('#third').autotab({ previous: '#second', format: 'numeric' });
});
</script>

【讨论】:

  • 感谢您向我介绍了一个很棒的插件。其他人建议使用“onchange()”,但似乎效果不佳。您提到的脚本使用keydown()keypress()keyup(),这似乎是一个更好的解决方案。
【解决方案2】:

我还没有测试过,但我认为这会奏效。当第 4 个字段完成时,它可能还会将焦点移到按钮上。

$("form input").change(function () {
    var maxLength = $(this).attr('maxlength');

    if($(this).val().length == maxLength) {
        $(this).next().focus();
    }
}

【讨论】:

  • 代码似乎不能正常工作。我需要在填写 4 个字母后单击某处来移动焦点。不过谢谢。我明白了。
  • 啊,那是因为只有在焦点移动时才会调用更改,这对于这个例子来说有点蹩脚:-)。\,你可能需要挂钩 keyup 事件。
【解决方案3】:

这没有四个字段,但它确实验证信用卡(完整性检查,而不是 Luhn 算法!)。我必须告诉你为用户和自动选项卡使用多个字段是多么烦人。我建议您只使用一个字段。

来自jquery website:

$("#myform").validate({
  rules: {
    field: {
      required: true,
      creditcard: true
    }
  }
});

/

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" 
                    "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
  <script src="http://code.jquery.com/jquery-latest.js"></script>
  <script type="text/javascript" src="http://dev.jquery.com/view/trunk/plugins/validate/lib/jquery.delegate.js"></script>
<script type="text/javascript" src="http://dev.jquery.com/view/trunk/plugins/validate/jquery.validate.js"></script>
<script type="text/javascript">
jQuery.validator.setDefaults({
    debug: true,
    success: "valid"
});;
</script>

  <script>
  $(document).ready(function(){
    $("#myform").validate({
  rules: {
    field: {
      required: true,
      creditcard: true
    }
  }
});
  });
  </script>
  <style>#field { margin-left: .5em; float: left; }
    #field, label { float: left; font-family: Arial, Helvetica, sans-serif; font-size: small; }
    br { clear: both; }
    input { border: 1px solid black; margin-bottom: .5em;  }
    input.error { border: 1px solid red; }
    label.error {
        background: url('http://dev.jquery.com/view/trunk/plugins/validate/demo/images/unchecked.gif') no-repeat;
        padding-left: 16px;
        margin-left: .3em;
    }
    label.valid {
        background: url('http://dev.jquery.com/view/trunk/plugins/validate/demo/images/checked.gif') no-repeat;
        display: block;
        width: 16px;
        height: 16px;
    }
</style>
</head>
<body>

<form id="myform">
  <label for="field">Required, creditcard (try 446-667-651): </label>
  <input class="left" id="field" name="field" />
  <br/>
  <input type="submit" value="Validate!" />
</form>

</body>
</html>

【讨论】:

    【解决方案4】:

    一个非常简单的解决方案可能是这样的:

    <script type="text/javascript">
        function input_onchange(me){ 
            if (me.value.length != me.maxlength){
                return;
            }
            var i;
            var elements = me.form.elements;
            for (i=0, numElements=elements.length; i<numElements; i++) {
                if (elements[i]==me){
                    break;
                }
            }
            elements[i+1].focus();
        }
    </script>
    <form action="post.php" method="post" accept-charset="utf-8">
        <input type="text" value="" id="first" size="4" maxlength="4"
            onchange="input_onchange(this)"
        /> -
        <input type="text" value="" id="second" size="4" maxlength="4"
            onchange="input_onchange(this)"
        /> -
        <input type="text" value="" id="third" size="4" maxlength="4"
            onchange="input_onchange(this)"
        /> -
        <input type="text" value="" id="fourth" size="4" maxlength="4"
            onchange="input_onchange(this)"
        /> -
        <p><input type="submit" value="Send Credit Card"></p>
    </form>
    

    【讨论】:

    • 谢谢。我尝试了我的浏览器(Firefox 和 Safari),但它似乎不起作用。
    • 我已将 me.value.length!=this.maxlength 更改为 me.value.length!=this.maxLength 以使代码正常工作,我想这是一个小错误
    【解决方案5】:

    正如其他人所敦促的那样,不要这样做。用户无法预料到您会自动添加标签,这会让他们发疯。您是否考虑过复制和粘贴信用卡的用户?无论如何使用四个字段有什么好处?

    此外,并非所有信用卡都将其号码分成四组,每组四个。例如,美国运通将它们分成三组数字。在这种情况下,动态添加和删除文本字段是自找麻烦。

    相反,使用您的 Javascript 自动插入它们所属的 空格,推进光标,而不是焦点。数字中的第一个数字表示信用卡的类型(5 是万事达卡,4 是维萨卡,3 是美国运通卡……),因此您可以阅读此内容来决定在哪里添加空格。发布时擦掉字符串中的空格。这种方法将为您和您的用户省去很多痛苦。

    【讨论】:

    • +1 - 输入信用卡详细信息时,自动标签是最烦人的事情。特别是如果你犯了一个错误需要“返回”
    【解决方案6】:

    我强烈推荐使用Masked Input jQuery Plugin

    您的使用将如下所示:

    $("#CreditCardNumber").mask("9999-9999-9999-9999");
    

    这样您将获得复制粘贴和占位符支持。

    【讨论】:

      【解决方案7】:

      正如@Sander 所建议的,做一个自动标签的简单方法是:

      jQuery("form input[type=text]").on('input',function () {
          if(jQuery(this).val().length == jQuery(this).attr('maxlength')) {
              jQuery(this).next("input").focus();
          }
      });
      

      更新@morespace54

      oninputhtml5 事件,IE9+ 支持,因此您可以使用 keyup 代替。

      【讨论】:

      • 只是为了让大家知道,即使上面的代码在 FF/Chrome/Safari/Opera 上运行良好(感谢@Ouadie),我也很难让它在 IE 中运行(Doh)即使在 v8 上。我也设法通过更改 keyup 的输入使其在 IE 中工作。所以它就像:jQuery("form input[type=text]").on('keyup',function () { if(jQuery(this).val().length == jQuery(this).attr('maxlength')) { jQuery(this).next("input").focus(); } });
      • oninputIE9+,这就是它在 IE8 中不起作用的原因,我将更新解决方案。谢谢;)
      • 哦,我不知道 IE9+ 使用输入法。谢谢。我希望有一天,我们生活在一个没有 IE 的世界里...... ;)
      【解决方案8】:

      如果您的表单字段与您的示例中的另一个并排,您可以简单地利用 nextElementSibling 和瞧!

      function skipIfMax(element) {
        max = parseInt(element.dataset.max)
        
        
        if (element.value.length >= max && element.nextElementSibling) {
          element.nextElementSibling.focus();  
        }
      }
      <input type="text" data-max=2 oninput="skipIfMax(this)"/>
      <input type="text" data-max=3 oninput="skipIfMax(this)"/>
      <input type="text" data-max=4 oninput="skipIfMax(this)"/>
      <input type="text" data-max=5 oninput="skipIfMax(this)"/>

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-01-19
        • 1970-01-01
        • 2015-11-11
        • 1970-01-01
        • 1970-01-01
        • 2023-04-07
        • 2014-10-17
        相关资源
        最近更新 更多