【问题标题】:Is there any way to prevent input type=“number” getting more than one dot values?有什么方法可以防止 input type=“number” 获得多个点值?
【发布时间】:2016-09-29 13:50:15
【问题描述】:

我只想获得十进制值,例如 1.5、0.56 等,但它允许多个点。有什么办法可以预防

【问题讨论】:

  • 只有 HTML?不。但是使用 JavaScript 并不是一种罪过。
  • 用 JavaScript 没问题。
  • 这些提交到哪里去了?也许您可以使用仅选择第二个点之前的元素发送的数字吗?
  • 不需要 javascript,因为 html5 有 pattern 属性,检查我的答案
  • 是否有任何答案满足您的需求?如果是这样,您能否将您选择的答案标记为已接受或发表评论?

标签: javascript html css angularjs


【解决方案1】:

我有最简单的代码来防止多个点,它还可以防止一些其他无效值:

$('input[type=number]').on('keydown', function (e) {
    var keyCode = e.keyCode || e.which;

    if ((keyCode == 190 || keyCode == 110) && (e.currentTarget.validity) && (!e.currentTarget.validity.valid))
    {
        e.preventDefault();
        return false;
    }
});

【讨论】:

    【解决方案2】:

    我知道,它是旧的。我不确定您是否需要检查 indexOf 等过于复杂的解决方案...

    我需要(以及我在这里展示的)是限制用户输入(正/负)数字,最多 2 个小数,没有字母,没有双点或其他东西。

    <input type="text" value="0"/>
    
    $("input").on('input', function(e){
        let {value} = e.target;
        let processedValue = value
                .replace(/[^\d.\-]/, "")
                .replace(/^([\-]{0,1})(\d*)((\.\d{0,2}){0,1})(.*)$/g, "$1$2$3")
        $("input").val(processedValue);
      });
    

    我的正则表达式可能有点粗糙,但它有效。简而言之,它正在清理任何不是数字和点的东西,然后只用点的第一部分。

    【讨论】:

      【解决方案3】:

      原分享here

      你可以找到非常详细的解释in this Codepen

      这个解决方案很简单,并且只允许在数字字段中使用一个点。它不会阻止点击返回号码并在"." 之前添加号码。它不会阻止执行浏览器键盘快捷键,例如刷新、复制和粘贴(只要粘贴的值是有效数字)等。它将允许在数字正文中添加".",但会删除任何超出设置限制的浮动。

      我仍然无法阻止的唯一行为是,如果您在输入结束时反复按点键,点会闪烁。发生这种情况是因为"13." 的类型化值是有效数字并返回"13",而"13.." 的类型化值不是并返回“”。在我的解决方案中,如果一个值返回"" 而没有按退格键或删除键,它会回滚到最后一个有效值,即"13",它是从键入的值"13." 获得的。

      我已经尝试过解决方案,如果一个点被按下一次,它会被阻止第二次触发,但每次我设法在已经存在的点之后按下点,然后什么都没有,然后得到除非我先按任何其他键,否则无法键入点。

      我认为多次按下时闪烁是最好的解决方案,因为用户无法键入一个点而没有任何反应。

      let lastValidInputValue;
      let selectedDot = false;
      
      
      const onKeypress = (e) => {
        if (e.key === "." && e.target.value.indexOf(".") !== -1 && !selectedDot) e.preventDefault();
        selectedDot = false;
      
        if (e.key === "e") e.preventDefault();
      };
      
      
      const onInput = (e) => {
        if (
          e.target.value.indexOf(".") < e.target.value.length - e.target.getAttribute("data-toFixed") - 1 &&
          e.target.value.indexOf(".") !== -1
        ) {
          let newValue;
          newValue = e.target.value.slice(
            0,
            e.target.value.indexOf(".") +
              parseInt(e.target.getAttribute("data-toFixed")) +
              1
          );
          newValue = parseFloat(newValue);
          e.target.value = newValue;
        }
        if (e.target.value !== "") {
          lastValidInputValue = e.target.value;
        } else if (e.inputType.match(/delete/g)) {
          lastValidInputValue = "";
        } else {
          e.target.value = lastValidInputValue;
        }
      };
      
       const onSelect = (e) => {
         if(window.getSelection().toString().indexOf(".") > -1) selectedDot = true;
       }
      &lt;input type="number" id="myNumber" name="myNumber" data-toFixed="2" step="any" onkeypress="onKeypress(event)" oninput="onInput(event)" onselect="onSelect(event)"&gt;

      【讨论】:

        【解决方案4】:

        你可以使用pattern属性:

         <input type="text" pattern="[0-9]+([\.,][0-9]+)?">
        

        它将允许带有单个点甚至逗号的模式(例如欧洲小数)。要删除逗号,应该是:

         <input type="text" pattern="[0-9]+([\.][0-9]+)?">
        

        【讨论】:

        • 仍然允许多个点
        • 你可以写任何东西,但是如果你写了一些超出模式的东西,输入将无效并且表单将不会被提交。这就是新的 HTML5 表单的工作方式。在我看来,比使用 javascript 控制输入要好。
        • 没有模式的数字类型已经是这样了。我在这里看不到任何额外的好处。
        • @trincot 正确,输入模式不适用于 input type="number" - w3schools.com/tags/att_input_pattern.asp
        【解决方案5】:

        您可以使用 JavaScript 捕捉输入值的任何变化,并检查 inputAsNumber 属性是否仍然是有效数字。如果没有,您可以恢复到以前的值:

        restoreData = {};
        
        inp.oninput = preventTwoDots;
        restoreData['inp'] = inp.value;
        
        function preventTwoDots() {
            if (isNaN(this.valueAsNumber) && this.selectionStart) {
                this.value = restoreData['inp'];
            }
            restoreData['inp'] = this.value;
        }
        &lt;input type="number" id="inp"&gt;

        selectionStart 的额外检查确保您仍然可以删除所有数字:空输入被视为无效数字,但无法从输入中删除最后一个字符会很奇怪。

        备注

        尽管这是您在问题中提出的要求,但请注意,阻止用户输入并不是特别方便用户。当输入无效时(在提交值时,例如当您离开输入字段时),浏览器会提供视觉线索,这通常是应该如何完成的。您不希望人们认为他们的键盘出现故障,或者让他们认为剪贴板是空的,因为他们的复制/粘贴“不起作用”。

        【讨论】:

          猜你喜欢
          • 2011-11-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-12-09
          • 2023-04-01
          • 1970-01-01
          • 2018-05-14
          • 1970-01-01
          相关资源
          最近更新 更多