У меня есть страница, содержащая несколько форм, все разные, и когда одна из них отправляется, я использую функцию ниже, чтобы собрать все входные данные из этой формы с классом «required» и проверить наличие пустых значений:
function validateForm(form) {
var inputs = form.getElementsByTagName('input');
var selects = form.getElementsByTagName('select');
var errors = 0;
for (var i = 0; i < inputs.length; i++) {
if(inputs[i].classList.contains('required')) {
if(inputs[i].value === "") {
inputs[i].classList.add("warning");
errors++;
} else {
inputs[i].classList.remove("warning");
}
}
}
if(errors) {
return false;
} else {
return true;
}
}
Если он находит пустое значение, он добавляет класс «warning», который просто придает вводу красную рамку, а затем возвращает false, чтобы форма не была отправлена.
Вот где я столкнулся с проблемой: некоторые формы содержат
Допустим, форма для добавления нового продукта.Выбор динамически заполняется существующими «категориями» продукта, а текстовый ввод предназначен, если пользователь хочет создать новую категорию.Вот упрощенная версия формы:
<form method = "post" onsubmit = "return validateForm(this)">
<div class = "form-group">
<label>Product Name</label>
<input class = "form-control required" type = "text" name = "product" />
</div>
<div class = "form-group">
<select class = "form-control required" id = "category" name = "category[]">
<option value = "">Select Existing Category</option>
<option value = "Shirts">Shirts</option>
<option value = "Shoes">Shoes</option>
<option value = "Pants">Pants</option>
</select>
</div>
<div class = "form-group">
<label>Create New Category</label>
<input class = "form-control required" type = "text" name = "category[]" />
</div>
<div class = "form-group">
<input class = "btn btn-primary" type = "submit" value = "Submit" />
</div>
</form>
Поскольку я использую цикл for, чтобы пройти через входы - выбор и вход не будут иметь одинаковый индекс, поэтому я не могусделайте что-то вроде этого:
if((selects[i].value === "" && inputs[i].value === "") || (selects[i].value !== "" && inputs[i].value !== "")) {
// add the warning class to both
}
Я чувствую, что ответ лежит где-то в использовании атрибута name, т. е. сравните selects.name и input.name, но как мне обойти отличающийся индекс в цикле?И также, это должно только сделать это сравнение, когда выбор встречается так или иначе.Это не обязательно существует, в зависимости от формы.
По сути, мне нужно изменить мою функцию, чтобы сделать это:
I.Соберите все входные данные и выберите (если есть - некоторые формы не будут) из отправленной формы
II.Убедитесь, что ни один из входов с классом «required» не является пустым (если нет соответствующего выбора, в этом случае см. III ниже)
III.Если есть выбор, найдите текстовый ввод с тем же «именем» (не обязательно иметь такое же имя, но я предполагаю, что это правильный способ сделать это).Один из них, но не оба, должен иметь значение.Если оба поля пустые или оба имеют значение, они должны получить класс «warning»;
Любая помощь, которую кто-либо может предложить, будет принята с благодарностью!