Javascript 插入“/&引用;在按键事件的MM/YYYY文本框中

Javascript 插入“/&引用;在按键事件的MM/YYYY文本框中,javascript,jquery,html,Javascript,Jquery,Html,当用户输入MM(2位)时,我想输入一个“/”,因此它将类似于MM/YYYY 我也做过类似的信用卡号输入,在按键的4位数字后插入空格 let ccNumber = e.target.value.split(" ").join(""); if (ccNumber.length > 0) { ccNumber = ccNumber.match(new RegExp('.{1,4}', 'g')).join(" "); } e.target.valu

当用户输入MM(2位)时,我想输入一个“/”,因此它将类似于MM/YYYY

我也做过类似的信用卡号输入,在按键的4位数字后插入空格

let ccNumber = e.target.value.split(" ").join("");
      if (ccNumber.length > 0) {
         ccNumber = ccNumber.match(new RegExp('.{1,4}', 'g')).join(" ");
         }
e.target.value = ccNumber;
尝试:

var date=document.getElementById('date');
date.addEventListener('keypress',函数(事件){
var char=String.fromCharCode(event.which),
偏移量=日期。选择开始;
console.log(偏移量)
如果(/\d/.test(char)和&offset<7){
如果(偏移量===2){
偏移量+=1;
}
date.value=date.value.substr(0,偏移量)+char+date.value.substr(偏移量+1);
date.selectionStart=date.selectionEnd=offset+1;
}
如果(!event.keyCode){
event.preventDefault();
}
});
这与

  • 常规键盘输入
  • 复制/剪切/粘贴
  • 选定文本
添加
/
因为您是以编程方式添加
/
字符,所以每当影响新输入值时,必须更新光标位置。如果用户正在粘贴某些内容,则可以是多个字符。大多数代码复杂性都围绕着这个问题

代码中有很多注释,解释了由于
/
而出现的各种情况

完整代码
var date=document.getElementById('date');
日期。addEventListener(“按键”,更新输入);
日期。addEventListener('change',updateInput);
date.addEventListener(“粘贴”,更新输入);
date.addEventListener('keydown',removeText);
日期。addEventListener('cut',removeText);
函数更新输入(事件){
event.preventDefault();
var string=getString(事件);
var selectionStart=this.selectionStart;
var selectionEnd=this.selectionEnd;
var selectionLength=selectionEnd-selectionStart;
var sanitizedString=string.replace(/[^0-9]+/g',);
//如果消毒后未添加任何内容,则不执行任何操作
if(sanitizedString.length==0){
返回;
}
//只粘贴适合的数字
var valLength=date.value.replace(/[^0-9]+//g',).length;
var availableSpace=6—valLength+selectionLength;
//如果选择了“/”,则不应将其计为可用空间
如果(选择开始=3){
可用空间-=1;
}
//删除不合适的号码
if(sanitizedString.length>availableSpace){
sanitizedString=sanitizedString.substring(0,可用空间);
}
var newCursorPosition=selectionEnd+sanitizedString.length-selectionLength;
//如果插入了“/”,则在光标位置添加一个
如果(selectionStart=2){
newCursorPosition+=1;
}
//当前光标位置之前的上一个输入值
var valueStart=date.value.substring(0,this.selectionStart);
//当前光标位置后的上一个输入值
var valueEnd=date.value.substring(this.selectionEnd,date.value.length);
var proposedValue=valueStart+sanitizedString+valueEnd;
//删除任何不是数字的内容
var sanitized=建议值。替换(/[^0-9]+/g');
格式(消毒);
此.setSelectionRange(newCursorPosition,newCursorPosition);
}
函数removeText(事件){
如果(event.key=='Backspace'| | event.type==='cut'){
event.preventDefault();
var selectionStart=this.selectionStart;
var selectionEnd=this.selectionEnd;
var selectionLength=selectionEnd-selectionStart;
//如果在没有选定文本的情况下按backspace键
if(selectionLength==0&&event.type!==cut){
selectionStart-=1;
//如果试图删除,请从“/”之前删除数字`/`
如果(selectionStart==2){
selectionStart-=1;
}
}
var valueStart=date.value.substring(0,selectionStart);
var valueEnd=date.value.substring(selectionEnd,date.value.length);
//添加的帐户`/`
如果(selectionStart==2){
selectionStart+=1;
}
var proposedValue=valueStart+valueEnd;
var sanitized=建议值。替换(/[^0-9]+/g');
格式(消毒);
此.setSelectionRange(selectionStart,selectionStart);
}
}
函数getString(事件){
如果(event.type===‘粘贴’){
var clipboardData=event.clipboardData | | window.clipboardData;
返回clipboardData.getData('Text');
}否则{
返回字符串.fromCharCode(event.which);
}
}
函数格式(已消毒){
var新值;
变量月份=已消毒的子字符串(0,2);
如果(已消毒。长度<2){
新值=月份;
}否则{
var年=消毒子串(2,6);
新值=月+'/'+年;
}
date.value=新值;
}

@RiteshKashyap这里有什么问题吗?它第一次起作用……然后删除文本并重新键入任何值……它将重复,就像键入1一样,然后显示11。您是如何为信用卡号输入字段生成代码的?你知道它是做什么的吗?是的…它在4位数字后添加了一个空格字符,正则表达式将输入文本拆分成4位的数组,然后再次与空格字符连接…所以我需要类似的正则表达式,它只对2位有效,并且从一开始只有一次..正则表达式并不是专门针对数字的。此外,这种类型的自动掩蔽几乎总是侵入时,在按键。