Home > OS >  Add class if radio option not selected on submit
Add class if radio option not selected on submit

Time:12-09

I'm trying to add some classes to my form on submit which indicates which required fields haven't been addressed.

I have this working for input[type="text"], but it doesn't work for radio options. Upon inspecting the code, it doesn't even add the error class to the radio element?

Demo:

(function ($) {

  $('#rsvp form input[type=submit]').click(function(e){
    console.log("click");
    var data = $('#rsvp form').serialize();

      [].slice.call($('#rsvp form input.required')).forEach(function (elem, index) {
          $elem = $(elem);
          console.log(elem);
          if($elem.val().length == 0){
            $elem.addClass("error");
          } else{
            $elem.removeClass("error");
          }
      });


  });

}) (jQuery);
.error{
  background: red;
}

.error.input-label:before{
  border-color: red;
}

:root {
  --green: #9A9E90;
  --black: #000000;
}

fieldset{
  margin-bottom: 50px;
}

form{
  position: relative;
}

input {
  width: 100%;
  box-sizing: border-box;
  background: none;
  outline: none;
  resize: none;
  border: 0;
  border-bottom: 2px solid var(--green);
  border-left: 2px solid var(--green);
}
input[type=checkbox], input[type=radio] {
  position: absolute;
  opacity: 0;
}
input[type=submit] {
  cursor: pointer;
  display: inline-block;
  width: fit-content;
  color: var(--black);
  border: 2px solid var(--green);
  padding: 20px 30px;
  text-transform: uppercase;
}

.input-label {
  display: inline-block;
  position: relative;
  margin-right: 30px;
  padding-left: 25px;
  cursor: pointer;
}
.input-label:before, .input-label:after {
  content: "";
  position: absolute;
  top: 50%;
  transform: translate(0px, -50%);
  left: 0;
}
.input-label:before {
  display: block;
  width: 15px;
  height: 15px;
  border: 2px solid var(--green);
}
.input-label:after {
  display: none;
  width: 9px;
  height: 9px;
  margin: 3px;
  background-color: var(--green);
  transform: translate(0px, -82%);
}

input:focus   .input-label:before {
  border-color: var(--green);
}

input:checked   .input-label:after {
  display: block;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.6.0/jquery.min.js" integrity="sha512-894YE6QWD5I59HgZOGReFYm4dnWc1Qt5NtvYSaNcOP u1T9qYdvdihz0PPSiiqn/ /3e7Jo4EaG7TubfWGUrMQ==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>


<div id="rsvp">
  <form>

    <fieldset>
      <span>Attending?</span>
      <input  id="attending-yes" type="radio" name="attendance" value="yes" required />
      <label  for="attending-yes">Yes</label>
      <input  id="attending-no" type="radio" name="attendance" value="no" required />
      <label  for="attending-no">No</label>
    </fieldset>
    
    <fieldset>
      <input  type="text" name="full_name" placeholder="Your full name*" required />
    </fieldset>
    
    <input type="submit" name="submit" value="Send" />

  </form>
</div>

CodePudding user response:

You can do it like this to check if the checkbox of a group is checked or not.

  if($elem.val().length == 0){
    $elem.addClass("error");
  } else if ($elem.is(":radio")) {
    var group = $("input[name='" $elem.attr("name") "']:checked");
    $elem.parent().toggleClass("error",group.length == 0 )
  } else {
    $elem.removeClass("error");
  }

(function ($) {

  $('#rsvp form input[type=submit]').click(function(e){
    var data = $('#rsvp form').serialize();

      [].slice.call($('#rsvp form input.required')).forEach(function (elem, index) {
          $elem = $(elem);
          if($elem.val().length == 0){
            $elem.addClass("error");
          } else if ($elem.is(":radio")) {
            var group = $("input[name='" $elem.attr("name") "']:checked");
            $elem.parent().toggleClass("error",group.length == 0 )
          } else {
            $elem.removeClass("error");
          }
      });


  });

}) (jQuery);
.error{
  background: red;
}

.error.input-label:before{
  border-color: red;
}

:root {
  --green: #9A9E90;
  --black: #000000;
}

fieldset{
  margin-bottom: 50px;
}

form{
  position: relative;
}

input {
  width: 100%;
  box-sizing: border-box;
  background: none;
  outline: none;
  resize: none;
  border: 0;
  border-bottom: 2px solid var(--green);
  border-left: 2px solid var(--green);
}
input[type=checkbox], input[type=radio] {
  position: absolute;
  opacity: 0;
}
input[type=submit] {
  cursor: pointer;
  display: inline-block;
  width: fit-content;
  color: var(--black);
  border: 2px solid var(--green);
  padding: 20px 30px;
  text-transform: uppercase;
}

.input-label {
  display: inline-block;
  position: relative;
  margin-right: 30px;
  padding-left: 25px;
  cursor: pointer;
}
.input-label:before, .input-label:after {
  content: "";
  position: absolute;
  top: 50%;
  transform: translate(0px, -50%);
  left: 0;
}
.input-label:before {
  display: block;
  width: 15px;
  height: 15px;
  border: 2px solid var(--green);
}
.input-label:after {
  display: none;
  width: 9px;
  height: 9px;
  margin: 3px;
  background-color: var(--green);
  transform: translate(0px, -82%);
}

input:focus   .input-label:before {
  border-color: var(--green);
}

input:checked   .input-label:after {
  display: block;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.6.0/jquery.min.js" integrity="sha512-894YE6QWD5I59HgZOGReFYm4dnWc1Qt5NtvYSaNcOP u1T9qYdvdihz0PPSiiqn/ /3e7Jo4EaG7TubfWGUrMQ==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>


<div id="rsvp">
  <form>

    <fieldset>
      <span>Attending?</span>
      <input  id="attending-yes" type="radio" name="attendance" value="yes" required />
      <label  for="attending-yes">Yes</label>
      <input  id="attending-no" type="radio" name="attendance" value="no" required />
      <label  for="attending-no">No</label>
    </fieldset>
    
    <fieldset>
      <input  type="text" name="full_name" placeholder="Your full name*" required />
    </fieldset>
    
    <input type="submit" name="submit" value="Send" />

  </form>
</div>

CodePudding user response:

You should have an id/Class for "Submit" button and add the click function in the script to add class name for unselected radio buttons/button.

$("#rsvp").delegate("#submitButton", "click", function(){
 $('input:radio').each(function () {    
  if($(this).not(':checked')){ 
   $(this).addClass("unSelectedRadioButton");
  }
 });  
});
.error{
  background: red;
}

.error.input-label:before{
  border-color: red;
}

:root {
  --green: #9A9E90;
  --black: #000000;
}

fieldset{
  margin-bottom: 50px;
}

form{
  position: relative;
}

input {
  width: 100%;
  box-sizing: border-box;
  background: none;
  outline: none;
  resize: none;
  border: 0;
  border-bottom: 2px solid var(--green);
  border-left: 2px solid var(--green);
}
input[type=checkbox], input[type=radio] {
  position: absolute;
  opacity: 0;
}
input[type=submit] {
  cursor: pointer;
  display: inline-block;
  width: fit-content;
  color: var(--black);
  border: 2px solid var(--green);
  padding: 20px 30px;
  text-transform: uppercase;
}

.input-label {
  display: inline-block;
  position: relative;
  margin-right: 30px;
  padding-left: 25px;
  cursor: pointer;
}
.input-label:before, .input-label:after {
  content: "";
  position: absolute;
  top: 50%;
  transform: translate(0px, -50%);
  left: 0;
}
.input-label:before {
  display: block;
  width: 15px;
  height: 15px;
  border: 2px solid var(--green);
}
.input-label:after {
  display: none;
  width: 9px;
  height: 9px;
  margin: 3px;
  background-color: var(--green);
  transform: translate(0px, -82%);
}

input:focus   .input-label:before {
  border-color: var(--green);
}

input:checked   .input-label:after {
  display: block;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.6.0/jquery.min.js" integrity="sha512-894YE6QWD5I59HgZOGReFYm4dnWc1Qt5NtvYSaNcOP u1T9qYdvdihz0PPSiiqn/ /3e7Jo4EaG7TubfWGUrMQ==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>


<div id="rsvp">
  <form>

    <fieldset>
      <span>Attending?</span>
      <input  id="attending-yes" type="radio" name="attendance" value="yes" required />
      <label  for="attending-yes">Yes</label>
      <input  id="attending-no" type="radio" name="attendance" value="no" required />
      <label  for="attending-no">No</label>
    </fieldset>
    
    <fieldset>
      <input  type="text" name="full_name" placeholder="Your full name*" required />
    </fieldset>
    
    <input type="submit" id="submitButton" name="submit" value="Send" />

  </form>
</div>

Hope this helps!!

  • Related