2010-08-05 69 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