卡号正则表达式和插入符号/光标位置(javascript)
Card Number Regex and caret/cursor position (javascript)
我有一个正则表达式,将信用卡号码分成4组,每组4位数字。
正则表达式工作得很好,但如果我想回到字符串并编辑它,光标会跳到所选内容的末尾。
<input id= "cardNumber" maxlength="19" type="tel"/>
JS如下:
document.getElementById('cardNumber').addEventListener('input', function (e) {
var field = e.target;
field.value = field.value.replace(/[^'dA-Z]/g, '').replace(/(.{4})/g, '$1 ').trim();
});
显然我不希望光标跳转到条目的末尾。我一直在玩插入符号的位置,选择开始和结束,但没有运气到目前为止。
任何提示都非常感谢。
见此处:https://jsfiddle.net/oo7Ljm4j/1/
你可以使用keyup检查回车键是否按下,什么也不做
document.getElementById('cardNumber').addEventListener('keyup', function (e) {
var key = event.which || event.keyCode || event.charCode;
var field = e.target;
if (key !== 8) {
field.value = field.value.replace(/[^'dA-Z]/g, '').replace(/(.{4})/g, '$1 ').trim();
}
});
DEMO
或
你可以在文本输入的每个关键事件中使用create一个函数来完全禁用非整数字符,并防止粘贴非整数字符
document.getElementById('cardNumber').addEventListener('keyup', format);
document.getElementById('cardNumber').addEventListener('keydown', format);
document.getElementById('cardNumber').addEventListener('copy', format);
document.getElementById('cardNumber').addEventListener('keypress', format);
function format(e) {
var key = event.which || event.keyCode || event.charCode;
var field = e.target;
if (key !== 8) {
field.value = field.value.replace(/[^'dA-Z]/g, '').replace(/(.{4})/g, '$1 ').trim();
}
}
演示也可以接受箭头,如果在这种情况下添加这个条件
(key < 37 || key > 39)
那么你的条件将是这样的
if (key !== 8 && (key < 37 || key > 39)) {
field.value = field.value.replace(/[^'dA-Z]/g, '').replace(/(.{4})/g, '$1 ').trim();
}
演示好了,经过一番挖掘,我找到了答案!
通过使用field。selectionEnd并在每次输入时重置它,它将光标保持在您想要编辑的位置。
问题源于这样一个事实,即当您对其进行更改时,regex将重新呈现和更新整个字段(因此,很明显,当浏览器每次认为您已经完成时,regex触发时,光标默认为值的末尾。)
document.getElementById('cardNumber').addEventListener('input', function (e) {
var field = e.target, position = field.selectionEnd, length = field.value.length;
field.value = field.value.replace(/[^'dA-Z]/g, '').replace(/(.{4})/g, '$1 ').trim();
field.selectionEnd = position += ((field.value.charAt(position - 1) === ' ' && field.value.charAt(length - 1) === ' ') ? 1 : 0);
});
这样,我们告诉光标在每次输入时重新计算它的selectionEnd位置。
查看工作的JSFiddle aqui: https://jsfiddle.net/oo7Ljm4j/6/
相关文章:
- 自定义函数中的光标位置
- jQuery/Javascript>on单击将文本放置在最后一个已知的光标位置
- 当用户单击按钮(在光标位置)时,在输入字段中添加一个文本字符串
- 如何在按键事件发生后获取文本光标的位置
- 内容可编辑分区-根据内部HTML位置的光标位置
- 保持光标位置元素在顶部使用 svg
- 保存键控触发器时保持光标位置的最佳做法
- 如何在java脚本中获取光标位置
- 获取光标位置或光标在 TinyMCE 中的行数
- 如何在每次页面重新加载时更改渐变背景,同时保持光标位置元素处于活动状态
- 在Chrome中,光标位置异常地位于输入值的末尾
- 在光标位置的文本区域中插入一个字符串,并进行一些更改
- 如何从谷歌地图事件访问光标位置(即页面的x和y轴)
- 如何在光标所在的位置绘制线条?HTML5画布使用MrDoob's和谐
- 如何在网页加载asp.net上显示文本框中第二个字母的光标位置
- 当前光标位置(百分比)
- GWT:如何从当前光标位置或所选文本中获取css样式的属性
- 在光标位置插入HTML,并使用javascript将光标移动到插入的HTML的末尾
- jQuery:使用插件Tipsy将工具提示附加到鼠标光标位置
- 不带HTML的光标位置需要转换为带HTML的位置