我正在尝试验证文本输入字段中的用户输入。
出于相同的目的,我编写了一个JavaScript函数,该函数在onkeyup
事件中触发。
目标是仅允许用户输入小于数字100
且最多1
小数位的用户输入。
该功能正常工作,但是如果输入无效字符,例如'a'
,它将在输入框中闪烁,然后被删除。
我想要的是,如果输入的字符违反了定义的条件,则该字符不应出现在输入框中(因为它现在闪烁一秒钟)。
这是我的代码:
function validatePercent(event) {
var txt = $("#tds_input").val();
// alert(event.source);
if (!parseInt(txt)) {
$("#tds_input").val('');
}
if (isNaN(txt / 1)) {
txt = txt.substr(0, txt.length - 1);
$("#tds_input").val(txt);
}
if (txt > 100) {
//alert(2);
txt = txt.toString();
txt = txt.substr(0, txt.length - 1);
$("#tds_input").val(txt);
}
txt = txt.toString();
if (txt.indexOf('.') > -1) {
if (txt.substr(txt.indexOf('.') + 1, txt.length).length > 1) {
txt = txt.substr(0, txt.length - 1);
$("#tds_input").val(txt);
}
}
}
答案 0 :(得分:-1)
已更新
您可以在焦点位于输入中时存储the的值。
当用户输入有效百分比(仅整数)时,替换存储的值。输入不正确时,只需用旧值替换即可。
var decimalSeparator = 1.1.toLocaleString().replace(/\d/g, ''),
pattern1 = "^(\\d{1,3})?([",
pattern2 = "]?\\d{1})?$",
regex = new RegExp(pattern1+decimalSeparator+pattern2),
resetContent = function () {
$('#tds_input').val($('#tds_input').data('val'));
},
matchRegex = function (value) {
return value.match(regex);
};
$('#tds_input').bind('focusin', (e) => {
$('#tds_input').data('val', $('#tds_input').val());
});
// handle input (keys, paste)
$('#tds_input').bind('input', (e) => {
let txtValue = $('#tds_input').val();
// input is empty
if (txtValue === "") {
$('#tds_input').data('val', "");
return;
}
// value does not match regex
if (!matchRegex(txtValue)) {
// maybe it ends with the decimal character?
if (txtValue[txtValue.length - 1] === "." && txtValue !== "100.") {
// simulate the user enters a decimal next
if (matchRegex(txtValue + "1")) {
$('#tds_input').data('val', txtValue);
return;
}
}
resetContent();
return;
}
// check between 0 and 100
let value = parseFloat(txtValue);
if (value >= 0 && value <= 100) {
// store new valid number
$('#tds_input').data('val', value);
// put the value as an integer in the input
$('#tds_input').val(value);
return;
} else resetContent();
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input type="text" id="tds_input"/>
答案 1 :(得分:-1)
使用type=number
(而非text
)可以帮助
function validatePercent(event)
{
var txt=$("#tds_input").val();
if(!parseInt(txt))
{
$("#tds_input").val('');
}
if(isNaN(txt/1))
{
txt=txt.substr(0,txt.length-1);
$("#tds_input").val(txt);
}
if(txt>100)
{
txt=txt.toString();
txt=txt.substr(0,txt.length-1);
$("#tds_input").val(txt);
}
txt=txt.toString();
if(txt.indexOf('.')>-1)
{
if(txt.substr(txt.indexOf('.')+1,txt.length).length>1){
txt=txt.substr(0,txt.length-1);
$("#tds_input").val(txt);
}
}
}
input[type=number]::-webkit-inner-spin-button,
input[type=number]::-webkit-outer-spin-button {
-webkit-appearance: none;
margin: 0;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input type="number" id = "tds_input" onkeyup="validatePercent()">
答案 2 :(得分:-2)
这似乎有用:
$("#tds_input").on("keydown", validatePercent)
function validatePercent(e) {
// if key is backspace, arrow, etc, exit here
if (e.originalEvent.key.length > 1) return;
// compose new value
var val = $("#tds_input").val();
if (val.length == 0) val = e.originalEvent.key;
else {
val = val.split('');
val.splice(e.target.selectionStart, 0, e.originalEvent.key);
val = val.join('');
}
// if value is ok, exit here
if (val.match(/^\d{1,3}\.?\d?$/) && parseFloat(val) <= 100) return;
// stop event
e.preventDefault();
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input id="tds_input">
我在此处添加评论,应该很不言自明。我使用正则表达式将输入匹配到一个百分比。