问题描述
我有一个带有可编辑单元格的HTML表(表中的每个td标签都将“ contenteditable”设置为True)。
用户应该使用HH:mm格式的时间填充表格,因此我添加了onkeypress属性,该属性触发一个函数,该函数检查用户是否输入了数字或“:”字符以外的内容,并忽略了该内容如果是这样,就像这样:
HTML
<td contenteditable="true" onkeypress="return isNumberKey(event)"> </td>
JavaScript
function isNumberKey(evt){
let charCode = (evt.which) ? evt.which : event.keyCode;
if (charCode > 31 && (charCode < 48 || charCode > 57) && charCode!=58)
return false;
return true;
}
现在的问题是,用户可以输入5个以上的字符,并可以输入诸如“ 345:678”之类的内容。
我想知道是否有可能将他们可以在单元格中输入的字符数限制为5(就像输入标签的“ maxlength”属性一样),以及是否有可能以某种方式限制用户键入两个数字,然后是“:”字符,然后是另外两个数字。 (即使设置maxlength已经很不错了。)
我还写了一个Regex来检查HH:mm格式,但是在这种情况下我认为它没有用,因为只有在用户键入完整的五个字符之后才能进行测试,对吗?>
以防万一:
const timeRegex = RegExp("^([0-1]?[0-9]|2[0-3]):[0-5][0-9]$");
这里是JSFiddle
解决方法
如果您已经使用JavaScript检查用户可以输入哪些字符到td
中,那么为什么不将当前长度的功能以及其他字符也添加到功能中呢?
F.e。像这样:
function isNumberKey(evt){
let charCode = (evt.which) ? evt.which : event.keyCode;
if (charCode > 31 && (charCode < 48 || charCode > 57) && charCode!=58)
return false;
var currentContent = evt.target.innerHTML;
if (currentContent.length >= 5)
return false;
if (currentContent.length === 2 && charCode !== 58)
return false;
return true;
}
,
我接受@ Ekk4rd的答案,因为他确实使我走上了正确的轨道,但我仍然想发布答案,并给出与问题完全符合的代码。在这里:
HTML
<td contenteditable="true" onkeypress="return isNumberKey(event)"> </td>
JavaScript
function isNumberKey(evt){
let charCode = (evt.which) ? evt.which : event.keyCode;
console.log(evt.target.innerHTML);
if (evt.target.innerHTML == "<br>" || evt.target.innerHTML == " <br>"){
evt.target.innerHTML = "";
}
let currentContent = evt.target.innerHTML;
if (charCode > 31 && (charCode < 48 || charCode > 57) && charCode!=58){
return false;
}
if (currentContent.length >= 5){
return false;
}
if (currentContent.length === 2 && charCode !== 58){
return false;
}
if (currentContent.length != 2 && charCode == 58){
return false;
}
return true;
}
这是JSFiddle