我有一个信用卡字段,当用户输入它的信用卡号码时,我想处理它。假设用户可以输入数字和字母字符,并且必须每四个字符添加一个空格。输入部分工作正常,但我在backspace方面有问题。如果我的游标在一个数字上,用backspace键进行删除是有效的,但是当游标在一个空格上时,它不能很好地工作:在这种情况下,用户必须持有backspace才能正确地删除某些输入。
另一项要求是让剪贴板操作(复制、剪切、粘贴)在该字段上正常工作。
我不能为解决方案使用任何插件(比如JQuery掩码插件),如果可能的话,我也不会直接使用keyCode。
更新的 JS Fiddle:https://jsfiddle.net/ot2t9zr4/10/
片段
$('#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");
});
});<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>
发布于 2016-04-12 09:09:55
只绑定keypress事件并查看。
$('#credit-card').on('keypress change', function () {
$(this).val(function (index, value) {
return value.replace(/\W/gi, '').replace(/(.{4})/g, '$1 ');
});
});检查这里。
发布于 2016-10-01 09:17:52
Steve已经指出了这一点,但是如果您只使用replace()重新格式化整个值,则插入符号位置将始终位于输入值的末尾,如果用户编辑了以前输入的内容,这可能会很烦人。如果插入符位置在其他地方,或者为了用新的数字替换而进行了选择,则会导致不良的用户体验。
尽管如此,消除这种行为的一个好方法是使用一个for循环创建一个自定义替换函数,该循环遍历每个字符,然后您将能够知道插入的空格是否位于当前插入位置之前,如果是这样的话,可以更新位置。
纯javascript解决方案:https://jsfiddle.net/pmrotule/217u7fru/。
编辑:我增加了对美国运通格式的支持(15位而不是16位)。
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'));<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>
发布于 2016-04-12 09:14:16
因为我不能仅仅回复Developer107 107的评论;如果您只想要数字(带有regex并且不想在字段中指定它)。你可以这样做:
$('#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://stackoverflow.com/questions/36568425
复制相似问题