Моя проблема связана с проверкой jquery. У меня есть форма, и проверка выполняется в поле ввода, но я не понимаю, как использовать проверку на переключателе, потому что у меня есть три переключателя, и пользователь может выбрать только один. У всех радиокнопок есть свои уважаемые поля. Я должен установить на нем проверку.
Пример: я выбираю первое радио, тогда пользователь должен также ввести поля book1 и book2. Если вы выберете второй радио, пользователь должен ввести значение полей fruit1 и fruit2.
если пользователь выбирает только переключатель и не заполняет данные поля и нажимает кнопку «Отправить», должна отображаться проверка.
Я пробовал код. Он работает для первого переключателя, но что, если какой-либо пользователь выберет второй переключатель?
Это результат, который я получаю.
Радиокнопка Книга проверяется проверкой JQuery, если поля пусты
Обратите внимание, здесь я выбрал фрукты и нажал кнопку отправки, но проверка не отображается
Причина в том, что я не получаю, потому что я добавил только проверку переключателя книги. Теперь, как использовать для фруктов и предметов?
book1: {required: true},
book2: {required: true}
$(document).ready(function() {
$("input[name='books_fruit_sub']").click(function() {
var test = $(this).val();
$(".show_fields").hide();
$("#show" + test).show();
});
$('#form').validate({ // initialize the plugin
rules: {
mobile: {
required: true,
number: true,
minlength: 10,
maxlength: 10
},
book1: {
required: true
},
book2: {
required: true
}
},
submitHandler: function(form) { // for demo
form.submit();
}
});
});ul {
text-decoration: none;
margin: 0;
padding: 0;
}
ul li {
display: inline-block;
}
.error {
color: red;
}<form action = "" id = "form">
<input type = "text" name = "mobile" placeholder = "Mobile">
<ul>
<li>
<input type = "radio" name = "books_fruit_sub" id = "books" value = "books" checked>
<label for = "books">Books</label>
</li>
<li>
<input type = "radio" name = "books_fruit_sub" id = "fruit" value = "fruit">
<label for = "fruit">Fruit </label>
</li>
<li>
<input type = "radio" name = "books_fruit_sub" id = "subject" value = "subject">
<label for = "subject">Subject </label>
</li>
</ul>
<div>
<div class = "show_fields" id = "showbooks">
<input type = "text" name = "book1" placeholder = "Book 1">
<input type = "text" name = "book2" placeholder = "Book 2">
</div>
<div class = "show_fields" id = "showfruit" style = "display: none;">
<input type = "text" name = "fruit1" placeholder = "Fruit 1">
<input type = "text" name = "fruit2" placeholder = "Fruit 2">
</div>
<div class = "show_fields" id = "showsubject" style = "display: none;">
<input type = "text" name = "subject1" placeholder = "Subject 1">
<input type = "text" name = "subject2" placeholder = "Subject 2">
</div>
</div>
<input type = "submit" name = "send" value = "Submit">
</form>
<script src = "https://code.jquery.com/jquery-3.2.1.min.js"></script>
<script type = "text/javascript" src = "http://ajax.aspnetcdn.com/ajax/jquery.validate/1.11.0/jquery.validate.min.js"></script>
<script type = "text/javascript" src = "http://ajax.aspnetcdn.com/ajax/jquery.validate/1.11.0/additional-methods.js"></script>@ChrisLi, например, пользователь выбирает радио книг, затем появятся поля ввода book1 и book2. Я должен установить для него проверку. Если пользователь выбирает фрукт, появляются поля ввода. но пользователь может выбрать только радиокнопку.
изменить правило проверки в зависимости от выбранного переключателя



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


Для этого вам не нужен jQuery. Используя ES20xx, атрибуты данных и CSS, довольно легко создать собственную проверку формы. Давайте ради удовольствия разработаем пример на основе вашего кода.
checkRadio во фрагменте;switchFieldsBasedOnRadioChoice во фрагменте. Эта функция активируется clickHandling. Мы используем выбранное значение из checkRadio, чтобы идентифицировать div#show[chosen value]], чтобы иметь возможность показать правый div, содержащий входные элементы, принадлежащие выбранному значению;data-check и активируемых значением [data-check], он называется fieldChecks;[data-check], на предмет допустимости значения поля и предупреждать, если значение поля недействительно, это checkValues, активированный clickHandling;focusin, который удаляет предупреждения из предыдущей проверки входных значений, если пользователь щелкает или фокусирует одно из полей формы;div. Мы используем css-класс .invalid для (контейнера полей ввода) -div, чтобы стилизовать предупреждения в содержащихся полях ввода (если применимо).click, focusin) в этом фрагменте используют делегирование мероприятия.// check value of a radio button
const checkRadio = name => {
const isChecked =
Array.from(document.querySelectorAll(`[name='${name}']`))
.filter(rb => rb.checked);
return isChecked.length ? isChecked[0].value : null;
};
// validity checks for field values ([data-check])
const fieldChecks = {
mobile: value => {
const valueClean = value.replace(/[^\d]/g, "");
return {
cando: valueClean.length === 10,
instruction: "Invalid: need 10 digits, you can use spaces and '-'"
};
},
booksOrFruits: value => ({
cando: value.trim().length >= 5,
instruction: "Invalid: all fields ≥ 5 characters"
}),
};
// add event listeners
document.addEventListener("click", clickHandling);
document.addEventListener("focusin", removeWarnings);
// click handling delegate
function clickHandling(evt) {
const origin = evt.target;
if (origin.type === "radio") {
return switchFieldsBasedOnRadioChoice(origin);
} else if (origin.id === "validate") {
return checkValues();
}
}
// focusin handling delegate: remove warnings on focus
function removeWarnings() {
console.clear();
Array.from(document.querySelectorAll(".notvalid"))
.forEach( el => el.classList.remove("notvalid") );
}
// check all field values and warn for invalid values in required fields
function checkValues() {
console.clear();
const checks = Array.from(document.querySelectorAll("[data-check]"));
let cando = true;
checks.forEach( input => {
// check for existence of input.dataset.check
if (!fieldChecks[input.dataset.check]) {
throw new Error(
`You forgot to add '${input.dataset.check}' to fieldChecks!`
);
}
const parent = input.parentNode;
// don't check input values from parent class "show_fields hidden"
if (parent.classList.contains("show_fields")
&& parent.classList.contains("hidden")) {
return false;
}
// perform the check denoted by [data-check] from the input field
const fieldChck = fieldChecks[input.dataset.check](input.value);
// if invalid value, use css/data-attributes to style a warning
if (!fieldChck.cando) {
parent.classList.add("notvalid");
if (fieldChck && fieldChck.instruction) {
parent.dataset.instruction = fieldChck.instruction;
}
cando = false;
} else {
parent.classList.add("valid")
}
} );
// all fields checked out ok
if (cando) { console.info("you're ok"); }
}
// show input fields belonging to a chosen radio input field
function switchFieldsBasedOnRadioChoice(origin) {
Array.from(document.querySelectorAll(".show_fields"))
.forEach(v => v.classList.add("hidden"))
const chosenValue = checkRadio(origin.name);
document.querySelector(`#show${chosenValue}`)
.classList.remove("hidden");
}body {
margin: 2em;
font: normal 12px/15px verdana, arial, sans-serif;
}
input[type=text] {
margin: 0.3em 0.3em 0 0;
padding: 2px 4px;
}
button {
margin-top: 0.3em;
}
/* fields originating from radio choice */
.show_fields {
display: table-row;
visibility: "visible";
opacity: 1;
transition: opacity ease-in 0.5s 0s;
}
.hidden {
opacity: 0;
transition: opacity ease-out 0.1s 0s;
visibility: collapse;
}
/* styling related to validation */
.notvalid input {
border: 1px solid red;
}
.notvalid[data-instruction]:after {
content: attr(data-instruction);
margin-left: 0.2em;
}
.notvalid ::placeholder {
color: red;
}
.valid:after {
font-weight: bold;
content: "\2714";
color: green;
}
.valid input {
color: green;
}<ul>
<li>
<input type = "radio" name = "books_fruit_sub" id = "books" value = "books" checked>
<label for = "books">Books</label>
</li>
<li>
<input type = "radio" name = "books_fruit_sub" id = "fruit" value = "fruit">
<label for = "fruit">Fruit </label>
</li>
</ul>
<div data-required>
<input type = "text" name = "mobile" placeholder = "mobile" data-check = "mobile">
</div>
<div>
<input type = "text" name = "notrequired" placeholder = "not required">
</div>
<div class = "show_fields" id = "showbooks">
<input type = "text" name = "book1" placeholder = "Book 1" data-check = "booksOrFruits">
<input type = "text" name = "book2" placeholder = "Book 2" data-check = "booksOrFruits">
</div>
<div class = "show_fields hidden" id = "showfruit">
<input type = "text" name = "fruit1" placeholder = "Fruit 1" data-check = "booksOrFruits">
<input type = "text" name = "fruit2" placeholder = "Fruit 2" data-check = "booksOrFruits">
</div>
<button id = "validate">Check</button>@kooilnc, Спасибо за ответ, думаю, вы не поняли мой вопрос. Стоит ли объяснять подробно? В вашем фрагменте: если пользователь выберет радио для книг, тогда div откроется с полями ввода, и я должен установить проверку в этих полях или выбрать фрукт, тогда div откроется с полями ввода, которые должны установить проверку. Пожалуйста, проверьте мою отправку.
Привет, @NarendraVerma, я предоставил минимальную функцию для проверки выбранного значения радиовхода. Вы можете использовать это, чтобы показать или скрыть необходимые поля. Теперь для вашего удобства обработчик кликов во фрагменте делает это. Я бы сказал, что по-прежнему нет необходимости в jQuery. Наслаждаться
@Kooilnc, как мне проверить валидацию в вашем сниппете? Я думаю, вы забыли добавить кнопку отправки. Можем ли мы решить эту проблему с помощью проверки jquery?
@NarendraVerma разработала для вас более полный пример. Конечно, вы можете использовать jquery, но я хотел продемонстрировать, что в этом нет необходимости. Используя собственный es20xx, размер вашего скрипта будет (намного) меньше
@Kooilnc, я имею дело с проверкой jquery, потому что я только что поделился образцом. Вся моя форма с проверкой jquery.
@Kooilnc, Спасибо за помощь и поддержку. Я проверил ваш код, он тоже работает, но мне не нужен расширенный код. Я просто хочу простого и понятного. Я буду ссылаться на ваш код в будущем. проголосовать с моей стороны.
Удалите правило для book1 и book2 из инициализации валидатора, и в обработчике кликов просто добавьте это
$(".show_fields").find("input").removeAttr("required");
$("#show" + test).find("input").attr("required" , "required");
Также в html добавьте обязательный атрибут к обоим входам book1 и book2
Просто используйте функцию, которая возвращает истину или ложь в зависимости от того, выбрана соответствующая кнопка радио или нет.
book1: {
required: function() {
return $('#books').is(':checked');
}
},
book2: {
required: function() {
return $('#books').is(':checked');
}
},
fruit1: {
required: function() {
return $('#fruit').is(':checked');
}
},
fruit2: {
required: function() {
return $('#fruit').is(':checked');
}
},
..
Для этого используйте множественное число "fruits" и "subjects", как вы делали для "books" для радиокнопок.
Здесь - это ваш измененный и рабочий код в плункере.
Мне нужно использовать ваш код при проверке jquery. Верно?
Для меня будет хорошо, если вы поделитесь всем кодом, потому что я пробовал ваш код, но у меня он не работает.
Я отредактировал свой ответ и добавил ссылку на свой Plunker с вашим измененным и рабочим кодом.
Да, ваша ссылка на плункер у меня работает отлично. Дайте мне немного времени, чтобы реализовать ваш код с моим кодом.
изменить $ ('# form'). Проверить при выборе переключателя?