Ошибка в функции JQuery для проверки обязательных полей в настраиваемых раскрывающихся списках

Я создал функцию JQuery для проверки наличия пустых обязательных полей в закрытом настраиваемом раскрывающемся списке.

Если обязательное поле пусто внутри одного из раскрывающихся списков, и если раскрывающийся список в настоящее время закрыт, я хочу, чтобы раскрывающийся список открывался, и если в обязательных полях нет пустых значений, я хочу, чтобы раскрывающийся список закрылся.

Проблема в том, что обязательные поля недоступны, если раскрывающиеся списки закрыты, и я попытался решить эту проблему с помощью этой функции.

По какой-то причине он проверяет эти поля ввода только в том случае, если форма отправлена ​​хотя бы один раз, а обязательные поля открываются хотя бы один раз.

find(':input[required]') не выдает никаких результатов, если раскрывающийся список не открывается хотя бы один раз. Как только вы открываете и закрываете раскрывающийся список, функция работает.

Это функция:

function dropdown_required() {
    var required = 0;
    $('#visible_fields').find(':input[required]').each(function () {
        if (!this.value) {
            for (var i = 1; i < 15; i++) {
                $('.form_' + i).find(':input[required]').each(function () {
                    $(this).prop('required', false);
                });
            }
            required++;
        }
    });

    if (required == 0) {
        for (var i = 1; i < 15; i++) {
            var empty = 0;
            $('.form_' + i).find(':input[required]').each(function ()
             {
                if (!this.value) {
                    empty++;
                }
            });

            if (empty !== 0) {
                if ($(".arrow_" + i).hasClass("rotate_2")) {
                    $(".arrow_" + i).addClass("rotate_1").removeClass("rotate_2");
                    $(".form_" + i).fadeToggle();
                }

            } else if ($(".arrow_" + i).hasClass("rotate_1")) {
                $(".arrow_" + i).addClass("rotate_2").removeClass("rotate_1");
                $(".form_" + i).fadeToggle();
            }
        }
    }
}

Это HTML:

<form method = "POST" autocomplete = "off" enctype = "multipart/form-data" target = "_self"
          action = "/contacten/leveranciers/iframe{{ ($leverancier == null ? '' : '/' . $leverancier->cot_id) }}">
        {{ csrf_field() }}

<div id = "visible_fields">
<div class = "row">

            <div class = "col-xs-6">
                <div class = "form-group">
                    <label for = "organisatie">Organisatie</label>
                    <input type = "text" name = "organisatie" id = "organisatie" blocked = ",;()/" hk = "a"
                           value = "{{ ($leverancier == null ? old('organisatie') : $leverancier->cot_organisatie) }}"
                           class = "form-control inputblocked">
                </div>
            </div>
            <div class = "col-xs-6">
                <div class = "form-group">
                    <label for = "postcode">Postcode</label>
                    <input type = "text" name = "postcode" id = "postcode" filter = "a-zA-Z0-9" maxlength = "6"
                           value = "{{ ($leverancier == null ? old('postcode') : $leverancier->cot_postcode) }}"
                           class = "form-control inputfilter filter_postcode">

                </div>
            </div>
        </div>
//all visible input fields outside of the dropdowns
</div>
<label class = "toggle_1">Controles<span class = "arrow_1 glyphicon glyphicon-menu-left"
                                                       aria-hidden = "true"></span></label>
                <div class = "form_1">
                    <div class = "row">
                        <div class = "col-xs-6">
                            <div class = "form-group">
                                <label for = "bkr">BKR</label>
                                <select name = "bkr" class = "form-control" required>
                                    <option selected hidden></option>

<option value = "10">BKR toetsing open</option>

<option value = "11">BKR toetsing accoord</option>

<option value = "12">Vrijgesteld van BKR toetsing</option>

</select>
                            </div>
                        </div>
                        <div class = "col-xs-6">
                            <div class = "form-group">
                                <label for = "bkr_bestand">BKR bestand</label>
                                <input type = "file" name = "bkr_bestand" id = "bkr_bestand"
                                       data-default-file = ""
                                       class = "form-control dropify">
                                <input type = "hidden" name = "verwijder_foto" class = "verwijder_foto" value = "0">
                            </div>
                        </div>
                    </div>
                </div>

                <div class = "form-group">
                    <input type = "hidden" id = "input_iframe" name = "input_iframe" value = "">
                    <button type = "submit" onclick = "dropdown_required()"
                            class = "btn btn-primary">Toevoegen </button>
                </div>
            </form>
        </div>
        </body>
    </html>

Дубликат stackoverflow.com/questions/52714586/…

misorude 10.10.2018 08:36

Как работает $('#visible_fields').find(':input[required]'), если div пустой? Также отсутствует тег form. Это кажется неполным

msg 10.10.2018 09:07

Я изменил вопрос, это сделано в laravel и внутри iframe, я не думаю, что нужен еще какой-либо код

Martin ter Wee 10.10.2018 09:14

Может быть, а может и нет. Есть ли код инициализации? Может быть, ваш arrow_ не имеет класса rotate до тех пор, пока не щелкнет мышью и, следовательно, не соответствует ни if, ни else if?

msg 10.10.2018 11:00

Классы поворота только переворачивают стрелку на 90 градусов с небольшим переходом, нет никаких условий. Проблема кажется, что скрытые поля не загружаются, если я не открываю поля раскрывающегося списка, но если я проверяю страницу, поля видны. Я даже пробовал открывать и закрывать выпадающие списки в коде, чтобы он загружался, но это не сработало.

Martin ter Wee 10.10.2018 11:29
if ($(".arrow_" + i).hasClass("rotate_2")) {} else if ($(".arrow_" + i).hasClass("rotate_1")) мне кажется условием. В вашем образце html нет ни того, ни другого.
msg 10.10.2018 11:52
<label class = "toggle_1">Controles<span class = "arrow_1 glyphicon glyphicon-menu-left" aria-hidden = "true"></span></label> В каждом раскрывающемся списке есть toggle_ (количество раскрывающихся списков), а стрелка_ (количество раскрывающихся списков) rotate_1 - для закрытого раскрывающегося списка, а rotate_2 - для открытого раскрывающегося списка. Итак, если стрелка имеет класс rotate_2, это означает, что раскрывающийся список в настоящее время открыт, если стрелка имеет класс rotate_1, это означает, что раскрывающийся список в настоящее время закрыт. поэтому, если есть обязательное поле, которое пусто, раскрывающийся список должен открыться, а если его нет, раскрывающийся список закрывается.
Martin ter Wee 10.10.2018 14:20

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

Martin ter Wee 10.10.2018 15:11

Обязательные поля по-прежнему неверны, если я еще не полностью отправил форму, я смогу исправить проблему сейчас, большое спасибо за вашу помощь.

Martin ter Wee 10.10.2018 15:25
Поведение ключевого слова "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) для оценки ваших знаний,...
0
9
61
1

Ответы 1

Ваша функция проверяет, имеет ли ваш элемент arrow класс rotate_2. В вставленном вами коде нет ни rotate_1, ни rotate_2, ни блока else, поэтому переключатель никогда не выполняется.

Демонстрация проблемы:

// This group has empty mandatory elements
var empty = 1;

$('#validate').click(function() {

  if (empty !== 0) {

    console.info("I have empty elements!");

    // From your comments, this might be backwards
    if ($(".arrow_1").hasClass("rotate_2")) {

      console.info("I'm going to show them");

      $(".arrow_1").addClass("rotate_1").removeClass("rotate_2");
      $(".form_1").fadeToggle();
    }
    // This is missing in the code
    else {
      console.info("I wasn't invited to the party");
    }
    // -------
  } else if ($(".arrow_1").hasClass("rotate_1")) {

    console.info("I'm out, I don't have empty elements...");

    $(".arrow_1").addClass("rotate_2").removeClass("rotate_1");
    $(".form_1").fadeToggle();
  }
});

$('#simulate').click(function() {
  // Simulates manually opening and closing
  // In short, add rotate_2 class as if it's been toggled
  $('.arrow_1').addClass('rotate_2');
  console.info("Toggled manually");
})
<script src = "https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<label class = "toggle_1">Controles<span class = "arrow_1 glyphicon glyphicon-menu-left"
aria-hidden = "true"></span></label>
<div class = "form_1">
  <div>Some form elements</div>
</div>

<button id = "validate">Validate</button>

<button id = "simulate">Simulate</button>

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