0

Here is my jQuery snippet

  $("#saveBankDetails").click(function(){
           if($('#firstBankDetail').is(':visible')) {
               return validateFirstBankDetails();
            }     
           if($('#secondBankDetail').is(':visible')) {
               return validateSecondBankDetails();
            }   
           if($('#thirdBankDetail').is(':visible')) {
               return validateThirdBankDetails();
            }   
           if($('#fourthBankDetail').is(':visible')) {
               return validateFourthBankDetails();
            }   
       });

What i want to achieve is perform validation if the elements firstBankDetail , secondBankDetail and so on are visible. validateFirstBankDetails,validateSecondBankDetails are all javascript function.

I have used return to avoid posting data to server if validation fails. However it seems that data is posted if validateFirstBankDetails() returns true and thus the code does not move ahead . What modifications do i need to do so that code moves ahead and applys validations for secondBankDetail too ?

Abhishek Singh
  • 10,243
  • 22
  • 74
  • 108
  • Your first valid return is ceasing execution of the following tests. Return at the end of all your tests instead. – Sam Carrington Oct 04 '13 at 10:47
  • possible duplicate of [jQuery post data to server only if validation passes](http://stackoverflow.com/questions/19178874/jquery-post-data-to-server-only-if-validation-passes) – Sparky Oct 04 '13 at 20:06

7 Answers7

1

Collect your result to the single variable:

$("#saveBankDetails").click(function(){
           var restult = true;
           if($('#firstBankDetail').is(':visible')) {
               result &= validateFirstBankDetails();
            }     
           if($('#secondBankDetail').is(':visible')) {
               result &= validateSecondBankDetails();
            }   
           if($('#thirdBankDetail').is(':visible')) {
               result &= validateThirdBankDetails();
            }   
           if($('#fourthBankDetail').is(':visible')) {
               result &= validateFourthBankDetails();
            }   

           return result;
       });

In this case if at least one validation fails - the whole form validation will fail.

P.S. Better to subscribe to form submit event and handle validation there: Prevent Default on Form Submit jQuery

Community
  • 1
  • 1
Samich
  • 29,157
  • 6
  • 68
  • 77
0

if validation fails

return false 

Add this to the end of the click event.

Praveen
  • 55,303
  • 33
  • 133
  • 164
0

You can also try this

$("#saveBankDetails").click(function(){
       var result = false;
       if($('#firstBankDetail').is(':visible')) {
           result = validateFirstBankDetails();
        }     
       if($('#secondBankDetail').is(':visible')) {
           result = validateSecondBankDetails();
        }   
       if($('#thirdBankDetail').is(':visible')) {
           result = validateThirdBankDetails();
        }   
       if($('#fourthBankDetail').is(':visible')) {
           result = validateFourthBankDetails();
        }
       return result;
   });
Amit
  • 15,217
  • 8
  • 46
  • 68
0

Give those elements a class and then loop them:

$("#saveBankDetails").click(function(){
    var all_elements = $('.newClass');
    all_elements.each(function () {
        if (!$(this).is(':visible')) {
            //do something if not visible
            return false;
        }
    });
});
Sergio
  • 28,539
  • 11
  • 85
  • 132
0

After following @Samich advice i came up with this solution. It works fine.

$('form').submit(function (event) {
           if($('#firstBankDetail').is(':visible')) {
               if(!validateFirstBankDetails()){
                   event.preventDefault();
               }
            }  
           if($('#secondBankDetail').is(':visible')) {
              if(!validateSecondBankDetails()){
               event.preventDefault();
              }
            }   
           if($('#thirdBankDetail').is(':visible')) {
               if(!validateThirdBankDetails()){
                   event.preventDefault();
               }
            }   
           if($('#fourthBankDetail').is(':visible')) {
               if(!validateFourthBankDetails()){
                   event.preventDefault();
               }
            }
       });

It is easier too

Abhishek Singh
  • 10,243
  • 22
  • 74
  • 108
-1
 $("#saveBankDetails").click(function(){
       if($('#firstBankDetail').is(':visible')) {
           return validateFirstBankDetails();
        }     
       if($('#secondBankDetail').is(':visible')) {
           return validateSecondBankDetails();
        }   
       if($('#thirdBankDetail').is(':visible')) {
           return validateThirdBankDetails();
        }   
       if($('#fourthBankDetail').is(':visible')) {
           return validateFourthBankDetails();
        } 
       return false;

   });

If you dont want to return control back to server you can add return false;

Samich
  • 29,157
  • 6
  • 68
  • 77
kiran
  • 190
  • 1
  • 1
  • 13
-1
$("#saveBankDetails").click(function(){
       var result = 0; var visible = 0;
       if($('#firstBankDetail').is(':visible')) {
           result = result + ( 1 & validateFirstBankDetails());
           visible++;
        }     
       if($('#secondBankDetail').is(':visible')) {
           result = result + ( 1 & validateFirstBankDetails());
           visible++;
        }   
       if($('#thirdBankDetail').is(':visible')) {
           result = result + ( 1 & validateFirstBankDetails());
           visible++;
        }   
       if($('#fourthBankDetail').is(':visible')) {
           result = result + ( 1 & validateFirstBankDetails());
           visible++;
        }   
       if(result == visible) {return true;}
       else{return false;}
   });
Rahul Thakur
  • 824
  • 1
  • 12
  • 27