Я написал некоторую HTML-форму, в которой форма должна предупреждать, когда ничего не отправлено. Я начал с создания этого для имен. Как и ожидалось, сообщение «Вы должны указать свое полное имя!» отображается, когда имя не введено. Однако сообщение также появляется, когда имена действительно введены…
{% расширяет "layout.html" %}
{% основной блок %}
<!-- http://getbootstrap.com/docs/4.1/content/typography/ -->
<h1 class = "mb-3">Form</h1>
<!-- http://getbootstrap.com/docs/4.1/components/forms/ -->
<form action = "/form" method = "post" id = "form_id">
<div class = "form-row names">
<div class = "form-group col-md-3 name1">
<label for = "inputFirstname">First name</label>
<input type = "name" autofocus class = "form-control" id = "inputFirstname" placeholder = "First name">
</div>
<div class = "form-group col-md-3 name2">
<label for = "inputLastname">Last name</label>
<input type = "name" class = "form-control" id = "inputLastname" placeholder = "Last name">
</div>
</div>
<div class = "form-row clubs">
<div class = "form-group col-md-3">
<label cfor = "inlineFormCustomSelect">Club preference</label>
<select class = "custom-select" id = "inlineFormCustomSelect">
<option disabled selected value> -- select an option -- </option>
<option value = "1">PSV</option>
<option value = "2">Ajax</option>
<option value = "3">Feyenoord</option>
<option value = "4">De Graafschap</option>
<option value = "5">RKVV Bergeijk 2</option>
</select>
<div class = "invalid-feedback">Please choose one option</div>
</div>
</div>
<div class = "form-group">
<label for = "PFoot">Preferred foot</label>
<label class = "form-check-label">
<input type = "radio" id = "PFoot" name = "algorithm" value = "right">
Right
</label>
<label class = "form-check-label">
<input type = "radio" id = "PFoot" name = "algorithm" value = "left">
Left
</label>
<label class = "form-check-label">
<input type = "radio" id = "PFoot" name = "algorithm" value = "zweipotig">
Zweipotig
</label>
</div>
<!-- http://getbootstrap.com/docs/4.1/components/buttons/ -->
<button class = "btn btn-primary" type = "submit">Submit</button>
</form>
<script>
document.querySelector('form').onsubmit = function() {
if (!document.querySelector('.name1').value) {
alert('You must provide your full name!');
return false;
}
return true;
}
</script>
{% конечный блок%}
Как и ожидалось, сообщение «Вы должны указать свое полное имя!» отображается, когда имя не введено. Однако сообщение также появляется, когда имена действительно введены…
.name1 - это div, который не используется для ввода (.name1 input)



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Вы используете неправильный селектор (.name1), который ссылается на элемент div, а не на ввод, о котором вы думаете. Попробуйте #inputFirstname
document.querySelector('form').onsubmit = function() {
if (!document.querySelector('#inputFirstname').value) {
alert('You must provide your full name!');
return false;
}
else if (!document.querySelector('[name=algorithm]:checked')){
alert('You must provide Preferred foot!');
return false;
}
return true;
}<form action = "/form" method = "post" id = "form_id">
<div class = "form-row names">
<div class = "form-group col-md-3 name1">
<label for = "inputFirstname">First name</label>
<input type = "name" autofocus class = "form-control" id = "inputFirstname" placeholder = "First name">
</div>
<div class = "form-group col-md-3 name2">
<label for = "inputLastname">Last name</label>
<input type = "name" class = "form-control" id = "inputLastname" placeholder = "Last name">
</div>
</div>
<div class = "form-row clubs">
<div class = "form-group col-md-3">
<label cfor = "inlineFormCustomSelect">Club preference</label>
<select class = "custom-select" id = "inlineFormCustomSelect">
<option disabled selected value> -- select an option -- </option>
<option value = "1">PSV</option>
<option value = "2">Ajax</option>
<option value = "3">Feyenoord</option>
<option value = "4">De Graafschap</option>
<option value = "5">RKVV Bergeijk 2</option>
</select>
<div class = "invalid-feedback">Please choose one option</div>
</div>
</div>
<div class = "form-group">
<label for = "PFoot">Preferred foot</label>
<label class = "form-check-label">
<input type = "radio" id = "PFoot" name = "algorithm" value = "right">
Right
</label>
<label class = "form-check-label">
<input type = "radio" id = "PFoot" name = "algorithm" value = "left">
Left
</label>
<label class = "form-check-label">
<input type = "radio" id = "PFoot" name = "algorithm" value = "zweipotig">
Zweipotig
</label>
</div>
<!-- http://getbootstrap.com/docs/4.1/components/buttons/ -->
<button class = "btn btn-primary" type = "submit">Submit</button>
</form>Спасибо! это сработало. Я попробовал это с .inputLastname, но не знал, что для «id» нужен селектор #.
И как это работает с типами радио? else if (!document.querySelector('#PFoot').value) { alert('Вы должны указать предпочитаемую ногу!'); вернуть ложь; } Это не работает
@ProfessorWillow, . для класса и # для id :)
@ProfessorWillow, попробуйте с атрибутом name, например..... if (!document.querySelector('[name=algorithm]:checked')) для переключателя :)
@ProfessorWillow, я включил в ответ условие для переключателя и обнаружил, что он работает соответственно :)
@Манум А, да, спасибо. Забыл удалить .value…. тупой
@Манум извини, поменял
Класс имя1 — это div, а не вход. Затем вы должны использовать (ввод ".name1") в querySelector
document.querySelector('form').onsubmit = function() {
if (!document.querySelector('.name1 input').value) {
alert('You must provide your full name!');
return false;
}
return true;
}
в моем случае это сработало
<script>
document.querySelector('form').onsubmit = function() {
if (!document.querySelector('#inputFirstname').value) {
alert('You must provide your full name!');
return false;
}
return true;
}
Спасибо за ваш ответ, это сработало и со мной. Но теперь я борюсь с типами радио. У вас есть решение для этого?
вы видели здесь stackoverflow.com/questions/10339073/…
querySelectorвозвращает первое вхождение. Вы уверены, что на странице нет другихform? Как всплывающее окно для входа или что-то в этом роде?