Search code examples
javascriptjqueryhtmlcssstylesheet

JQuery not removing class?


So, I am trying to create blocks that cycle through some colors. Each color is defined by a class, and I remove a certain class color, then add another class color when a block is clicked. Each segment of code looks like this:

//Function 1
$('.blue').click(function(){
    console.log("Blue has been clicked");
    $(this).addClass('green');
    $(this).removeClass('blue');
}); 

//Function 2
$('.green').click(function(){
    console.log("Green has been clicked");
    $(this).addClass('yellow');
    $(this).removeClass('green');
}); 

When a block is clicked a first time, the color is changed. But when I click it again, the color does not change.

I added console.log statements to monitor in Console what was happening. As an example, when I click a box that has the blue class, it adds the green class, and the blue class is removed. But when I click the same box (that is now green) I expect the second function to run, and the box to change into a yellow color. However, what I can see through the console is that the first function is trying to run again.

I checked the HTML, and the classes do change.

My question is, why is function 1 triggered when the first box is no longer a member of the blue class? Should it not be calling function 2, since it is now a member of the green class?

The CodePen is here, I am actively working on it. I will mention here when the CodePen works.

**The CodePen now works, I used $(document).on('click', '.green') instead of $('.green).click() **

Thank you!


Solution

  • Since you want to change the event handlers based on changed selectors you need to use event delegation.

    //Function 1
    $(document).on('click', '.blue', function () {
        console.log("Blue has been clicked");
        $(this).addClass('green');
        $(this).removeClass('blue');
    });
    
    //Function 2
    $(document).on('click', '.green', function () {
        console.log("Green has been clicked");
        $(this).addClass('yellow');
        $(this).removeClass('green');
    });
    

    In your event registration, the selectors are evaluated only once when the page is loaded, any changes done after that to the classes will not affect the registered handlers.


    Code Snippet Example

    $(document).on('click', '.blue', function () {
        console.log("Blue has been clicked");
        $(this).addClass('green');
        $(this).removeClass('blue');
    });
    
    //Function 2
    $(document).on('click', '.green', function () {
        console.log("Green has been clicked");
        $(this).addClass('yellow');
        $(this).removeClass('green');
    });
    
    $(document).on('click', '.yellow', function () {
        console.log("Yellow has been clicked");
        $(this).addClass('blue');
        $(this).removeClass('yellow');
    });
    
    $(document).on('click', '.red', function () {
        console.log("Red has been clicked");
        $(this).addClass('blue');
        $(this).removeClass('red');
    });
    .block{
    	display: inline-block;
    	width: 200px;
      height: 100px;
    }
    
    .green{
    	background-color: green;
    }
    
    .blue{
    	background-color: blue;
    } 
    
    .yellow{
    	background-color: yellow;
    }
    
    .red{
    	background-color: red;
    }
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
    <div class='block green'></div>
    <div class='block blue'></div>
    <div class='block yellow'></div>
    <div class='block red'></div>