#javascript #onkeyup #onkeypress
Вопрос:
У меня есть форма, разделенная на 5 частей, как анкета. В конце каждого вопроса есть кнопка для перехода к следующему, однако мне нужно, чтобы кнопка появлялась только в том случае, если пользователь вводит хотя бы 1 число в поле ввода.
Кодекс должен соответствовать тому, что указано ниже:
- Не разрешается вводить символы, которые не находятся в диапазоне от 0 до 9.
- Если пользователь ничего не вводит и нажимает ENTER, он не может перейти к следующему вопросу.
- Если пользователь вводит число, например, 50, и стирает 50, кнопка должна снова исчезнуть.
- Если пользователь не пишет никакого числа и выбирает предварительно заполненное число (которое было в кэше браузера), кнопка должна появиться.
Я попробовал два разных кода.
Первые соответствуют 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), поэтому я все еще не понимаю, как это могло произойти. Возможно, ваш фактический вариант использования значительно отличается от моего примера?