0

I would like to add a class if input is empty and remove it if it isn't. I initially had addClass(); so I tried using:

.removeClass().addClass();

But it doesn't seem to update the class on the click of the button.

HTML:

<input id="firstName" type="text" />
<input id="lastName" type="text" />
<a href="#" id="button">SEND</a>

jQuery:

var firstName = $("#firstName");
var lastName = $("#lastName");

$('#button').click(function () {
    if(firstName.val() == "" || lastName.val() == ""){
        firstName.removeClass("errorInput").addClass("errorInput");
        lastName.removeClass("errorInput").addClass("errorInput");
    }

if ($(":input").hasClass("errorInput")) {
        alert("false");
    } else {
        alert("true");
    }
});

JSFiddle

user4756836
  • 1,277
  • 4
  • 20
  • 47

4 Answers4

5

You're trying to toggle the class. There's a method for that!

Quoting from the linked doc:

The second version of .toggleClass() uses the second parameter for determining whether the class should be added or removed. If this parameter's value is true, then the class is added; if false, the class is removed. In essence, the statement:

$( "#foo" ).toggleClass( className, addOrRemove );

is equivalent to:

if ( addOrRemove ) {
  $( "#foo" ).addClass( className );
} else {
  $( "#foo" ).removeClass( className );
}

Something along the lines of firstName.toggleClass("errorInput", firstName.val() === "") should work for your case.

Hamms
  • 5,016
  • 21
  • 28
4

You can set some class to the input fields, or select em like this:

var firstName = $("#firstName");
var lastName = $("#lastName");

$('#button').click(function () {

  $('input').each(function(){

    if($this.val().trim()){
      $(this).addClass("errorInput");
    }
    else{
      $(this).removeClass("errorInput");
    }

  });

});
The Process
  • 5,913
  • 3
  • 30
  • 41
2

Your code doesn't take into consideration the case where one input is empty and the other isn't.

https://jsfiddle.net/0tfenwto/2/

if(firstName.val() == "")
    firstName.addClass("errorInput");
else
    firstName.removeClass("errorInput")

if(lastName.val() == "")
    lastName.addClass("errorInput");
else
    lastName.removeClass("errorInput")

EDIT: Generic input length checker. https://jsfiddle.net/0tfenwto/3/

$('#button').click(function () {
    $('input').each(function(){
        var val = $(this).val();
        $(this).toggleClass("errorInput",val.length==0)
    })
});
Eric Guan
  • 15,474
  • 8
  • 50
  • 61
  • I would rather avoid that many if blocks. I have many input fields and that is why my if statement has multiple checks on one line – user4756836 Feb 27 '16 at 01:01
  • Avoiding code duplication is good, however misrepresenting error states is not good. Check my edit for a generic solution. – Eric Guan Feb 27 '16 at 01:06
  • @user4756836 - So you'll display your First Name field as being in an error state *even though it isn't* just to avoid an extra if/else? Fortunately there is a shorter way to code it, without the if/else, but even if there wasn't you really should write as much code as needed to avoid confusing the user. – nnnnnn Feb 27 '16 at 01:07
0

You forgot to add an else to your if.

 if(){
    // add the class
 } else {
    // remove the class
 }

Here's an updated fiddle: https://jsfiddle.net/za7pkb74/1/

Scott Marcus
  • 64,069
  • 6
  • 49
  • 71