【问题标题】:jQuery child of parent class change?父类的jQuery子级更改?
【发布时间】:2013-12-01 01:15:41
【问题描述】:

我正在使用 FontAwesome,我的手风琴中有一个图标。所以,我有一个加号图标和一个减号图标。当该类成为“活动标题”时,我希望它仅更改该 h2 的图标。我只是不确定该怎么做,这是我的小提琴和代码。

Check my Fiddle!

$('.accordion-header').toggleClass('inactive-header');

var contentwidth = $('.accordion-header').width();
$('.accordion-content').css({'width' : contentwidth });


$('.accordion-header').first().toggleClass('active-header').toggleClass('inactive-header');
$('.accordion-content').first().slideDown().toggleClass('open-content');


$('.accordion-header').click(function () {
    if($(this).is('.inactive-header')) {
        $('.active-header').toggleClass('active-header').toggleClass('inactive-header').next().slideToggle().toggleClass('open-content');
        $(this).toggleClass('active-header').toggleClass('inactive-header');
        $(this).next().slideToggle().toggleClass('open-content');
    }
    else {
        $(this).toggleClass('active-header').toggleClass('inactive-header');
        $(this).next().slideToggle().toggleClass('open-content');
        $(this)
    }
});

return false;

我确实认为可以使用 .parent 和 .child 来完成,但我不确定如何去做。

---编辑---

减号图标的 I 代码是:

<i class="fa fa-minus"></i>

【问题讨论】:

    标签: javascript jquery html css


    【解决方案1】:

    试试:

    JS:

    $('.accordion-header').toggleClass('inactive-header');  
    var contentwidth = $('.accordion-header').width();
    $('.accordion-content').css({'width' : contentwidth }); 
    $('.accordion-header').first().toggleClass('active-header').toggleClass('inactive-header');
    $('.accordion-header').first().find('.fa').toggleClass('fa-plus fa-minus');
    $('.accordion-content').first().slideDown().toggleClass('open-content');    
    $('.accordion-header').click(function () {
    if($(this).is('.inactive-header')) {
        $('.active-header').find('.fa').toggleClass('fa-plus fa-minus');
        $('.active-header').toggleClass('active-header').toggleClass('inactive-header').next().slideToggle().toggleClass('open-content');
            $(this).toggleClass('active-header').toggleClass('inactive-header');
            $(this).find('.fa').toggleClass('fa-plus fa-minus');
            $(this).next().slideToggle().toggleClass('open-content');
        }
        else {
            $(this).toggleClass('active-header').toggleClass('inactive-header');
            $(this).find('.fa').toggleClass('fa-plus fa-minus');
            $(this).next().slideToggle().toggleClass('open-content');
            $(this)
        }
    });
    
    return false;
    

    Fiddle here.

    【讨论】:

    • 没有必要添加 MINUS(到 css),它仅通过 jQuery 更改即可完美启动。这是最可接受的答案,因为它还在原始父级(页面加载)的焦点上触发了“减号”图标。另外,现在我知道了 find 功能!非常感谢!
    【解决方案2】:

    试试

    $('.accordion-header').toggleClass('inactive-header');
    
    var contentwidth = $('.accordion-header').width();
    $('.accordion-content').css({
        'width': contentwidth
    });
    
    
    $('.accordion-header').click(function () {
        if ($(this).is('.inactive-header')) {
            $('.active-header').toggleClass('active-header inactive-header').toggleClass('fa-plus fa-minus').next().slideToggle().toggleClass('open-content');
            $(this).toggleClass('active-header').toggleClass('inactive-header');
            $(this).next().slideToggle().toggleClass('open-content');
            $(this).find('i').toggleClass('fa-plus fa-minus');
        } else {
            $(this).toggleClass('active-header inactive-header');
            $(this).next().slideToggle().toggleClass('open-content');
            $(this).find('i').toggleClass('fa-plus fa-minus');
        }
    }).first().click();
    

    演示:Fiddle

    【讨论】:

    • 这是一个不错的选择,但在再次切换时不会替换图标。我不会投反对票,因为它很有帮助。其他人投了反对票,不是我。
    【解决方案3】:

    您应该在代码中查看一些内容,将您使用的一些元素保存到变量中并稍微清理一下代码会很有意义。上面的答案有效,但是您还应该考虑优化代码以提高性能。

    JS:

    var contentwidth = $('.accordion-header').width();
    
    var accTitles = $( '.accordion-header' );
    var accContents = $( '.accordion-content' );
    
    
    accTitles
        .first()
        .addClass('active-header');
    
    accContents
        .first()
        .slideDown( 300 )
        .addClass('open-content');
    
    
    accTitles.on('click', function ( e ) {
        var self = $( this );
    
        if(self.hasClass('active-header')) {
            self
                .removeClass('active-header')
                .children('i')
                .removeClass('fa-minus')
                .addClass('fa-plus');
            self
                .next()
                .slideUp(300)
                .removeClass('open-content');
        }
        else {
            accContents
                .slideUp(300)
                .removeClass('open-content');
    
            accTitles
                .removeClass('active-header')
                .children('i')
                .removeClass('fa-minus')
                .addClass('fa-plus');
    
            self
                .addClass('active-header')
                .children('i')
                .removeClass('fa-minus')
                .addClass('fa-plus');
            self
                .next()
                .slideDown(300)
                .addClass('open-content');
        }
    });
    

    希望这有用!

    这是一个显示它正在工作的代码 :: http://jsfiddle.net/kkemple/M32fa/7/

    【讨论】:

    • 图标的改变不起作用。你有一个很好的链接到我可以真正研究这种做事风格的地方吗?它更长,但更干净。
    • 只需要反转图标类。就这种编码风格而言,有几个地方可以开始。从 David Crockford 的“JavaScript the Good Parts”开始。我喜欢做的是看看业内顶级开发人员是如何做事的,并试图弄清楚他们为什么这样做。
    • 在更长、更简洁、更易阅读方面总是胜出,这些示例中的哪一个将在 6 个月后您必须进行更新时最容易阅读。长度也不应该是一个问题,因为您也希望在将代码发布到生产环境之前缩小代码
    • 是的,你需要更好的分离,现在你的选择器将获取页面上的每个标题和内容并影响它们,你需要将它们隔离到一个容器中,但是能够使用相同的在它们上的函数你需要创建一个工厂函数来返回单个手风琴实例,这是一个带有多个实例的工作示例的 jsfiddle :: jsfiddle.net/kkemple/M32fa/10
    • 哇,这变得更复杂了。我真的必须深入研究才能更好地理解。谢谢你的cmets,我很感激。
    【解决方案4】:

    试试这个:

    $('.accordion-header').toggleClass('inactive-header');
    
        var contentwidth = $('.accordion-header').width();
        $('.accordion-content').css({'width' : contentwidth });
    
    
        $('.accordion-header').first().toggleClass('active-header').toggleClass('inactive-header');
        $('.accordion-content').first().slideDown().toggleClass('open-content');
    
    
        $('.accordion-header').click(function () {
            if($(this).is('.inactive-header')) {
                $('.active-header').toggleClass('active-header').toggleClass('inactive-header').next().slideToggle().toggleClass('open-content');
    
                $(this).parent().find('.inactive-header').find('.fa-minus').removeClass('fa-minus').addClass('fa-plus');
                $(this).find('.fa-plus').removeClass('fa-plus').addClass('fa-minus');
                $(this).toggleClass('active-header').toggleClass('inactive-header');
                $(this).next().slideToggle().toggleClass('open-content');
            }
            else {
                $(this).parent().find('.active-header').find('.fa-minus').removeClass('fa-minus').addClass('fa-plus');
                $(this).toggleClass('active-header').toggleClass('inactive-header');
                $(this).next().slideToggle().toggleClass('open-content');
                $(this)
            }
        });
    
        return false;
    

    【讨论】:

    • 这也是一个不错的选择,但在第一个父级的原始焦点上没有减号图标。但是从一个非常好的选择开始,我不会投反对票,因为这仍然是一个很好的答案。 (赞成)
    猜你喜欢
    • 2014-03-24
    • 2014-01-21
    • 1970-01-01
    • 2018-06-18
    • 1970-01-01
    • 1970-01-01
    • 2012-12-19
    • 2019-12-02
    • 1970-01-01
    相关资源
    最近更新 更多