Solution 1 :

You should be using radio buttons instead of checkboxes. I cleaned up your code also to use one event handler.

I also updated so the appropriate fields are dynamically set as required.

$(document).ready(function() {
  $('input.payment').on('change', function() {
       $("input[name='cardNumber']").prop("required",false);
       $("input[name='paypal_email']").prop("required",false);
       $(".creditcard").hide();
       $(".paypal").hide();
       
     if($(this).val() == "PayPal"){
         $(".paypal").show();
         $("input[name='paypal_email']").prop("required",true);
     }
     else{
         $("input[name='cardNumber']").prop("required",true);
         $(".creditcard").show();
     }
  });
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<form method="post" action="checkout.php" autocomplete="off">
  <div class="col-lg-7 mb--20 float-left">
    <div class="form-group">
      <label for="fname">Full Name</label>
      <input type="text" class="form-control" id="fname" placeholder="Enter Your Name" name="fname" required="">
    </div>
  </div>
  <div class="col-lg-5 float-right">
    <div class="row">
      <div class="col-12">
        <div class="checkout-cart-total">
          <div class="col-md-6">
            <input checked type="radio" id="credit" class="payment" name="mode" value="credit card">
            <label for="credit">Credit Card</label>
          </div>
          <div class="col-md-6">
            <input type="radio" id="paypal" class="payment" name="mode" value="PayPal">
            <label for="paypal">Paypal</label>
          </div>
          <div class="creditcard" style="display:block;">
            <div class="form-group">
              <label for="cardNumber">CARD NUMBER</label>
              <input type="tel" class="form-control" name="cardNumber" placeholder="Valid Card Number" value="" />
            </div>
          </div>
          <div class="paypal" style="display:none;">
            <div class="form-group">
              <label for="paypal_email">Email ID</label>
              <input type="email" class="form-control" name="paypal_email" placeholder="Please enter paypal email" />
            </div>
          </div>
          <button type="submit" name="submit" id="submit" class="place-order w-100">Place order</button>
        </div>
      </div>
    </div>
  </div>
</form>

Problem :

In this code, what happens when I change checkbox value (i.e. If I click on credit card checkbox) then <div class="creditcard"> shows, and if I click on paypal then <div class="paypal"> shows.

Now, when I choose credit card and then click on submit button, then form does not submit. And if I check paypal checkbox and click submit button then nothing happen again. I don’t understand why.

How can I submit form whether I choose credit card checkbox or paypal?

$(document).ready(function() {
  $('input.payment').on('change', function() {
    $('input.payment').not(this).prop('checked', false);
  });

  $("#credit").click(function() {
    if ($(this).is(":checked")) {
      $(".creditcard").show();
      $(".paypal").hide();
    } else {
      $(".creditcard").hide();
      $(".paypal").show();
    }
  });

  $("#paypal").click(function() {
    if ($(this).is(":checked")) {
      $(".paypal").show();
      $(".creditcard").hide();
    } else {
      $(".paypal").hide();
      $(".creditcard").show();
    }
  });
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<form method="post" action="checkout.php" autocomplete="off">
  <div class="col-lg-7 mb--20 float-left">
    <div class="form-group">
      <label for="fname">Full Name</label>
      <input type="text" class="form-control" id="fname" placeholder="Enter Your Name" name="fname" required="">
    </div>
  </div>
  <div class="col-lg-5 float-right">
    <div class="row">
      <div class="col-12">
        <div class="checkout-cart-total">
          <div class="col-md-6">
            <input type="checkbox" id="credit" class="payment" name="mode" value="credit card">
            <label for="credit">Credit Card</label>
          </div>
          <div class="col-md-6">
            <input type="checkbox" id="paypal" class="payment" name="mode" value="PayPal">
            <label for="paypal">Paypal</label>
          </div>
          <div class="creditcard" style="display:block;">
            <div class="form-group">
              <label for="cardNumber">CARD NUMBER</label>
              <input type="tel" class="form-control" name="cardNumber" placeholder="Valid Card Number" required value="" />
            </div>
          </div>
          <div class="paypal" style="display:none;">
            <div class="form-group">
              <label for="paypal_email">Email ID</label>
              <input type="email" class="form-control" name="paypal_email" placeholder="Please enter paypal email" required/>
            </div>
          </div>
          <button type="submit" name="submit" id="submit" class="place-order w-100">Place order</button>
        </div>
      </div>
    </div>
  </div>
</form>

Comments

Comment posted by Funk Forty Niner

There’s no php in what you posted.

Comment posted by gre_gor

Just because you have hidden a field, it doesn’t mean it becomes optional.

Comment posted by gre_gor

And why are you using checkboxes, if you need radio button functionality?

Comment posted by steave

still form not submit

Comment posted by WOUNDEDStevenJones

@imvain2 This is definitely an improvement, but even if you fill in name and CC number with CC checked, the form fails to submit. It appears to be an issue with the

Comment posted by imvain2

@WOUNDEDStevenJones you are correct, I see that now. When you mentioned “hidden” I was looking for input type hidden fields, not input fields that are not visible.

Comment posted by imvain2

@steave I have updated my answer to dynamically set the appropriate fields as required instead of all fields even if they aren’t visible.

Comment posted by steave

Thank You @imvain2

By