Вы можете использовать проверку HTML5 для ввода текста, добавив шаблон. Нет необходимости вручную проверять с помощью регулярных выражений или кодов ключей.
<input type="text" pattern="[0-9.]+" />
$("input[type=text][pattern]").on("input", function () {
if (!this.checkValidity())
this.value = this.value.slice(0, -1);
});
Возможно, но не так просто для входов [тип = число] ...
Проблема с [type = "number"] заключается в том, что мы не можем удалить только недопустимый символ в конце. Агенты пользователя возвращают пустую строку всякий раз, когда ввод неверен.
Из спецификации W3C HTML5:
Если значение элемента не является допустимым числом с плавающей запятой, то
вместо этого установите пустую строку.
https://dev.w3.org/html5/spec-LC/number-state.html#number-state
Это означает, что нам нужен способ сохранить предыдущее входное значение вручную.
Таким образом, для числового ввода решение будет выглядеть так:
$("input[type=number], input[type=text][pattern]").on("input", function () {
if (!this.checkValidity())
this.value = $(this).data("current-valid") || "";
else
$(this).data("current-valid", this.value);
});
К сожалению, это не будет работать в IE и EDGE. Нам нужно прибегнуть к шаблонному решению выше для этих браузеров. Тем не менее, вы можете использовать числовые вводы с этим простым многозаполнением.
$("input[type=number]").attr("type", "text").attr("pattern", "[0-9.]+");