Reputation: 16469
I have this set of buttons:
<div class="test-button-set">
<button id="hdfs_test" class="btn btn-default btn-lg">HDFS</button>
<button id="hive_test" class="btn btn-default btn-lg">HIVE</button>
<button id="hdfs_hive_test" class="btn btn-default btn-lg">BOTH</button>
</div>
What I want to do is, when I click on one of these buttons, add a class to the clicked button and remove the same class from all the other buttons. This is what I have so far but as I am new to JS/jQuery I am having a bit of trouble
var testButtonSet = document.getElementsByClassName("test-button-set")[0].getElementsByTagName("button");
testButtonSet.forEach($(this).click(function() {
testButtonSet.removeClass("selected");
this.addClass("selected");
}));
Upvotes: 1
Views: 100
Reputation: 59
First things first, the foreach function receives a function as a first parameter so instead of using it like this:
testButtonSet.forEach($(this).click(function() {
testButtonSet.removeClass("selected");
this.addClass("selected");
}));
It should be used like this:
testButtonSet.forEach(function(element, index, array){
$(element).click(function() {
testButtonSet.removeClass("selected");
this.addClass("selected");
})
);
However the foreach method works with arrays and not dom elements. https://developer.mozilla.org/es/docs/Web/JavaScript/Referencia/Objetos_globales/Array/forEach
Fortunately we have a couple of things to work around this...
One is to "demethodize" it as shown here:
var each = Function.prototype.call.bind([].forEach);
http://colintoh.com/blog/5-array-methods-that-you-should-use-today#demethodizing
Another one is to use jquery "each" method i.e.
$.each(array, function(){});
http://api.jquery.com/jquery.each/
$(elements).each(function(){});
That being said, now you can choose between using jquery or the native demethodized version.
each(testButtonSet, function(element, index, array){
$(element).click(function() {
testButtonSet.removeClass("selected");
this.addClass("selected");
});
});
$(testButtonSet).each(function(index, element){
$(element).click(function() {
testButtonSet.removeClass("selected");
this.addClass("selected");
});
});
Fiddles: forEach: http://jsfiddle.net/ze6bkprg/ Jquery: http://jsfiddle.net/n8sn9y2k/
Upvotes: 1
Reputation: 49095
The pure jQuery way would be:
$('.test-button-set button').click(function() {
var $this = $(this);
$this.siblings().removeClass("selected");
$this.addClass("selected");
});
Upvotes: 1
Reputation: 16719
$('button').on('click', function(){
$(this).addClass('selected').siblings().removeClass('selected');
});
Upvotes: 1
Reputation: 36438
Close. You're trying to use jQuery methods on raw-DOM objects. Wrap them first:
testButtonSet.forEach($(this).click(function() {
$(testButtonSet).removeClass("selected");
$(this).addClass("selected");
}));
Or, to go full-jQuery:
var testButtons = $('.test-button-set button');
testButtons.click( function() {
testButtons.removeClass('selected');
$(this).addClass('selected');
});
Example:
var testButtons = $('.test-button-set button');
testButtons.click(function() {
testButtons.removeClass('selected');
$(this).addClass('selected');
});
.selected {
color: red;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<div class="test-button-set">
<button id="hdfs_test" class="btn btn-default btn-lg">HDFS</button>
<button id="hive_test" class="btn btn-default btn-lg">HIVE</button>
<button id="hdfs_hive_test" class="btn btn-default btn-lg">BOTH</button>
</div>
Upvotes: 2
Reputation: 27765
Your code can be:
$( '.test-button-set button' ).click(function() {
$( '.test-button-set button' ).removeClass("selected");
$( this ).addClass("selected");
});
Upvotes: 1