Как использовать проверку JQuery на переключателе с уважаемыми полями?

Моя проблема связана с проверкой jquery. У меня есть форма, и проверка выполняется в поле ввода, но я не понимаю, как использовать проверку на переключателе, потому что у меня есть три переключателя, и пользователь может выбрать только один. У всех радиокнопок есть свои уважаемые поля. Я должен установить на нем проверку.

Пример: я выбираю первое радио, тогда пользователь должен также ввести поля book1 и book2. Если вы выберете второй радио, пользователь должен ввести значение полей fruit1 и fruit2.

если пользователь выбирает только переключатель и не заполняет данные поля и нажимает кнопку «Отправить», должна отображаться проверка.

Я пробовал код. Он работает для первого переключателя, но что, если какой-либо пользователь выберет второй переключатель?

Это результат, который я получаю.

Как использовать проверку JQuery на переключателе с уважаемыми полями?

Радиокнопка Книга проверяется проверкой JQuery, если поля пусты

Как использовать проверку JQuery на переключателе с уважаемыми полями?

Обратите внимание, здесь я выбрал фрукты и нажал кнопку отправки, но проверка не отображается

Как использовать проверку 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>

изменить $ ('# form'). Проверить при выборе переключателя?

Chris Li 09.09.2018 11:03

@ChrisLi, например, пользователь выбирает радио книг, затем появятся поля ввода book1 и book2. Я должен установить для него проверку. Если пользователь выбирает фрукт, появляются поля ввода. но пользователь может выбрать только радиокнопку.

Naren Verma 09.09.2018 11:30

изменить правило проверки в зависимости от выбранного переключателя

Chris Li 09.09.2018 11:43
Поведение ключевого слова "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
3
1 738
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Для этого вам не нужен jQuery. Используя ES20xx, атрибуты данных и CSS, довольно легко создать собственную проверку формы. Давайте ради удовольствия разработаем пример на основе вашего кода.

  • Нам нужна функция для определения выбранного значения переключателя, это checkRadio во фрагменте;
  • Нам нужна функция для отображения или скрытия полей, принадлежащих выбору переключателя, это switchFieldsBasedOnRadioChoice во фрагменте. Эта функция активируется clickHandling. Мы используем выбранное значение из checkRadio, чтобы идентифицировать div#show[chosen value]], чтобы иметь возможность показать правый div, содержащий входные элементы, принадлежащие выбранному значению;
  • Нам нужен объект, содержащий некоторые методы для проверки полей, обозначенных в html как data-check и активируемых значением [data-check], он называется fieldChecks;
  • Нам нужна функция-обработчик для кнопки (отправить), которая будет проверять все поля, обозначенные [data-check], на предмет допустимости значения поля и предупреждать, если значение поля недействительно, это checkValues, активированный clickHandling;
  • Мы также создаем обработчик focusin, который удаляет предупреждения из предыдущей проверки входных значений, если пользователь щелкает или фокусирует одно из полей формы;
  • Мы используем атрибуты данных и CSS для стилизации и отображения значений предупреждений. Каждый ввод текста обернут в 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 откроется с полями ввода, которые должны установить проверку. Пожалуйста, проверьте мою отправку.

Naren Verma 09.09.2018 11:25

Привет, @NarendraVerma, я предоставил минимальную функцию для проверки выбранного значения радиовхода. Вы можете использовать это, чтобы показать или скрыть необходимые поля. Теперь для вашего удобства обработчик кликов во фрагменте делает это. Я бы сказал, что по-прежнему нет необходимости в jQuery. Наслаждаться

KooiInc 09.09.2018 11:46

@Kooilnc, как мне проверить валидацию в вашем сниппете? Я думаю, вы забыли добавить кнопку отправки. Можем ли мы решить эту проблему с помощью проверки jquery?

Naren Verma 09.09.2018 12:31

@NarendraVerma разработала для вас более полный пример. Конечно, вы можете использовать jquery, но я хотел продемонстрировать, что в этом нет необходимости. Используя собственный es20xx, размер вашего скрипта будет (намного) меньше

KooiInc 09.09.2018 15:56

@Kooilnc, я имею дело с проверкой jquery, потому что я только что поделился образцом. Вся моя форма с проверкой jquery.

Naren Verma 09.09.2018 16:37

@Kooilnc, Спасибо за помощь и поддержку. Я проверил ваш код, он тоже работает, но мне не нужен расширенный код. Я просто хочу простого и понятного. Я буду ссылаться на ваш код в будущем. проголосовать с моей стороны.

Naren Verma 09.09.2018 17:14

Удалите правило для 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. Верно?

Naren Verma 09.09.2018 12:17

Для меня будет хорошо, если вы поделитесь всем кодом, потому что я пробовал ваш код, но у меня он не работает.

Naren Verma 09.09.2018 12:29

Я отредактировал свой ответ и добавил ссылку на свой Plunker с вашим измененным и рабочим кодом.

Meziane 09.09.2018 13:23

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

Naren Verma 09.09.2018 16:44

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