У меня возникла проблема, когда пользователь выделяет весь свой ввод в теге, а затем при нажатии клавиши числа, чтобы обновить выбранный ввод, ввод не будет обновляться при достижении максимального размера ввода (это происходит только тогда, когда пользователь выделяет все входное значение). В случае моего кода ниже тип ввода — это число с диапазоном 0-999, а максимальный размер ввода равен 3. Что может быть причиной этой проблемы?

input.js:

table.rows[2].cells[1].innerHTML = "{amp}lt;input type=number id=input name=number min=0 max=999 value={amp}gt;"; document.getElementById("input").addEventListener("input", processInput); document.getElementById("input").onkeypress = function() { if (this.value.length == 3) { return false; } if (event.charCode == 46 || event.charCode == 45) { event.preventDefault(); } }; 

Когда использование выделяет весь ввод, длина все равно 3. Условие if (this.value.length == 3) { становится истинным, а ваша функция возвращает ложное.

Чтобы исправить это:

Вы можете использовать selectionStart и selectionEnd, чтобы проверить, выбрал ли пользователь текст.

 document.getElementById("input").onkeypress = function() { var selectionLength = this.selectionEnd - this.selectionStart; if (this.value.length == 3 {amp}amp;{amp}amp; selectionLength == 0) { return false; } if (event.charCode == 46 || event.charCode == 45) { event.preventDefault(); } }; 

https://stackoverflow.com/a/41233895/6768965

https://jsfiddle.net/vbt6yosr/1/

Похоже, ваша проблема является первым оператором if в этом обработчике onkeypress — если у вас есть 3 символа, обработка не происходит. К сожалению, установка максимального значения на числовом вводе не мешает пользователю вводить большее число (по крайней мере, не в Firefox), равно как и установка свойства maxlength не помогает. Тем не менее, я собрал некоторый JavaScript, который дает почти естественный ответ:

  • ввод дополнительных символов: они показываются мимолетно, но затем обрезаются
  • уменьшение меньше нуля: должно зажимать до нуля
  • обратный интервал должен позволять опустошать поле.

вот оно:

 {amp}lt;script type="text/javascript"{amp}gt; var input = document.querySelector("#input"); var min = parseInt(input.min); var max = parseInt(input.max); input.onkeypress = function(ev) { // I assume the OP has a good reason for ignoring // - and . if (ev.charCode == 46 || ev.charCode == 45) { ev.preventDefault(); return; } }; input.onkeyup = function(ev) { var current = parseInt(input.value); if (current == "") { return; } input.value = clamp(current); } function clamp(value) { if (isNaN(value)) { return ""; } if (value {amp}gt;= min {amp}amp;{amp}amp; value {amp}lt;= max) { return value; } if (value {amp}gt; max) { var str = value.toString(); return str.substr(0, (max   "").length); } return min; } {amp}lt;/script{amp}gt; 

И, конечно, этот сценарий должен быть найден только после ввода, так как предполагается, что ввод существует. Вам также может понадобиться изменить это в соответствии с потребностями нескольких входов, так как я сохранил переменные, такие как ввод, и это минимальное / максимальное значение в глобальных переменных.