2013-03-28 32 views
2

我试图撞倒的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一个孩子我想删除任何父级UL的是前级collapse和/或open找到open的孩子。也许我会疲倦,但我有这个严重缺陷的逻辑,在我的脑海中,我试图理解它,同时我觉得它不合逻辑,并且它们将是一个更简单的方法来做到这一点。 (请注意,我目前尝试的$.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'); 
      } 
     } 
    } 
}); 

回答

1

如果你把某种上你最ul的标识符或一类,你可以做这样的事情:

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

编辑:这是展示一个的jsfiddle:http://jsfiddle.net/vA5Gu/

而且,即使没有在问题中说明,这听起来像你也可能想要删除类collapse类与open类以及?如果是这样,你只需要添加addBack()命令。例如,

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

这是证明这里:http://jsfiddle.net/vA5Gu/1/

+0

这实际上是一种工作(不幸的是我坚持jQuery 1.4,并且最早采用'parentsUntil()')。所以'addBack()'不适用于我,但第一个版本不错。唯一的问题是所有的父母之前有类删除发现,但引发它说话的孩子仍然坚持需要删除的类 – chris

+0

实际上添加一个'removeClass()'然后其余的人解决了这个问题,爱链接.. – chris

0

不知道如果我清楚地知道问题,但这会工作吗?

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

我认为这是可行的。我需要在小提琴中进行测试。

0

尝试

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

找到所有UL的与.open类,并检查它们是否包含LI.open类,如果是的话,则删除opencollapse类(如果存在)。

+0

这是一个不错的主意,不幸的是我认为它违背了我寻求的粮食。最初我使用'$('ul:first-child')。find('ul.open')。removeClass('collapse open');'作为我所需要的手段,然后我意识到偶尔在父元素中的一个子元素可能具有“open”类的情况下。如果有,并且父母不想,我想从该初始子元素的所有父项(以及最初打开时找到的子元素)中移除打开和折叠类, – chris