Скрытие кнопки викторины с помощью javascript и непринятие пустого ответа с помощью ВВОДА

#javascript #onkeyup #onkeypress

Вопрос:

У меня есть форма, разделенная на 5 частей, как анкета. В конце каждого вопроса есть кнопка для перехода к следующему, однако мне нужно, чтобы кнопка появлялась только в том случае, если пользователь вводит хотя бы 1 число в поле ввода.

Кодекс должен соответствовать тому, что указано ниже:

  1. Не разрешается вводить символы, которые не находятся в диапазоне от 0 до 9.
  2. Если пользователь ничего не вводит и нажимает ENTER, он не может перейти к следующему вопросу.
  3. Если пользователь вводит число, например, 50, и стирает 50, кнопка должна снова исчезнуть.
  4. Если пользователь не пишет никакого числа и выбирает предварительно заполненное число (которое было в кэше браузера), кнопка должна появиться.

Я попробовал два разных кода.

Первые соответствуют 3) и 4), но нет 1) и 2):

 <input required type="text" name="idade_aluno_lp" id="idade_aluno_lp" placeholder="Digite a idade do aluno" onkeyup="check()" />

<div class="text-end mt-3">
  <input type="submit" id="submit2" class="btn btn-primary btn-lg" value="Enviar Resposta" style="display: none;" />
</div>

<script type="text/javascript">
  function check() {
    var count = document.getElementById('idade_aluno_lp');
    if (count.value.length < 2) {
      document.getElementById('submit2').style.display = 'none';
    } else {
      document.getElementById('submit2').style.display = 'block';
    }
  }
</script>
 

Вторые соответствуют 1) и 2), но не 3) и 4):

 <input required type="text" name="idade_aluno_lp" id="idade_aluno_lp" placeholder="Digite a idade do aluno" onkeypress="return justNumbers(event)" maxlength="2" />

<div class="text-center mt-3">
    <input type="submit" id="submit2" class="btn btn-primary btn-lg" value="Enviar Resposta" style="display: none;" />
</div>

<script type="text/javascript">
    function justNumbers(evt2) {
        var age = document.getElementById('idade_aluno_lp');

        var key = evt2.keyCode;

        if (key >= 48 amp;amp; key <= 57) {

            if (age.value.length < 0) {
                document.getElementById('submit2').style.display = 'none';
            } else {
                document.getElementById('submit2').style.display = 'block';
            }

        } else {
            return false;
        }
    }
</script>
 

Я попытался выполнить ту же процедуру, что и выше, onkeyup чтобы выполнить 1), но это не сработало. Я пытался использовать onchange , но это тоже не сработало.

Как я могу это решить?

Ответ №1:

 // Check if the value is a number
function isNumber(str) {
  const regex = new RegExp('^(0|[1-9]\d*) 

 .display-none {
    display: none;
} 
 <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div>
  <input type="text" />
</div>
<div>
  <input type="submit" value="submit" class="display-none" />
</div> 


Попробуйте это, это должно вам помочь.

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

 $('input').on('input', function(e)
 

Заменить на

 $('input').on('change', function(e)                
 

Я использую jquery, но я вижу, что вы используете ванильный js в вопросе.

Как удалить и добавить классы, если вы хотите использовать vanilla js для выражения, вы можете обратиться к следующему коду :

 var element = document.getElementById('elementId');
element.classList.add('className');
element.classList.remove('className');
 

Как добавить прослушиватель элементов, если вы хотите использовать vanilla js для выражения, вы можете обратиться к следующему коду :

 var element = document.getElementById('elementId');
element .addEventListener('change', function(){
  //do something
});
 

Хорошего вам дня 🙂

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

1. Мне нравится твой кодекс. Это довольно легко понять. Я вставил класс CSS и добавил вызов в jQuery, но это не сработало. Кнопка просто не появляется, она не выдает никаких ошибок на консоли. Я новичок на этой платформе, как я могу ввести свой код здесь, не отвечая на свой собственный вопрос?

2. Вы можете повторно отредактировать свой вопрос, перечислить вновь возникшие проблемы ниже или поместить код в комментарии в моем ответе

Ответ №2:

Вам следует добавить <form> тег, который вы можете использовать для проверки правильности ввода, прежде чем разрешить отправку формы. Для этого вы можете использовать ту же check() функцию, но с некоторыми изменениями.

Я изменил onkeyup на oninput , который более точно определяет #4 (пользователь выбирает предложенный вариант автозаполнения).

Когда пользователь нажимает ENTER, он пытается отправить форму, которая обрабатывается onsubmit обработчиком в <form> теге. Это вызывает check() функцию, которая возвращает true , если входные данные являются допустимыми или false недопустимыми. Если он вернется false , это предотвратит отправку формы.

 <form onsubmit="return check()">
    <input required type="text" name="idade_aluno_lp" id="idade_aluno_lp" placeholder="Digite a idade do aluno" oninput="check()" />

    <div class="text-end mt-3">
        <input type="submit" id="submit2" class="btn btn-primary btn-lg" value="Enviar Resposta" style="display: none;" />
    </div>
</form>

<script type="text/javascript">
    function check() {
        var count = document.getElementById('idade_aluno_lp');
        count.value = count.value.replace(/D/, '') // Remove non-digits
        if (
            0 == count.value.length // 0 chars entered
        ) {
            document.getElementById('submit2').style.display = 'none';
            return false;
        } else {
            document.getElementById('submit2').style.display = 'block';
            return true;
        }
    }
</script>
 

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

1. Я отправил только часть кода в вопросе, полный код имеет тег <форма>. Ваш код не соответствует 1), так как он допускает ненумерованные числа (хотя в этом случае кнопка не отображается). Кроме того, код не соответствует 2), я нажал ENTER, и он переходит к следующему вопросу в тесте. Проблема в том, что если пользователь нажмет ENTER и пропустит вопрос, он не сможет отправить форму.

2. @aguyfrombrazil Я обновил свой код, чтобы он не позволял вводить нецифровые числа. Если вы добавите onsubmit="return check()" атрибут в свой <form> тег, он остановит отправку формы.

3. Единственная проблема заключается в том, что если я ничего не заполняю при вводе и нажимаю ENTER, он продолжает переходить к следующему вопросу. Это вопрос 2 из 5, если пользователь нажмет ENTER и достигнет вопроса 5, он не сможет отправить форму, однако вместо того, чтобы создавать больше работы для пользователя, создавая кнопку для возврата к предыдущим вопросам, я хотел бы просто отключить ВВОД без появления кнопки. Я думал о том, чтобы сделать это с помощью кода ключа и if, код ввода равен 13. Что бы вы изменили в своем коде, чтобы решить эту проблему?

4. @aguyfrombrazil Я не понимаю, как нажатие клавиши ENTER может привести к отправке формы, когда поле ввода пусто, поскольку у него есть required атрибут, который будут соблюдать все современные браузеры. Мой JS также предотвращает отправку формы, когда поле ввода пустое (длина == 0), поэтому я все еще не понимаю, как это могло произойти. Возможно, ваш фактический вариант использования значительно отличается от моего примера?

);
return regex.test(str);
}
// Refresh the status of the submit button
function refreshSubmitBtn() {
const val = $('input').val();
const $btn = $('input[type="submit"]');
if(isNumber(val)){
$btn.removeClass('display-none');
}else{
$btn.addClass('display-none');
}
}
// Add input listener
$('input').on('input', function(e) {
e.preventDefault();
refreshSubmitBtn();
});



Попробуйте это, это должно вам помочь.

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


Заменить на


Я использую jquery, но я вижу, что вы используете ванильный js в вопросе.

Как удалить и добавить классы, если вы хотите использовать vanilla js для выражения, вы можете обратиться к следующему коду :


Как добавить прослушиватель элементов, если вы хотите использовать vanilla js для выражения, вы можете обратиться к следующему коду :


Хорошего вам дня 🙂

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

1. Мне нравится твой кодекс. Это довольно легко понять. Я вставил класс CSS и добавил вызов в jQuery, но это не сработало. Кнопка просто не появляется, она не выдает никаких ошибок на консоли. Я новичок на этой платформе, как я могу ввести свой код здесь, не отвечая на свой собственный вопрос?

2. Вы можете повторно отредактировать свой вопрос, перечислить вновь возникшие проблемы ниже или поместить код в комментарии в моем ответе

Ответ №2:

Вам следует добавить <form> тег, который вы можете использовать для проверки правильности ввода, прежде чем разрешить отправку формы. Для этого вы можете использовать ту же check() функцию, но с некоторыми изменениями.

Я изменил onkeyup на oninput , который более точно определяет #4 (пользователь выбирает предложенный вариант автозаполнения).

Когда пользователь нажимает ENTER, он пытается отправить форму, которая обрабатывается onsubmit обработчиком в <form> теге. Это вызывает check() функцию, которая возвращает true , если входные данные являются допустимыми или false недопустимыми. Если он вернется false , это предотвратит отправку формы.


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

1. Я отправил только часть кода в вопросе, полный код имеет тег <форма>. Ваш код не соответствует 1), так как он допускает ненумерованные числа (хотя в этом случае кнопка не отображается). Кроме того, код не соответствует 2), я нажал ENTER, и он переходит к следующему вопросу в тесте. Проблема в том, что если пользователь нажмет ENTER и пропустит вопрос, он не сможет отправить форму.

2. @aguyfrombrazil Я обновил свой код, чтобы он не позволял вводить нецифровые числа. Если вы добавите onsubmit="return check()" атрибут в свой <form> тег, он остановит отправку формы.

3. Единственная проблема заключается в том, что если я ничего не заполняю при вводе и нажимаю ENTER, он продолжает переходить к следующему вопросу. Это вопрос 2 из 5, если пользователь нажмет ENTER и достигнет вопроса 5, он не сможет отправить форму, однако вместо того, чтобы создавать больше работы для пользователя, создавая кнопку для возврата к предыдущим вопросам, я хотел бы просто отключить ВВОД без появления кнопки. Я думал о том, чтобы сделать это с помощью кода ключа и if, код ввода равен 13. Что бы вы изменили в своем коде, чтобы решить эту проблему?

4. @aguyfrombrazil Я не понимаю, как нажатие клавиши ENTER может привести к отправке формы, когда поле ввода пусто, поскольку у него есть required атрибут, который будут соблюдать все современные браузеры. Мой JS также предотвращает отправку формы, когда поле ввода пустое (длина == 0), поэтому я все еще не понимаю, как это могло произойти. Возможно, ваш фактический вариант использования значительно отличается от моего примера?