防止数字输入的maxLength从最后一个数字上不断变化的值?

时间:2018-02-12 18:23:25

标签: javascript html5 reactjs html5-input-number

我在ReactJS中有一个输入字段,如下所示:

  <input
    type="number"
    onKeyPress={handleKeyPress}
    maxLength={3}
    min="0"
    max="999"
    step=".1"
    onPaste={handlePaste}
  />

以下是该输入的相关函数:

function handleKeyPress(e) {
  if (e.target.value.length > e.target.maxLength) {
    e.target.value = e.target.value.slice(0, e.target.maxLength);
  }

  const key = e.key;
  if (!allowChars(key)) {
    e.preventDefault();
  }
}

function allowChars(charValue) {
  const acceptedKeys = '0123456789';
  return acceptedKeys.indexOf(charValue) > -1;
}

function handlePaste(event) {
  event.preventDefault();
}

现在每次达到3个字符时,第4个字符都可以不断输入。有关示例,请参阅随附的GIF:

input number fail

关于如何防止这种情况的任何想法?我只想让输入字段最多包含3个字符,因此第4个字符甚至不应显示出来。

1 个答案:

答案 0 :(得分:1)

您的问题出现在以下代码片段中:

 if (e.target.value.length > e.target.maxLength) {
    e.target.value = e.target.value.slice(0, e.target.maxLength);
 }

将其更改为:

if (e.target.value.length >= e.target.maxLength) {
    e.target.value = e.target.value.slice(0, e.target.maxLength);
    e.preventDefault();
    return;
}

function handleKeyPress(e) {
    if (e.target.value.length >= e.target.maxLength) {
        e.target.value = e.target.value.slice(0, e.target.maxLength);
        e.preventDefault();
        return;
    }

    const key = e.key;
    if (!allowChars(key)) {
        e.preventDefault();
    }
}

function allowChars(charValue) {
    const acceptedKeys = '0123456789';
    return acceptedKeys.indexOf(charValue) > -1;
}

function handlePaste(event) {
    event.preventDefault();
}
<input
        type="number"
        onKeyPress="handleKeyPress(event)"
        maxLength="3"
        min="0"
        max="999"
        step=".1"
        onPaste="handlePaste(event)"
        />