26

クレジットカード番号フォームがあります。番号は、実際のクレジット カードと同じように 4 つの部分に分かれています。

ユーザーがフィールドに 4 文字を入力すると、フォーカスが自動的に次のタグに移動するように、フォームに JavaScript のテイストを追加したいと考えています。しかし、最後のタグではありません。これにより、ユーザーはフォーカスを移動するために「タブ」キーを入力する必要がなくなります。

タグにクラス、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>
4

8 に答える 8

30

以前にこのツールを使用したことはありませんが、必要なことは実行できます。ソースを見て、いくつかのアイデアを得ることができます。

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>
于 2009-12-24T19:03:23.923 に答える
17

他の人が促したように、これをしないでください。ユーザーは、あなたが自動でタブを押すとは予想できず、気が狂ってしまうでしょう。クレジット カードをコピー アンド ペーストするユーザーについて考えたことはありますか? とにかく 4 つのフィールドを使用する利点は何ですか?

また、すべてのクレジット カードが番号を 4 つずつ 4 セットに分割しているわけではありません。たとえば、American Express では、それらを 3 つのグループの数字に分けています。この場合、テキスト フィールドを動的に追加および削除すると問題が発生します。

代わりに、Javascript を使用してスペースが属する場所に自動的に挿入し、フォーカスではなくカーソルを進めます。数字の最初の桁はクレジット カードの種類 (5 は Mastercard、4 は Visa、3 は American Express など) を示しているので、これを読んでスペースを追加する場所を決めることができます。投稿するときは、文字列からスペースを取り除きます。このアプローチにより、あなたとユーザーの多くの負担が軽減されます。

于 2009-12-24T20:03:43.317 に答える
10

@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

于 2013-06-10T16:01:53.107 に答える
6

Masked Input jQuery Pluginを使用することを強くお勧めします。

使用方法は次のようになります。

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

このようにして、コピーと貼り付けとプレースホルダーがサポートされます。

于 2013-05-09T19:32:22.073 に答える
6

あなたの例のように、フォーム フィールドが隣り合っている場合は、簡単に利用できます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)"/>

于 2016-10-24T15:00:16.390 に答える
1

非常に単純な解決策は次のようになります。

<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>
于 2009-12-24T19:10:39.430 に答える
0

私はそれをテストしていませんが、これはうまくいくと思います。4 番目のフィールドが完了すると、おそらくフォーカスもボタンに移動します。

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

    if($(this).val().length == maxLength) {
        $(this).next().focus();
    }
}
于 2009-12-24T19:06:10.733 に答える
0

これには 4 つのフィールドはありませんが、クレジット カードを検証します (整合性チェックであり、Luhn のアルゴリズムではありません!)。ユーザーと自動タブに複数のフィールドを使用するのがいかに面倒かをお伝えしなければなりません。1 つのフィールドのみを使用することをお勧めします。

jquery の Web サイトから:

$("#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>
于 2009-12-24T19:08:30.467 に答える