首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Javascript信用卡字段-每四个字符添加空间- Backspace不能正常工作

Javascript信用卡字段-每四个字符添加空间- Backspace不能正常工作
EN

Stack Overflow用户
提问于 2016-04-12 09:02:34
回答 9查看 32.2K关注 0票数 11

我有一个信用卡字段,当用户输入它的信用卡号码时,我想处理它。假设用户可以输入数字和字母字符,并且必须每四个字符添加一个空格。输入部分工作正常,但我在backspace方面有问题。如果我的游标在一个数字上,用backspace键进行删除是有效的,但是当游标在一个空格上时,它不能很好地工作:在这种情况下,用户必须持有backspace才能正确地删除某些输入。

另一项要求是让剪贴板操作(复制、剪切、粘贴)在该字段上正常工作。

我不能为解决方案使用任何插件(比如JQuery掩码插件),如果可能的话,我也不会直接使用keyCode。

更新的 JS Fiddle:https://jsfiddle.net/ot2t9zr4/10/

片段

代码语言:javascript
复制
$('#credit-card').on('keypress change blur', function () {
  $(this).val(function (index, value) {
    return value.replace(/[^a-z0-9]+/gi, '').replace(/(.{4})/g, '$1 ');
  });
});

$('#credit-card').on('copy cut paste', function () {
  setTimeout(function () {
    $('#credit-card').trigger("change");
  });
});
代码语言:javascript
复制
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<div class="container">
  <form class="" action="" method="post">
    <fieldset>
      <legend>Payment</legend>
      <div class="beautiful-field field-group credit-cart">
        <label class="label" for="credit-card">Credit card</label>
        <input class="field" id="credit-card" value="" autocomplete="off" type="text" />
      </div>
    </fieldset>
  </form>
</div>

EN

回答 9

Stack Overflow用户

回答已采纳

发布于 2016-04-12 09:09:55

只绑定keypress事件并查看。

代码语言:javascript
复制
$('#credit-card').on('keypress change', function () {
  $(this).val(function (index, value) {
    return value.replace(/\W/gi, '').replace(/(.{4})/g, '$1 ');
  });
});

检查这里

票数 31
EN

Stack Overflow用户

发布于 2016-10-01 09:17:52

Steve已经指出了这一点,但是如果您只使用replace()重新格式化整个值,则插入符号位置将始终位于输入值的末尾,如果用户编辑了以前输入的内容,这可能会很烦人。如果插入符位置在其他地方,或者为了用新的数字替换而进行了选择,则会导致不良的用户体验。

尽管如此,消除这种行为的一个好方法是使用一个for循环创建一个自定义替换函数,该循环遍历每个字符,然后您将能够知道插入的空格是否位于当前插入位置之前,如果是这样的话,可以更新位置。

纯javascript解决方案:https://jsfiddle.net/pmrotule/217u7fru/

编辑:我增加了对美国运通格式的支持(15位而不是16位)。

代码语言:javascript
复制
input_credit_card = function(jQinp)
{
    var format_and_pos = function(input, char, backspace)
    {
        var start = 0;
        var end = 0;
        var pos = 0;
        var value = input.value;

        if (char !== false)
        {
            start = input.selectionStart;
            end = input.selectionEnd;

            if (backspace && start > 0) // handle backspace onkeydown
            {
                start--;

                if (value[start] == " ")
                { start--; }
            }
            // To be able to replace the selection if there is one
            value = value.substring(0, start) + char + value.substring(end);

            pos = start + char.length; // caret position
        }

        var d = 0; // digit count
        var dd = 0; // total
        var gi = 0; // group index
        var newV = "";
        var groups = /^\D*3[47]/.test(value) ? // check for American Express
        [4, 6, 5] : [4, 4, 4, 4];

        for (var i = 0; i < value.length; i++)
        {
            if (/\D/.test(value[i]))
            {
                if (start > i)
                { pos--; }
            }
            else
            {
                if (d === groups[gi])
                {
                    newV += " ";
                    d = 0;
                    gi++;

                    if (start >= i)
                    { pos++; }
                }
                newV += value[i];
                d++;
                dd++;
            }
            if (d === groups[gi] && groups.length === gi + 1) // max length
            { break; }
        }
        input.value = newV;

        if (char !== false)
        { input.setSelectionRange(pos, pos); }
    };

    jQinp.keypress(function(e)
    {
        var code = e.charCode || e.keyCode || e.which;

        // Check for tab and arrow keys (needed in Firefox)
        if (code !== 9 && (code < 37 || code > 40) &&
        // and CTRL+C / CTRL+V
        !(e.ctrlKey && (code === 99 || code === 118)))
        {
            e.preventDefault();

            var char = String.fromCharCode(code);

            // if the character is non-digit
            // -> return false (the character is not inserted)

            if (/\D/.test(char))
            { return false; }

            format_and_pos(this, char);
        }
    }).
    keydown(function(e) // backspace doesn't fire the keypress event
    {
        if (e.keyCode === 8 || e.keyCode === 46) // backspace or delete
        {
            e.preventDefault();
            format_and_pos(this, '', this.selectionStart === this.selectionEnd);
        }
    }).
    on('paste', function()
    {
        // A timeout is needed to get the new value pasted
        setTimeout(function()
        { format_and_pos(jQinp[0], ''); }, 50);
    }).
    blur(function() // reformat onblur just in case (optional)
    {
        format_and_pos(this, false);
    });
};

input_credit_card($('#credit-card'));
代码语言:javascript
复制
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<div class="container">
  <form class="" action="" method="post">
    <fieldset>
      <legend>Payment</legend>
      <div class="beautiful-field field-group credit-cart">
        <label class="label" for="credit-card">Credit card</label>
        <input class="field" id="credit-card" value="" autocomplete="off" type="text" />
      </div>
    </fieldset>
  </form>
</div>

票数 11
EN

Stack Overflow用户

发布于 2016-04-12 09:14:16

因为我不能仅仅回复Developer107 107的评论;如果您只想要数字(带有regex并且不想在字段中指定它)。你可以这样做:

代码语言:javascript
复制
$('#credit-card').on('keypress change', function () {
   $(this).val(function (index, value) {
       return value.replace(/[^0-9]/g, "").replace(/\W/gi, '').replace(/(.{4})/g, '$1 ');
   });
});

https://jsfiddle.net/ot2t9zr4/4/

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36568425

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档