Функция для разрешения только числового ввода, не возвращающего false через addEventListener

#javascript #dom-events #addeventlistener

#javascript #dom-события #addeventlistener

Вопрос:

В моем внешнем JS-файле у меня есть следующий код для отключения нечислового ввода пользователем:

 function numericInput(evt) {
   var charCode = (evt.which) ? evt.which : event.keyCode
    if (charCode > 48 || charCode < 57)
    {
        return true;
    } 
    else 
    {
       return false;
    }
 }
  

Я хочу добавить эту функцию через addEventListener и я сделал следующее:

 document.getElementById("myTextbox").addEventListener("keypress", function (evt) {
    numericInput(evt);
}, false);
  

Что я делаю не так?

Комментарии:

1. Почему важно, что возвращает эта функция, что вы пытаетесь сделать?

2. @adeneo Я хочу запретить пользователю использовать нечисловые клавиши, если они вводят «a», что в текстовом поле ничего не происходит

3. Попробуйте заменить return false на evt.preventDefault()

Ответ №1:

Часть charCode > 48 || charCode < 57 в вашем if-операторе фактически всегда возвращает true . Это потому, что каждое число больше 48 или меньше 57. Я думаю || , что должно было быть amp;amp; . Другое дело, наименьший код ключа для числа равен 48, который не включается, если вы заменяете || на amp;amp; . Самый большой код ключа для числа, 57, не является ни тем, ни другим.

Я думаю, что ваш код будет работать правильно, если вы замените charCode > 48 || charCode < 57 на charCode >= 48 amp;amp; charCode <= 57 .

РЕДАКТИРОВАТЬ: как упоминалось ранее, вы должны заменить return false на evt.preventDefault() .

Эта функция должна работать:

 function numericInput(evt) {
   var charCode = (evt.which) ? evt.which : event.keyCode
    if (charCode >= 48 amp;amp; charCode <= 57)
    {
        return true;
    } 
    else 
    {
       evt.preventDefault();
    }
 }

/*    OR:    */


function numericInput(evt) {
  var charCode = (evt.which) ? evt.which : event.keyCode
    if (charCode < 48 || charCode > 57) evt.preventDefault();
 }