开发者

jQuery siblings / removeClass "active" just wont work

I've been trying to get this arrow toggle script work on my page. I think i miss something simple but I just d开发者_如何学Goon't know what is it. Been spending 2 hrs to figure this out.

The script :

$(document).ready(function(){

    $(".accordion h3:first").addClass("active");
    $(".accordion a:first").addClass("active");
    $(".accordion p:not(:first)").hide();

    $(".accordion h3").click(function() 
    {
        $(this).next("p").slideDown("slow")
               .siblings("p:visible").slideUp("slow");
    });

    $(".accordion a").click(function() 
    {
        $(this).css({background:"url(images/arrowdown.gif) bottom right no-repeat"});
        $(this).siblings("a").removeClass("active");
    });  
});

css:

.accordion h3 a {
    padding:20px 0 0 190px; 
    display:block;  
    background:url(images/arrowup.gif) no-repeat bottom right; }

.accordion h3 a:hover { text-decoration:none;   }

.accordion h3 a.active {
    background:url(images/arrowdown.gif) no-repeat bottom right; }

Then my HTML :

<div class="accordion">
    <h3 id="tab1">
        <a href="#">Title 1</a>
    </h3>
    <p>Description Title 1</p>
    <h3 id="tab2">
        <a href="#">Title 2</a>
    </h3>
    <p>Description Title 2</p>
    <h3 id="tab3">
        <a href="#">Title 3</a>
    </h3>
    <p>Description Title 3</p>
</div>

So the up & down arrow is INSIDE the "a href" tag and there is a different background image in H3 tag depends on the "tab" ID. I hope that make senses.

Thank you in advance!!


The issue is that siblings works for elements under the same parent. Your a links are not under the same parent since each one is wrapped in a h3.

So I believe this is what you want

$(document).ready(function(){

    $(".accordion h3:first").addClass("active");
    $(".accordion a:first").addClass("active");
    $(".accordion p:not(:first)").hide();

    $(".accordion h3").click(function() {
        $(this)
            .addClass('active') //set the current as active
            .siblings("h3") //find sibling h3 elements
            .removeClass("active") // and remove the active from them
            .end() // return selection to the current element
            .next("p") // find the next p
            .slideDown("slow") // and show it
            .siblings("p:visible") // find the other visible p elements
            .slideUp("slow"); // and hide them

        $(this)
            .find('a') // find a under current element
            .addClass('active') // and add active class
            .end() // return to current element
            .siblings('h3') // find sibling h3 elements
            .find('a') // find their a elements
            .removeClass('active'); // and remove the active
    });

});

Demo at http://jsfiddle.net/gaby/NSvQB/


There are two errors in the script:

  1. Each <a> element is the only child an <h3> element. There are no other <a> siblings. What you want is to find all other <a> element inside the headers of the accordion:

    $(this).closest('.accordion').find('h3 a').removeClass("active");
    
  2. Setting the style on an element ($(this).css(...);) will overwrite any other style definitions. Changes to the background later via changing a class (in this case, removing the class active) will not have any effect [demo]. So instead of setting the style directly, you should set the active class:

    $(this).addClass('active');
    

Working DEMO


Update: You could also simplify the whole code by putting everything into the h3 click event handler and even add the active class to it.

JavaScript:

$(".accordion h3").click(function() {

    $(this).siblings().removeClass("active");
    $(this).addClass('active');

    $(this).next("p").slideDown("slow")
           .siblings("p:visible").slideUp("slow");

});

CSS (changed part):

.accordion h3.active a {
    background:red; 
}

DEMO 2

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜