美国运通;CC格式化Javascript-让我们一劳永逸地解决这个问题

美国运通;CC格式化Javascript-让我们一劳永逸地解决这个问题,javascript,credit-card,Javascript,Credit Card,我试图在用户将信用卡输入字段时格式化信用卡。我已经阅读了关于堆栈溢出的每一个主题,查看了大量的站点、大量的库以及它们背后的代码。我想创建一个简单的函数,当用户使用香草JAVASCRIPT将信用卡键入字段时,该函数将格式化信用卡。下面的一些代码来自这里关于堆栈溢出的主题,但是没有一个线程解决了当用户在字段中键入时执行此操作的特定问题 问题:默认情况下,当用户在给定的信用卡字段中键入时,它会通过在数字之间加空格来更改值,在输入所有数字之前,它不会验证为美国运通卡,因此在完成之前不会调整格式。我尝试过

我试图在用户将信用卡输入字段时格式化信用卡。我已经阅读了关于堆栈溢出的每一个主题,查看了大量的站点、大量的库以及它们背后的代码。我想创建一个简单的函数,当用户使用香草JAVASCRIPT将信用卡键入字段时,该函数将格式化信用卡。下面的一些代码来自这里关于堆栈溢出的主题,但是没有一个线程解决了当用户在字段中键入时执行此操作的特定问题

问题:默认情况下,当用户在给定的信用卡字段中键入时,它会通过在数字之间加空格来更改值,在输入所有数字之前,它不会验证为美国运通卡,因此在完成之前不会调整格式。我尝试过在没有空格的情况下转换值,并在每个周期重新测试,但没有效果

function cc_format(v) {
        //Strip the field value of spaces.
        amextest = v.replace(/\s/g, '');
        //Test if the card is an american express each cycle
        if(/3[47]\d{2}[ -]*\d{6}[ -]*\d{5}/.test(amextest))
        {
         //This is some borrowed code to format american express cards - http://stackoverflow.com/questions/27322733/javascript-regex-format-string-containing-american-express-card-number
            v.replace(/\b(\d{4})(\d{6})(\d{5})\b/, '$1-$2-$3');
            return v;
        }
        else 
        {
           //This properly formats every other card type as its being typed.
            var v = v.replace(/[^\d]/g, '').match(/.{1,4}/g);
            return v ? v.join(' ') : '';
        }
    }

    //This binds the function to an input
    document.getElementById('credit_card').oninput = function() {
        this.value = cc_format(this.value)
    }

我呼吁堆栈溢出之神,请帮我一劳永逸地完成这项工作

EDIT:忘记了OP想要的纯JS。我将把这个留给子孙后代,但这显然不是一个答案

您可以尝试在前两个数字上进行匹配,然后在第四个数字后自动更新输入(并防止输入超过17个字符(15个数字和2个破折号):

$('#cc')。在('keyup',function()上{
var amexTest=$(this.val().replace(//g',);
if(amexTest.match(/^3[47]\d{2}/){
如果(amexTest.length==4){
amexTest+='-';
$('cc').val(amexTest);
}
如果(amexTest.length==11){
amexTest+='-';
$('cc').val(amexTest);
}
如果(最大长度>17){
val=$(this.val().substr(0,$(this.val().length-1);
$(this).val(val);
}
}否则{
如果(最大长度>16){
val=$(this.val().substr(0,$(this.val().length-1);
$(this).val(val);
}
如果(amexTest.length==16){
var splits=amexTest.match(/\d{4}/g);
val=拆分连接(“”);
$(this).val(val);
}
}
});


只需检查前两位数字。如果是
34
37
请使用美国运通格式,否则请使用标准格式。这接近于我所寻找的格式,它并不完美,但我正在努力解决它。那么,道具!你有没有可能包括其他格式?我已经尝试将其改编成这种格式,但它正在生成我们的格式税务局行为在其他每种卡类型中添加逗号。$(“#信用卡”).on('input',function(){var amexTest=$(this).val().replace(//g,);if(amexTest.match(//^3[47]\d{2}/){if(amexTest.length==4){amexTest+='-';$(this).val(amexTest);}if(amexTest.length==11){amexTest+-$(this).val(amexTest);}if(amexTest.length>17){val=$(this.val().substr(0,$(this.val().length-1);$(this.val(val);}}}else{var v=$(this.val().replace(/[^\d]/g')。match(/.{1,4}/g);v?v.join(''):'';$(this.val(v);}});更新为在非美国运通卡中每四个数字后添加空格。