Reputation: 2111
I created a jQuery function that adds and removes a class when clicking on a button.
The grey background will change depending on which button you click because I am adding and removing the active-button
class each time.
/* Add / remove the active button class */
jQuery(document).ready(function() {
jQuery('.sm-btn-right').click(function() {
jQuery('.sm-btn-right').addClass('active-button');
jQuery('.sm-btn-left').removeClass('active-button');
});
jQuery('.sm-btn-left').click(function() {
jQuery('.sm-btn-left').addClass('active-button');
jQuery('.sm-btn-right').removeClass('active-button');
});
});
.sm-btn-left {
color: red;
}
.sm-btn-right {
color: blue;
}
.active-button {
background-color: #ddd;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/1.12.4/jquery.js"></script>
<div class="server-location-button-wrap">
<div class="sm-btn-left flag-map-btns map_btn active-button">
Map
</div>
<div class="sm-btn-right flag-map-btns flags_btn">
List
</div>
</div>
Then I realised I needed similar functionality for some other buttons, so I decided to turn it into a reusable function that I could call when needed. But when I do that the function stops working, the active-button
class does not change.
Here is my (broken) attempt at separating it out into it's own reusable function.
/* Add / remove class */
function bgAddRemoveClass(elem1, elem2, theClassNoDot) {
jQuery('elem1').click(function() {
jQuery('elem1').addClass('theClassNoDot');
jQuery('elem2').removeClass('theClassNoDot');
});
jQuery('elem2').click(function() {
jQuery('elem2').addClass('theClassNoDot');
jQuery('elem1').removeClass('theClassNoDot');
});
}
/* Invoke the function */
jQuery(document).ready(function() {
bgAddRemoveClass('.sm-btn-left', '.sm-btn-right', 'active-button');
});
.sm-btn-left {
color: red;
}
.sm-btn-right {
color: blue;
}
.active-button {
background-color: #ddd;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/1.12.4/jquery.js"></script>
<div class="server-location-button-wrap">
<div class="sm-btn-left flag-map-btns map_btn active-button">
Map
</div>
<div class="sm-btn-right flag-map-btns flags_btn">
List
</div>
</div>
What am I doing wrong?
Upvotes: -1
Views: 52
Reputation: 195
I mean that you pass wrong parameters in add/remove Class function, use the name of inner parameter instead of using class name. Try call the function like this way:
bgAddRemoveClass(elem1, elem2, 'someClass');
then:
jQuery(elem1).addClass(someClass);
jQuery(elem2).removeClass(someClass);
Upvotes: 0
Reputation: 34147
Remove quotes, you need variables not strings
jQuery(elem1).click(function() {
jQuery(elem1).addClass(theClassNoDot);
jQuery(elem2).removeClass(theClassNoDot);
});
Upvotes: 4
Reputation: 960
Remove the quotes around elem1
, elem2
and theClassNoDot
inside the bgAddRemoveClass()
function. By adding quotes you are not using the values that are passed into the function and instead are passing 'elem1'
and 'elem2'
as values to jQuery.
/* Add / remove class */
function bgAddRemoveClass(elem1, elem2, theClassNoDot) {
jQuery(elem1).click(function() {
jQuery(elem1).addClass(theClassNoDot);
jQuery(elem2).removeClass(theClassNoDot);
});
jQuery(elem2).click(function() {
jQuery(elem2).addClass(theClassNoDot);
jQuery(elem1).removeClass(theClassNoDot);
});
}
/* Invoke the function */
jQuery(document).ready(function() {
bgAddRemoveClass('.sm-btn-left', '.sm-btn-right', 'active-button');
});
.sm-btn-left {
color: red;
}
.sm-btn-right {
color: blue;
}
.active-button {
background-color: #ddd;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/1.12.4/jquery.js"></script>
<div class="server-location-button-wrap">
<div class="sm-btn-left flag-map-btns map_btn active-button">
Map
</div>
<div class="sm-btn-right flag-map-btns flags_btn">
List
</div>
</div>
Upvotes: 1