jQuery 兄弟/removeClass“active”只是行不通

发布于 2024-11-19 21:15:12 字数 1515 浏览 3 评论 0原文

我一直在尝试让这个箭头切换脚本在我的页面上工作。我想我错过了一些简单的东西,但我只是不知道它是什么。花了2个小时才弄清楚这个问题。

脚本:

$(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; }

然后我的 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>

所以 up &向下箭头位于“a href”标签内,H3 标签中有不同的背景图像,具体取决于“tab”ID。我希望这是有道理的。

先感谢您!!

I've been trying to get this arrow toggle script work on my page. I think i miss something simple but I just don'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!!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

最单纯的乌龟 2024-11-26 21:15:13

问题是 siblings 适用于同一父级下的元素。您的 a 链接不在同一父链接下,因为每个链接都包含在 h3 中。

所以我相信这就是您想要的

$(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
    });

});

演示 http://jsfiddle.net/gaby/NSvQB/

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/

山田美奈子 2024-11-26 21:15:13

该脚本中有两个错误:

  1. 每个 元素都是

    元素的唯一子元素。没有其他 兄弟姐妹。您想要的是找到手风琴标题内的所有其他 元素:

    $(this).closest('.accordion').find('h3 a').removeClass("active");
    

  2. Setting the style on an element ($(this).css(... );) 将覆盖任何其他样式定义。稍后通过更改类来更改背景(在本例中,删除类 active不会产生任何效果[演示]。因此,您应该设置 active 类,而不是直接设置样式:

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

Working 演示


更新:您还可以通过将所有内容放入 h3 点击事件处理程序中来简化整个代码,甚至添加 active< /code> 类。

JavaScript:

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

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

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

});

CSS(更改部分):

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

DEMO 2

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文