7

サイトに 6 つの入力フィールドを使用するフォームがあります。サイトの訪問者は、これらの 6 つのボックスに 6 桁のコードを入力するだけです。問題は、彼らが 6 桁のコードを取得することです。最初の入力フィールドに貼り付けて残りの 5 桁を移動させるだけで、送信した 6 桁のコードをこれらの入力フィールドに単純にコピーできるようにするのが理想的です。残りの 5 つの入力フィールドに入力します。各入力フィールドに各数字を手動で入力するよりもはるかに簡単になります。

現在使用しているコードは次のとおりですが、上記の内容を実現するために簡単に変更できます。

<input type="text" maxlength="1" class="def-txt-input" name="chars[1]">
<input type="text" maxlength="1" class="def-txt-input" name="chars[2]">
<input type="text" maxlength="1" class="def-txt-input" name="chars[3]">
<input type="text" maxlength="1" class="def-txt-input" name="chars[4]">
<input type="text" maxlength="1" class="def-txt-input" name="chars[5]">
<input type="text" maxlength="1" class="def-txt-input" name="chars[6]">

ここでこれに似た投稿を見ました: Pasteing of serialnumber over multiple textfields

しかし、私が探している解決策はありません。理想的には、これは jQuery またはプレーンな JavaScript を使用して実現できます。

4

5 に答える 5

10

編集

イベントで使用したタイマー ソリューションと、 orイベントpasteを使用するだけの複雑さが気に入りませんでした。inputpaste

しばらくこれを見た後、私は 2 つのハイブリッドを使用するソリューションを追加しました。コードは現在必要なすべてのことを行っているようです。

スクリプト:

var $inputs = $(".def-txt-input");
var intRegex = /^\d+$/;

// Prevents user from manually entering non-digits.
$inputs.on("input.fromManual", function(){
    if(!intRegex.test($(this).val())){
        $(this).val("");
    }
});


// Prevents pasting non-digits and if value is 6 characters long will parse each character into an individual box.
$inputs.on("paste", function() {
    var $this = $(this);
    var originalValue = $this.val();

    $this.val("");

    $this.one("input.fromPaste", function(){
        $currentInputBox = $(this);

        var pastedValue = $currentInputBox.val();

        if (pastedValue.length == 6 && intRegex.test(pastedValue)) {
            pasteValues(pastedValue);
        }
        else {
            $this.val(originalValue);
        }

        $inputs.attr("maxlength", 1);
    });

    $inputs.attr("maxlength", 6);
});


// Parses the individual digits into the individual boxes.
function pasteValues(element) {
    var values = element.split("");

    $(values).each(function(index) {
        var $inputBox = $('.def-txt-input[name="chars[' + (index + 1) + ']"]');
        $inputBox.val(values[index])
    });
};​

デモを見る

于 2012-08-03T23:21:03.027 に答える
3

一般化された元の回答と同じことを行うjqueryプラグインの例を次に示します。

元の回答( http://jsfiddle.net/D7jVR/ )をjqueryプラグインに変更するために多大な努力をしました。ソースコードは次のとおりです:https://github.com/relipse/jquery-pastehopacross/blob/master /jquery.pastehopacross.js

jsfiddle での例はこちら: http://jsfiddle.net/D7jVR/111/

2013 年 4 月 4 日現在のソースは次のとおりです。

/**
 * PasteHopAcross jquery plugin
 * Paste across multiple inputs plugin, 
 * inspired by http://jsfiddle.net/D7jVR/
 */
(function ($) {
    jQuery.fn.pastehopacross = function(opts){ 
       if (!opts){ opts = {} }
        if (!opts.regexRemove){
            opts.regexRemove = false;   
        }
        if (!opts.inputs){
           opts.inputs = [];   
        }
        if (opts.inputs.length == 0){
            //return 
            return $(this);   
        }

        if (!opts.first_maxlength){
            opts.first_maxlength = $(this).attr('maxlength');
            if (!opts.first_maxlength){
                return $(this);
            }
        }

       $(this).on('paste', function(){

           //remove maxlength attribute
           $(this).removeAttr('maxlength'); 
           $(this).one("input.fromPaste", function(){
               var $firstBox = $(this);

                var pastedValue = $(this).val();
                if (opts.regexRemove){
                     pastedValue = pastedValue.replace(opts.regexRemove, "");
                }

                var str_pv = pastedValue;
                $(opts.inputs).each(function(){
                    var pv = str_pv.split('');
                    var maxlength;
                    if ($firstBox.get(0) == this){
                       maxlength = opts.first_maxlength;   
                    }else{
                       maxlength = $(this).attr('maxlength'); 
                    }
                    if (maxlength == undefined){
                        //paste them all!
                        maxlength = pv.length;   
                    }
                    //clear the value
                    $(this).val('');
                    var nwval = '';           
                    for (var i = 0; i < maxlength; ++i){
                        if (typeof(pv[i]) != 'undefined'){
                           nwval += pv[i];
                        }
                    }
                    $(this).val(nwval);
                    //remove everything from earlier
                    str_pv = str_pv.substring(maxlength);
                });

                //restore maxlength attribute
                $(this).attr('maxlength', opts.first_maxlength);
            });    

       });

       return $(this);
    }
})(jQuery);
于 2013-04-05T03:18:18.540 に答える
2

これはそれほど難しくないはずです...最初のinputにpasteイベントのハンドラーを追加し、要件に従って処理します。

編集

実際には、これは私が思っていたよりもずっとトリッキーです。貼り付けられたテキストを取得する方法がないように思われるからです。このようなものを使用して、この機能をハックする必要があるかもしれません(半作業)...(JSFiddleを参照)。

$(document).on("input", "input[name^=chars]", function(e) {
    // get the text entered
    var text = $(this).val();

    // if 6 characters were entered, place one in each of the input textboxes
    if (text.length == 6) {
        for (i=1 ; i<=text.length ; i++) {
            $("input[name^=chars]").eq(i-1).val(text[i-1]);
        }    
    }
    // otherwise, make sure a maximum of 1 character can be entered
    else if (text.length > 1) {
        $(this).val(text[0]);
    }
});
于 2012-08-03T22:31:11.600 に答える
1

HTML

<input id="input-1" maxlength="1" type="number" />
<input id="input-2" maxlength="1" type="number" />
<input id="input-3" maxlength="1" type="number" />
<input id="input-4" maxlength="1" type="number" />

jQuery

$("input").bind("paste", function(e){
   var pastedData = e.originalEvent.clipboardData.getData('text');
   var num_array = [];
   num_array = pastedData.toString(10).replace(/\D/g, '0').split('').map(Number); // creates array of numbers
   for(var a = 0; a < 4; a++) {  // Since I have 4 input boxes to fill in
     var pos = a+1;
     event.preventDefault();
     $('#input-'+pos).val(num_array[a]);
   }
});
于 2020-04-13T06:22:24.970 に答える
0

カスタムコードを修正する必要があります。maxlength プロパティを削除し、javascript を使用して、入力ごとに 1 つの数値の制限を適用する必要がある場合があります。

dbasemane が示唆するように、貼り付けイベントをリッスンできます。キーアップ イベントをリッスンして、ユーザーが次の入力に切り替えることなく数字を入力できるようにすることもできます。

考えられる解決策の 1 つを次に示します。

function handleCharacter(event) {
    var $input = $(this),
        index = getIndex($input),
        digit = $input.val().slice(0,1),
        rest = $input.val().slice(1),
        $next;

    if (rest.length > 0) {
        $input.val(digit);  // trim input value to just one character
        $next = $('.def-txt-input[name="chars['+ (index + 1) +']"]');

        if ($next.length > 0) {
            $next.val(rest);  // push the rest of the value into the next input
            $next.focus();
            handleCharacter.call($next, event);  // run the same code on the next input
        }
    }
}

function handleBackspace(event) {
    var $input = $(this),
        index = getIndex($input),
        $prev;

    // if the user pressed backspace and the input is empty
    if (event.which === 8 && !$(this).val()) {
        $prev = $('.def-txt-input[name="chars['+ (index - 1) +']"]');
        $prev.focus();
    }
}

function getIndex($input) {
    return parseInt($input.attr('name').split(/[\[\]]/)[1], 10);
}

$('.def-txt-input')
    .on('keyup paste', handleCharacter)
    .on('keydown', handleBackspace);

このコードを jsfiddle にセットアップしたので、その実行方法を確認できます: http://jsfiddle.net/hallettj/Kcyna/

于 2012-08-03T23:07:55.470 に答える