Я создал функцию 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>
Как работает $('#visible_fields').find(':input[required]'), если div пустой? Также отсутствует тег form. Это кажется неполным
Я изменил вопрос, это сделано в laravel и внутри iframe, я не думаю, что нужен еще какой-либо код
Может быть, а может и нет. Есть ли код инициализации? Может быть, ваш arrow_ не имеет класса rotate до тех пор, пока не щелкнет мышью и, следовательно, не соответствует ни if, ни else if?
Классы поворота только переворачивают стрелку на 90 градусов с небольшим переходом, нет никаких условий. Проблема кажется, что скрытые поля не загружаются, если я не открываю поля раскрывающегося списка, но если я проверяю страницу, поля видны. Я даже пробовал открывать и закрывать выпадающие списки в коде, чтобы он загружался, но это не сработало.
if ($(".arrow_" + i).hasClass("rotate_2")) {} else if ($(".arrow_" + i).hasClass("rotate_1")) мне кажется условием. В вашем образце html нет ни того, ни другого.
<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, это означает, что раскрывающийся список в настоящее время закрыт. поэтому, если есть обязательное поле, которое пусто, раскрывающийся список должен открыться, а если его нет, раскрывающийся список закрывается.
Вы правы, что устранили проблему с поиском полей, единственная проблема теперь заключается в том, что форма пытается отправить до проверки невидимых полей. если форма отправляется после того, как функция работает. Спасибо, что помогли мне с этой проблемой.
Обязательные поля по-прежнему неверны, если я еще не полностью отправил форму, я смогу исправить проблему сейчас, большое спасибо за вашу помощь.



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


Ваша функция проверяет, имеет ли ваш элемент 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>
Дубликат stackoverflow.com/questions/52714586/…