Search code examples
javascriptjqueryconditional-statementsshow-hideform-fields

struggling with conditional statements to show/hide multiple fields on a wordpress form


My goal is to have a form on a woocommerce product page that when a certain attribute is checked then more options will show up. More specifically. There is a question: "How many additional dogs are you purchasing for?" and the if "one" is checked a text field with the label: "Second Dog's Name:" will appear. And if "two" is selected than "Second Dog's Name:" AND "Third Dog's Name:" will appear.

This is the code that I am working with and cannot really change the html structure because it is built with a wordpress plugin for extra product options in woocommerce.

I am able to get this close where when the fourth option is selected it does what I want and shows all three, but the first three options do nothing. But when I was writing each code, they would work until I wrote the next one.

$('.form-control').on('change', function () {
    if(this.value === "option-1"){
        $(".form-control-2_parent").show();
    } else {
        $(".form-control-2_parent").hide();
    }
});

$('.form-control').on('change', function () {
    if(this.value === "option-2"){
        $(".form-control-2_parent").show();
         $(".form-control-3_parent").show();
    } else {
        $(".form-control-2_parent").hide();
         $(".form-control-3_parent").hide();
    }
});

$('.form-control').on('change', function () {
    if(this.value === "option-3"){
        $(".form-control-2_parent").show();
         $(".form-control-3_parent").show();
         $(".form-control-4_parent").show();
    } else {
        $(".form-control-2_parent").hide();
         $(".form-control-3_parent").hide();
          $(".form-control-4_parent").hide();
    }
});
.form-control-2_parent{
   display:none;
 }
 
  .form-control-3_parent{
   display:none;
 }
 
  .form-control-4_parent{
   display:none;
 }
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/1.10.1/jquery.min.js"></script>
<div class="wcpa_form_item wcpa_type_select  form-control_parent">
  <label for="select-1586051219224">Number of Additional Dogs:</label>
  <div class="select">
    <select name="select-1586051219224" class="form-control ">
      <option value="no-addtional">No Additional Dogs</option>
      <option value="option-1">One Additional Dog</option>
      <option value="option-2">Two Additional Dogs</option>
      <option value="option-3">Three Additional Dog</option>
    </select>
    <div class="select_arrow"></div>
  </div>
</div>
<div class="wcpa_form_item wcpa_type_text  form-control-2_parent">
  <label for="text-1586038514482">Second Dog's Name</label>
  <input type="text" id="text-1586038514482" class="form-control-2 " name="text-1586038514482" value="" />
</div>
<div class="wcpa_form_item wcpa_type_text  form-control-3_parent">
  <label for="text-1586038517583">Third Dog's Name</label>
  <input type="text" id="text-1586038517583" class="form-control-3 " name="text-1586038517583" value="" /></div>
<div class="wcpa_form_item wcpa_type_text  form-control-4_parent">
<label for="text-1586038516041">Fourth Dog's Name</label>
<input type="text" id="text-1586038516041" class="form-control-4 " name="text-1586038516041" value="" /></div>

I know what I am missing is probably very basic, but I am very new to writing javascript/jquery functions and complex conditional statements like this one. Thanks in advance for any help you can give me!


Solution

  • Here's the solution:

    // First store all out option's Elements on a list
    var options = [
      $(".form-control-2_parent"),
      $(".form-control-3_parent"),
      $(".form-control-4_parent")
    ]
    
    // Create a function that hides all our options 
    function resetAll(){
      options.forEach(function(option){
        option.hide();
      });
    }
    
    $('.form-control').on('change', 
      function (event) 
      {
        // Get the option that was clicked
        var target = $(event.currentTarget);
        if(target.val())
        {
          //  First Hide all our options, this will hide any open ones
          resetAll();
          // Just create a loop that shows the number of options based on the selected option
          var i = 0;
          while(i < target.val()){
            options[i].show();
            i++;
          }
        }
      }
    );
    .form-control-2_parent{
       display:none;
     }
     
      .form-control-3_parent{
       display:none;
     }
     
      .form-control-4_parent{
       display:none;
     }
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/1.10.1/jquery.min.js"></script>
    <div class="wcpa_form_item wcpa_type_select  form-control_parent">
      <label for="select-1586051219224">Number of Additional Dogs:</label>
      <div class="select">
        <select name="select-1586051219224" class="form-control ">
          <option value="no-addtional">No Additional Dogs</option>
          <option value="1">One Additional Dog</option>
          <option value="2">Two Additional Dogs</option>
          <option value="3">Three Additional Dog</option>
        </select>
        <div class="select_arrow"></div>
      </div>
    </div>
    <div class="wcpa_form_item wcpa_type_text  form-control-2_parent">
      <label for="text-1586038514482">Second Dog's Name</label>
      <input type="text" id="text-1586038514482" class="form-control-2 " name="text-1586038514482" value="" />
    </div>
    <div class="wcpa_form_item wcpa_type_text  form-control-3_parent">
      <label for="text-1586038517583">Third Dog's Name</label>
      <input type="text" id="text-1586038517583" class="form-control-3 " name="text-1586038517583" value="" /></div>
    <div class="wcpa_form_item wcpa_type_text  form-control-4_parent">
    <label for="text-1586038516041">Fourth Dog's Name</label>
    <input type="text" id="text-1586038516041" class="form-control-4 " name="text-1586038516041" value="" /></div>