【问题标题】:how to prevent a key input from appearing in input field?如何防止按键输入出现在输入字段中?
【发布时间】:2018-10-11 12:07:57
【问题描述】:

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

我写了一个 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);
        }
    }
}

【问题讨论】:

  • 你试过用onkeydown代替吗?
  • 在事件中调用preventDefault() 会阻止角色出现吗? (我不确定,但这是我会尝试的第一件事。)
  • @RobinZigmond:我试过了……没用……
  • @ChrisG:我试过了......但它改变了代码的行为并且不起作用......
  • @RobinZigmond 但这不会阻止用户使用密钥吗? IE。阻止 c 也会阻止 ctrl+c,不是吗?

标签: javascript web-frontend


【解决方案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()">

【讨论】:

  • 不,它不会..."type" number 绝不会让您输入数字!
  • @Abhishek:如果我输入非数字字符,您的解决方案有效,但正如我所说,输入应该小于 100..所以如果我输入 103,3 仍然会出现片刻......另外,如果我输入 10.34,4 也会闪烁片刻..对此有什么想法...?
  • @Abhishek 看,我在运行 sn-p 后在您的文本字段中输入了一个随机字母,并且它很容易在半秒钟内可见。火狐。它确实可以在 Chrome 中使用,但并不是每个人都使用 webkit 浏览器。
【解决方案2】:

更新

您可以存储焦点在输入中时的值。

当用户输入有效百分比(仅限整数)时,替换存储的值。当输入不正确时,只需用旧值替换即可。

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"/>

【讨论】:

  • 在您的解决方案中,如果您在数字后输入字母,则违反条件...
  • @VijayKumar 谢谢!看起来我没有粘贴好的版本的小提琴和代码。我会更新我的答案。欢迎随时发表评论。
  • @VijayKumar 你怎么能这样做?我无法重现。你输入什么?
【解决方案3】:

这似乎可行:

$("#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">

我把 cmets 放在那里,应该是不言自明的。我使用正则表达式将输入与百分比进行匹配。

【讨论】:

  • 您仍然可以使用鼠标粘贴无效值。
  • @Chris G:不起作用...您的解决方案是围绕 event 对象的 preventDefault 方法构建的..但正如我所说,它不会阻止字符出现在输入框中..谢谢时间和精力,虽然..
  • @VijayKumar ...是的,但它是围绕防止keydown 事件而构建的,该事件会停止在其轨道中添加角色。你甚至可以在我的回答中测试这个 live,它对我来说很好用。我不相信这一点。你真的没有尝试过就否决了这个...?
猜你喜欢
  • 1970-01-01
  • 2015-08-16
  • 2019-01-28
  • 2013-09-09
  • 1970-01-01
  • 1970-01-01
  • 2013-06-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多