javascript - 如何通过输入应用信用卡格式?
问题描述
在我的 React 组件中,我有输入,人们应该在其中输入他们的信用卡号。我想应用特殊的信用卡格式,即每 4 个数字之间的空格(如 4444 4444 4444 4444 等)。我想在打字时直接并立即输入这种格式。
重要的是,我想阻止键入(和粘贴、拖动和任何其他输入更改的可能性)除数字以外的任何其他字符的可能性。
首先,我添加了 React 的 input onChange 事件函数,它测试输入是否只包含数字。如果是这样,onChange 会执行 Formik 的 handleChange 方法。所以现在我们确定输入的值只包含字母。
问题来自数据格式。我已经为输入值分配了一个函数,该函数返回格式化的数据。所以现在, 44444
我得到了价值,而不是输入的 value 属性4444 4
。
进行此更改后,我无法键入任何其他字符,因为4444 4
值(最后一个字符之间有空格)未通过仅包含字母的测试。
我也没有使用任何其他解决方案。这是我想到的最好的一个。
解决方案
希望这个例子对你有帮助
Array.prototype.forEach.call(document.body.querySelectorAll("*[data-mask]"), applyDataMask);
function applyDataMask(field) {
var mask = field.dataset.mask.split('');
// For now, this just strips everything that's not a number
function stripMask(maskedData) {
function isDigit(char) {
return /\d/.test(char);
}
return maskedData.split('').filter(isDigit);
}
// Replace `_` characters with characters from `data`
function applyMask(data) {
return mask.map(function(char) {
if (char != '_') return char;
if (data.length == 0) return char;
return data.shift();
}).join('')
}
function reapplyMask(data) {
return applyMask(stripMask(data));
}
function changed() {
var oldStart = field.selectionStart;
var oldEnd = field.selectionEnd;
field.value = reapplyMask(field.value);
field.selectionStart = oldStart;
field.selectionEnd = oldEnd;
}
field.addEventListener('click', changed)
field.addEventListener('keyup', changed)
}
Credit Card: <input type="text" value="____ ____ ____" data-mask="____ ____ ____"/><br/>
推荐阅读
- apache-spark - 引起:java.lang.IllegalStateException:已经分配了最多8192页
- angular - Angular / DataTables:TypeError:无法通过 2 个 API 调用读取未定义的属性“aDataSort”
- search - 在 ArrayList 中查找共享数据字段值的多个对象的索引值
- python - 将 Pandas DataFrame 行重构为列
- react-native - KeboardAvoidingView 不适用于独立应用程序 [React Native Expo]
- java - 将json二维数组反序列化为对象列表
- sql - 匹配列 sql 中的正则表达式
- c# - 数据类型,游戏检查器中的链接对象
- c# - .Net Core 2.2 绑定 - 模型属性为空
- kubernetes - 将应用程序部署到 Kubernetes 集群时未找到 ConfigMap