HTML/JavaScript: как использовать оповещение при отправке формы (с селектором запросов)?

Я написал некоторую 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>

{% конечный блок%}

Как и ожидалось, сообщение «Вы должны указать свое полное имя!» отображается, когда имя не введено. Однако сообщение также появляется, когда имена действительно введены…

querySelector возвращает первое вхождение. Вы уверены, что на странице нет других form? Как всплывающее окно для входа или что-то в этом роде?
Pablo Recalde 25.06.2019 10:51

.name1 - это div, который не используется для ввода (.name1 input)

Surya 25.06.2019 10:53
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
2
804
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Вы используете неправильный селектор (.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» нужен селектор #.

Professor Willow 25.06.2019 10:58

И как это работает с типами радио? else if (!document.querySelector('#PFoot').value) { alert('Вы должны указать предпочитаемую ногу!'); вернуть ложь; } Это не работает

Professor Willow 25.06.2019 11:06

@ProfessorWillow, . для класса и # для id :)

Mamun 25.06.2019 11:06

@ProfessorWillow, попробуйте с атрибутом name, например..... if (!document.querySelector('[name=algorithm]:checked')) для переключателя :)

Mamun 25.06.2019 11:12

@ProfessorWillow, я включил в ответ условие для переключателя и обнаружил, что он работает соответственно :)

Mamun 25.06.2019 11:20

@Манум А, да, спасибо. Забыл удалить .value…. тупой

Professor Willow 25.06.2019 11:26

@Манум извини, поменял

Professor Willow 25.06.2019 13:14

Класс имя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;
}

Спасибо за ваш ответ, это сработало и со мной. Но теперь я борюсь с типами радио. У вас есть решение для этого?

Professor Willow 25.06.2019 11:21

вы видели здесь stackoverflow.com/questions/10339073/…

Rohit Kaushik 25.06.2019 11:27

Другие вопросы по теме