jQuery,反向$ .each各种各样?

时间:2013-03-28 17:13:17

标签: javascript jquery dom

我正在试图运行UL集:

<ul>
    <li>
        <h2>Header 1</h2>
        <ul class="collapse">
            <li>A</li>
            <li>B</li>
            <li>C</li>
            <li>D</li>
            <li>E</li>
        </ul>
    </li>
    <li>
        <h2>Header 2</h2>
        <ul class="collapse">
            <li>A</li>
            <li>B</li>
            <li>C</li>
            <li>D</li>
            <li>
                <h2>Header 3</h2>
                <ul class="collapse">
                    <li>A</li>
                    <li>B</li>
                    <li>C</li>
                    <li>D</li>
                    <li>
                        <h2>Header 4</h2>
                        <ul class="collapse open">
                            <li>A</li>
                            <li>B</li>
                            <li>C</li>
                            <li>D</li>
                            <li>E</li>
                        </ul>
                    </li>
                </ul>
            </li>
        </ul>
    </li>
</ul>

如果我找到其中一个班级为open的孩子,我想从{@ 1}}和/或collapse中找到该班级之前的任何家长级别的open和/或open { {1}}。也许我累了,但我有这个严重缺陷的逻辑,在我的脑海中,我试图理解它,同时我觉得它不合逻辑,而且必然会有一个更简单的方法来做到这一点。 (请注意,我目前正在尝试的$.each()是有缺陷的,无论如何都无法工作)。但是我可以使用一些想法来解决这个问题,如果有人去的话。

$('ul').each(function()
{
    if($(':not(:first)', this))
    {
        if($(this).hasClass('collapse'))
        {
            alert('collapse found');
            $kid = $(this).child('ul');

            if($kid.hasClass('open'))
            {
                alert('uh')
                $kid.parents('ul').removeClass('collapse');
            }
        }
    }
});

5 个答案:

答案 0 :(得分:2)

$('ul.open:has(li.open)').removeClass('open collapse');

使用UL类查找所有.open,并检查它们是否包含LI.open,如果是,请同时删除opencollapse课程(如果有)。

答案 1 :(得分:1)

如果您在顶部ul放置某种标识符或类别,则可以执行以下操作:

$('.collapse .open')
    .parentsUntil('#root', 'ul.collapse')
    .removeClass('collapse');

编辑:这是一个证明:http://jsfiddle.net/vA5Gu/

的jsfiddle

此外,即使问题中没有说明,听起来您可能也想删除collapse类的元素上的open类?如果是这样,您只需要添加addBack()命令。如,

$('.collapse .open')
    .parentsUntil('#root', 'ul.collapse')
    .addBack()
    .removeClass('collapse');

此处演示了这一点:http://jsfiddle.net/vA5Gu/1/

答案 2 :(得分:0)

不确定我是否清楚地解决了这个问题,但这会有效吗?

$('.collapse.open').each(function(){
    $(this).closest('ul.collapse').removeClass('collapse');
});

答案 3 :(得分:0)

$('.collapse .open').each(function(){
    $(this).parent().removeClass('collapse');
});

我认为这会奏效。我需要在小提琴中进行测试。

答案 4 :(得分:0)

尝试

$('.collapse.open').each(function(){
    $(this).parents('ul.collapse, ul.open').removeClass('collapse open');
});