如何防止按键输入出现在输入字段中?

时间:2018-10-11 12:07:58

标签: javascript web-frontend

我正在尝试验证文本输入字段中的用户输入。

出于相同的目的,我编写了一个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);
        }
    }
}

3 个答案:

答案 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">

我在此处添加评论,应该很不言自明。我使用正则表达式将输入匹配到一个百分比。