【问题标题】:Strict number input field严格的数字输入字段
【发布时间】:2016-08-30 18:45:03
【问题描述】:

我有一个类型设置为数字的简单输入字段。这将用于在 [0,255] 范围内输入输入(对于 RGB)。

<input type="number" id="inputBox" min="0" max="255" step="1" />

在其当前形式中,此输入字段将接受以下值:

012   // zero prefixed numbers
1.0   // floating-point
.1    // floating-point
-5    // range underflow
300   // range overflow

我希望它只接受 [0,255] 范围内的整数。所以,没有零前缀,没有浮点数。

我已经使用input 事件解决了范围问题:

inputBox.addEventListener("input", function () {
    if (this.validity.rangeUnderflow) {
        this.value = this.min;
    }
    else if (this.validity.rangeOverflow) {
        this.value = this.max;
    }
});

和使用keydown事件的浮点问题(不允许.):

inputBox.addEventListener("keydown", function (e) {
    if (!isFloat(this.step)) {
        if (e.key == ".") {
            e.preventDefault();
        }
    }
});

function isFloat(f) {
    var f        = parseFloat(f);
    var floor    = Math.floor(f);
    var fraction = f - floor;
    if (fraction > 0) {
        return true;
    }
    return false;
}

我一直在解决零前缀数字问题。我可以在input 事件中使用以下代码行来删除零前缀

this.value = this.valueAsNumber; // or parseInt(this.value, 10)

这工作正常,但这种破坏了输入字段的功能。我无法使用 E 表示法输入值。就我而言,我不需要,但我可能会在其他地方。只要我输入1e,它就会计算为NaN,并分配回输入字段。

有没有办法让这两者都起作用?

JSFiddle

【问题讨论】:

  • 除零前缀数字外的所有要求均可通过&lt;input type="number" step="1" /&gt;获取
  • 为什么需要 1e?在我看来,就像两个独立的问题。您需要一个只允许 0-255 的输入和另一个支持 1e 的输入。但是,我认为您不会希望 RGB 输入接受 1e 之类的东西,对吧?
  • @KevBot 如果我想在另一个需要使用指数值的项目中使用此功能,我将再次面临这个问题。那么为什么现在忽略它呢?
  • 因为您不想在 RGB 值中接受 1e,这似乎就是这个问题的意义所在。它们是两个不同的东西。
  • 我需要一个尊重最小值和最大值的解决方案。这很简单。

标签: javascript html validation input


【解决方案1】:

我刚刚解决了这样一个问题。超级简单:

inputBox.addEventListener("keydown", function (e) {
    if (!isFloat(this.step)) {
        if (e.key == ".") {
            e.preventDefault();
        }
    }
    while ( this.value.toString()[0] === "0" && this.value.length > 0){
       this.value = this.value.toString().slice(1);
    }

});

请注意,该字段的值可能会以keydown 事件以外的方式发生变化,就像paste 一样糟糕。所以我会将这些检查放在一个函数中,validationCheck,并为每个相关事件运行该函数,包括全部 - onchange

【讨论】:

  • 开头可能有多个零。这需要进一步检查。
【解决方案2】:

您可以使用正则表达式,例如:

<input type="text" pattern="0|[1-9]\d*">

这将为您提供一个不带前缀零的正整数的字符串表示形式。 然后,您必须使用 JavaScript 测试该值是否小于或等于 255。

这是JSFiddle。 不接受只有多个零的字符串。

【讨论】:

  • 我仍然可以添加多个零。我添加了一个jsfiddle。你可以测试一下。
  • 我不知道这是否重要,但我没有使用表单。我没有向服务器发送任何数据。这是一个客户端应用程序。输入到该字段的数据是实时使用的。
  • 这个没关系,验证是由浏览器完成的。您可以在本地使用它。
  • 不,我的意思是我没有提交按钮。验证应该在我输入值时进行。
  • 如果需要,您可以有一个隐藏的提交按钮来触发验证。看stackoverflow.com/questions/7548612/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-24
  • 2019-02-21
  • 2021-11-30
  • 1970-01-01
  • 2017-04-19
  • 1970-01-01
相关资源
最近更新 更多