【问题标题】:How to detect up and down clicks on html input[number]?如何检测html输入[数字]的上下点击?
【发布时间】:2017-05-21 08:29:16
【问题描述】:

我有一个 html <input type="number"> 框,其中包含一些自定义验证逻辑。有效值是任何整数 x,其中 x < -100x >= 100

我的目标是实现这种行为:

  1. 当用户点击原生向下箭头或按下向下箭头键,当前值为100时,值变为-101
  2. 同理,当用户点击原生向上箭头或按下向上箭头键,当前值为-101时,该值变为100

一些注意事项:

  • 用户必须仍然能够键入无效范围内的数字,因为他们可能需要键入10 才能键入109。并且已经为此进行了验证逻辑。
  • 我正在使用 angularjs,但我怀疑该解决方案不会针对特定角度。
  • 这是一个内部应用程序,仅适用于 Chrome,因此浏览器特定的答案很好。

【问题讨论】:

    标签: html angularjs html-input


    【解决方案1】:

    我不确定我是否得到了你想要的。是这样的吗?

    	var number = document.getElementById('number-input');
    	number.onchange = function(event) {
    		if(number.value > 100) {
    			number.value = -101;
    		} else if(number.value < -100) {
    			number.value = 101;
    		}
    	};
    &lt;input type="number" id="number-input"&gt;

    【讨论】:

    • 这是正确的方向,但这不起作用。你有 切换。从-10099无效100 和更多或-101 和更少是有效。因此,我们需要知道文本框是递增还是递减。为此,我们需要知道之前的值是什么。
    【解决方案2】:

    我想我有你需要的,或者至少我已经接近了:

    window.onload = function() {
      function changeNum(input, typing) {
        var lower=-101, upper=100, x=parseInt(input.value), active=(input==document.activeElement);
        if ((typing && String(Math.abs(x)).length>2 && lower<x&&x<upper) || (!typing && lower<x&&x<upper)) {
          if (Math.abs(x-upper) < Math.abs(x-lower)) {input.value = (!active||typing?upper:lower);}
          else {input.value = (!active||typing?lower:upper);}
        }
      }
      document.getElementById("num").addEventListener("keyup",function(){changeNum(this,true);},false);
      document.getElementById("num").addEventListener("change",function(){changeNum(this,false);},false);
    };
    &lt;input type="number" id="num" value="100" /&gt;
    jsfiddle: https://jsfiddle.net/9zz0ra35/4/
    codepen: http://codepen.io/anon/pen/Ndqbog
    • 当用户单击输入的向上和向下按钮时,值会在上下阈值(-100 -&gt; 10099 -&gt; -101)上翻转。
    • 当用户键入一个值然后在输入之外单击时,无效值将更改为最接近的阈值(-100 -&gt; -10199 -&gt; 100)。
    • 在键入时,无效值也会更改为最接近的阈值,但前提是 value.length 大于 2 个字符 (-100 -&gt; -101)。
      • 最后一个不像其他的那样干净,因为它仅在下阈值和上限阈值具有相同长度(在本例中为 3 个字符)时才有效。
        但是如果您需要不同长度的阈值,您可以随时将String(Math.abs(x)).length&gt;2 更改为额外的 if 子句并首先检查该值是正数还是负数,然后检查不同的长度。

    【讨论】:

    • 是的。这行得通。代码本身可以做一些清理工作,但解决方案是正确的。谢谢!
    • @AndrewEisenberg 你能不能用你的清理版本更新我的jsfiddle 并评论链接?我总是喜欢学习如何改进我的编码
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多