Reputation: 1461
I have built the following super simple JQuery accordion:
jQuery(document).ready(function($) {
var allPanels = $('.accordion > div').hide();
$('.accordion > h2 > a').click(function() {
allPanels.slideUp().addClass("closed");
if($(this).parent().next().css('display')=='none') {
$(this).parent().next().slideDown().removeClass("closed");
}
return false;
});
}); // End JQuery
<script src="http://code.jquery.com/jquery-1.11.1.min.js"></script>
<div class="accordion">
<h2><a href="">Click me</a></h2>
<div class="content">
<p>Here's the content</p>
</div><!-- .content -->
<h2><a href="">Click me</a></h2>
<div class="content">
<p>Here's the content</p>
</div><!-- .content -->
<h2><a href="">Click me</a></h2>
<div class="content">
<p>Here's the content</p>
</div><!-- .content -->
</div><!-- .accordion -->
I have a class being added and removed to .content div
, but would like instead to add it to the <h2>
so I can add open and close symbols. Is this possible?
Upvotes: 4
Views: 1005
Reputation: 1
You can simply do this:
jQuery(document).ready(function ($) {
var allPanels = $('.accordion > div').hide();
$('.accordion > h2 > a').click(function () {
allPanels.css('display', 'none');
allPanels.removeClass("closed");
$(this).parent().addClass("closed");
$(this).parent().next().slideDown();
return false;
});
}); // End JQuery
Upvotes: 0
Reputation: 388316
You can add/remove the class to the clicked element's parent like
jQuery(document).ready(function($) {
var allPanels = $('.accordion > div');
var allH2 = $('.accordion > h2');
$('.accordion > h2 > a').click(function() {
var $h2 = $(this).parent();
allH2.not($h2).removeClass('active');
allPanels.stop(true).slideUp().find('.accordion-heading').addClass("closed");
if ($(this).parent().next().css('display') == 'none') {
$(this).parent().next().slideDown().find('.accordion-heading').removeClass("closed");
}
$h2.toggleClass('active');
return false;
});
}); // End JQuery
.accordion .content {
display: none;
}
.accordion h2.active:before {
content: '-'
}
.accordion h2:before {
content: '+'
}
<script src="http://code.jquery.com/jquery-1.11.1.min.js"></script>
<div class="accordion">
<h2 class="accordion-heading"><a href="">Click me</a></h2>
<div class="content" style="display: none;">
<p>Here's the content</p>
</div>
<!-- .content -->
<h2 class="accordion-heading"><a href="">Click me</a></h2>
<div class="content" style="display: none;">
<p>Here's the content</p>
</div>
<!-- .content -->
<h2 class="accordion-heading"><a href="">Click me</a></h2>
<div class="content" style="display: none;">
<p>Here's the content</p>
</div>
<!-- .content -->
</div>
<!-- .accordion -->
A more simplified version can be, with css 3
jQuery(document).ready(function($) {
$('.accordion > h2').click(function(e) {
e.preventDefault();
var $this = $(this);
$this.toggleClass('active');
$this.next().stop()[$this.hasClass('active') ? 'slideDown' : 'slideUp']();
$this.siblings('.accordion-heading').removeClass('active').next().stop().slideUp();
});
}); // End JQuery
.accordion > .content {
display: none;
}
.accordion > h2.active:before {
content: '-'
}
.accordion > h2:before {
content: '+'
}
<script src="http://code.jquery.com/jquery-1.11.1.min.js"></script>
<div class="accordion">
<h2 class="accordion-heading"><a href="">Click me</a></h2>
<div class="content" style="display: none;">
<p>Here's the content</p>
</div>
<!-- .content -->
<h2 class="accordion-heading"><a href="">Click me</a></h2>
<div class="content" style="display: none;">
<p>Here's the content</p>
</div>
<!-- .content -->
<h2 class="accordion-heading"><a href="">Click me</a></h2>
<div class="content" style="display: none;">
<p>Here's the content</p>
</div>
<!-- .content -->
</div>
<!-- .accordion -->
Upvotes: 4
Reputation: 1212
You can use .find() function of jQuery to find the element with that class. You can also find the tag but it is a better practice to find it using a custom class.
jQuery(document).ready(function($) {
var allPanels = $('.accordion > div').hide();
$('.accordion > h2 > a').click(function() {
allPanels.slideUp().find('.accordion-heading').addClass("closed");
if($(this).parent().next().css('display')=='none') {
$(this).parent().next().slideDown().find('.accordion-heading').removeClass("closed");
}
return false;
});
}); // End JQuery
<script src="http://code.jquery.com/jquery-1.11.1.min.js"></script>
<div class="accordion">
<h2 class="accordion-heading"><a href="">Click me</a></h2>
<div class="content">
<p>Here's the content</p>
</div><!-- .content -->
<h2 class="accordion-heading"><a href="">Click me</a></h2>
<div class="content">
<p>Here's the content</p>
</div><!-- .content -->
<h2 class="accordion-heading"><a href="">Click me</a></h2>
<div class="content">
<p>Here's the content</p>
</div><!-- .content -->
</div><!-- .accordion -->
Upvotes: 1