【发布时间】: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,并分配回输入字段。
有没有办法让这两者都起作用?
【问题讨论】:
-
除零前缀数字外的所有要求均可通过
<input type="number" step="1" />获取 -
为什么需要 1e?在我看来,就像两个独立的问题。您需要一个只允许 0-255 的输入和另一个支持
1e的输入。但是,我认为您不会希望 RGB 输入接受1e之类的东西,对吧? -
@KevBot 如果我想在另一个需要使用指数值的项目中使用此功能,我将再次面临这个问题。那么为什么现在忽略它呢?
-
因为您不想在 RGB 值中接受
1e,这似乎就是这个问题的意义所在。它们是两个不同的东西。 -
我需要一个尊重最小值和最大值的解决方案。这很简单。
标签: javascript html validation input