2010-08-05 40 views
0

我有一个代表树层次结构的嵌套无序列表。无序列表中可以有许多深度嵌套的ul标签。很简单的例子:在嵌套的ul树中获取下一个标签

<ul> 
    <li><a href="#" class="allowed">Link</a> 
     <ul> 
      <li><a href="#" class="allowed">Link</a></li> 
      <li><a href="#" class="allowed">Link</a></li> 
     </ul> 
    </li> 
    <li><a href="#" class="allowed">Link</a> 
     <ul> 
      <li><a href="#" class="disallowed">Link</a></li> 
      <li><a href="#" class="disallowed">Link</a></li> 
     </ul> 
    </li> 
</ul> 

正如你所看到的,一些链接可以有类“允许”。当点击这样的链接时,我想在树中获取下一个标签,并且如果它的类为“不允许”,请将其更改为“允许”。

如何获取树中的下一个标签?

更新:

我的意思是。之前:

<ul> 
    <li><a href="#" class="allowed">Link</a> 
     <ul> 
      <li><a href="#" class="allowed">Link</a></li> 
      <li><a href="#" class="allowed">Link</a></li> 
     </ul> 
    </li> 
    <li><a href="#" class="allowed">Link</a><!-- this gets clicked on --> 
     <ul> 
      <li><a href="#" class="disallowed">Link</a></li> 
      <li><a href="#" class="disallowed">Link</a></li> 
     </ul> 
    </li> 
</ul> 

HTML更改为:

<ul> 
    <li><a href="#" class="allowed">Link</a> 
     <ul> 
      <li><a href="#" class="allowed">Link</a></li> 
      <li><a href="#" class="allowed">Link</a></li> 
     </ul> 
    </li> 
    <li><a href="#" class="allowed">Link</a> 
     <ul> 
      <li><a href="#" class="allowed">Link</a></li> 
      <li><a href="#" class="disallowed">Link</a></li> 
     </ul> 
    </li> 
</ul> 

等。

+2

正如我所看到的那样,没有带班的“李”... – Reigel 2010-08-05 07:06:36

+0

@Reigel我纠正了错字。当然,我的意思是一个标签。 – 2010-08-05 07:14:00

+0

我还是不明白:D你可以把'之前'后代码的HTML。在点击发生之前(你已经拥有了它),并在点击发生之后.. – Reigel 2010-08-05 07:16:51

回答

1
$('.allowed').live(function() { 
    var links= $('a'); 
    var ix= links.index(this); 
    if (ix!==-1 && ix<links.length-1) 
     links.eq(ix+1).removeClass('disallowed').addClass('allowed'); 
}); 
  • 这款采用live()赶上点击,假设一个链接更改为class="allowed"后后,单击应执行相同的操作

  • 它看起来对下一个链接整个页面。如果您只想检查特定容器内部,请将其用作父级以查找链接,例如。 var links= $('#myul a');,以提高效率,并防止其影响其他页面链接

+0

谢谢,我会去试试看,如果有效,我会接受你的回答。 – 2010-08-05 08:11:35

0

你可以做类似

$('a.allowed').click(function(){ 
    $(this).next().find('a:first').attr('class', 'allowed'); 
}); 

这将使所有的一个标签UL在旁边被点击的链接有一个类allowed

+0

是的,但并不一定如此。上面的HTML结构只是一个例子,里面可能有另一个嵌套的ul。 – 2010-08-05 07:13:14

+0

所以你想要点击链接下的所有'a'应该转到'allowed'?在你的编辑中,唯一改变的链接就是找到的第一个“a”。 – 2010-08-05 08:10:30

+0

你可以试试我的编辑.. – 2010-08-05 08:13:39

1
$(document).ready(function() { 
     var el = null; 
     $('ul li a.allowed').click(function(){ 
     el = $(this); 
     while($(el).closest('.ul')){ 
      el = $(el).closest('.ul'); 
      var a = $(el).find('li a.disallowed:first'); 
      if(a){ 
      $(a).removeclass('disallowed').addClass('allowed'); 
      return true; 
      } 
     } 
    }); 
}); 
1
$(function(){ 
    $('ul li a').click(function(){ 
     if ($(this).is('.allowed')) { 
      var nextElem = $(this).next('ul').length?$(this).next('ul'):$(this).closest('li').next('li'); 
      nextElem.find('a:first'). 
       filter(function(){ 
        return $(this).is('.disallowed'); 
       }). 
       removeClass('disallowed'). 
       addClass('allowed'); 
     } 
     return false; 
    }); 
}); 

唷! demo

+0

它不起作用。尝试点击顶部的第11个链接。 – 2010-08-05 08:11:08

+0

不好意思?...第11条是不允许的吗?所以这将不起作用。 – Reigel 2010-08-05 08:14:22

+0

是的,但在11日之后点击链接是允许的。然后点击第11个链接,看看会发生什么(允许第11个链接后有多个链接)。 – 2010-08-05 08:44:22