2010-01-12 58 views
12

所以,我有一個導航列表,並有子列表和子列表。在jQuery中向上移動多個父母 - 更有效的方式?

基本上,導航是默認情況下摺疊,但如果人們點擊一個子列表中的頁面,我想顯示父列表。如果它是子列表的子列表,則需要顯示父列表。我已經設置了它,但是,我不喜歡將5 .parent()。parent()向上遍歷以展開列表。有沒有更高效的方法?

的HTML:

<div id="lesson-sidebar"> 
     <ul> 
      <li><a href="index.html">Welcome to Beat Basics and Beyond</a></li> 
      <li><a href="table-of-contents.html">What's in this course?</a></li> 
      <li><a href="defining-your-beat.html" class="active">Defining Your Beat</a> 
       <ul> 
        <li><a href="boundaries-of-your-beat.html">Boundaries of Your Beat</a></li> 
        <li><a href="the-beat-description.html">The Beat Description</a></li> 
        <li><a href="build-your-own-beat-description.html"><span class="ital">Activity:</span> Build Your Own Beat Description</a></li> 
       </ul> 
      </li> 
      <li><a href="getting-started.html">Getting Started</a> 
       <ul> 
        <li><a href="debrief-your-predecessor.html">Debrief Your Predecessor</a></li> 
        <li><a href="predecessor-top-five-tips.html"><span class="ital">Activity:</span> List The Top Five Tips From Your Predecessor</a></li> 
        <li><a href="covering-your-beat-with-the-internet.html">Covering Your Beat With The Internet</a></li> 
        <li><a href="get-in-the-car-and-go.html">Get in the Car and Go</a></li> 
        <li><a href="mapping-your-beat.html">Mapping Your Beat</a></li> 
        <li><a href="read-the-clips.html">Read the Clips</a></li> 
        <li><a href="activity-dissect-this-clip.html"><span class="ital">Activity:</span> Dissect This Clip</a></li> 
        <li><a href="writing-your-first-article.html">Writing Your First Article</a></li> 
        <li><a href="starting-cold-on-the-beat.html">Starting Cold on the Beat</a></li> 
       </ul>   
      </li> 
      <li><a href="working-with-sources.html">Working With Sources</a> 
       <ul> 
        <li><a href="finding-sources.html">Finding Sources</a></li> 
        <li><a href="diversify-your-sources.html">Diversify Your Sources</a></li> 
        <li><a href="prospecting-for-stories-and-sources.html">Prospecting for Stories and Sources</a></li> 
        <li><a href="building-relationships.html">Building Relationships</a></li> 
        <li><a href="going-off-the-record.html">Going Off the Record</a></li> 
       </ul> 
      </li> 
      <li><a href="developing-resources.html">Developing Resources to Help You on the Beat</a> 
       <ul> 
        <li><a href="develop-a-calendar-of-events.html">Develop a Calendar of Events</a></li> 
        <li><a href="build-your-library.html">Build Your Library</a></li> 
        <li><a href="learn-the-open-record-laws.html">Learn the Open Record Laws</a></li> 
       </ul> 
      </li> 
      <li><a href="extra-resources.html">Extra Resources</a> 
       <ul> 
        <li><a href="beat-breakdown-tool.html">Beat Breakdown Tool</a></li> 
        <li><a href="links-library.html">Links Library</a> 
         <ul> 
          <li><a href="general-resources-for-any-beat.html">General Resources for Any Beat</a></li> 
          <li><a href="courts-and-criminal-justice-links.html">Courts and Criminal Justice Links</a></li> 
          <li><a href="education-resources.html">Education Resources</a></li> 
          <li><a href="local-government-links.html">Local Government Links</a></li> 
          <li><a href="neighborhood-or-suburban-links.html">Neighborhood or Suburban Links</a></li> 
          <li><a href="police-and-public-safety-links.html">Police and Public Safety Links</a></li> 
          <li><a href="reporter-organizations.html">Reporter Organizations</a></li> 
         </ul> 
        </li> 
        <li><a href="additional-reading.html">Additional Reading</a></li> 
       </ul> 
      </li> 
      <li><a href="final-thoughts.html">Final Thoughts</a></li> 
     </ul> 

jQuery的:

function toggleSubmenu() { 

    if ($(this).hasClass('submenu-hidden')) { 

     $(this).parent().children('ul').slideToggle(); 
     $(this).removeClass().addClass('submenu-visible'); 

    } else if ($(this).hasClass('submenu-visible')) { 

     $(this).parent().children('ul').slideToggle(); 
     $(this).removeClass().addClass('submenu-hidden'); 
    } 
} 

$('#lesson-sidebar ul ul').hide(); 
$('#lesson-sidebar ul ul ul').hide(); 
$('#lesson-sidebar ul:first-child').attr('id', 'rootlist'); 
$('#lesson-sidebar ul li:has("ul")').prepend('<span class="submenu-hidden"></span>').css('list-style','none'); 

$('#lesson-sidebar ul li a').each(
    function() { 
     if ($(this).hasClass('active')) { 
      // if it is a UL 
      var length = $(this).parent().find("ul").length; 
      alert(length); 
      if (length == 0) { 
       if ($(this).parent().parent().parent().children('span').hasClass('submenu-hidden')) { 
         $(this).parent().parent().parent().children('ul').show(); 
         $(this).parent().parent().parent().children('span').removeClass('submenu-hidden').addClass('submenu-visible'); 
       } 
       if ($(this).parent().parent().parent().parent().parent().children('span').hasClass('submenu-hidden')) { 
         $(this).parent().parent().parent().parent().parent().children('ul').show(); 
         $(this).parent().parent().parent().parent().parent().children('span').removeClass('submenu-hidden').addClass('submenu-visible'); 
       } 
      } 
      if (length == 1) { 
       $(this).parent().find('ul').slideToggle(); 
       $(this).parent().children('span').removeClass('submenu-hidden').addClass('submenu-visible'); 
      }    
     } 
    } 
); 

$('ul#rootlist > li span, ul#rootlist li ul li > span').bind('click', toggleSubmenu); 

任何及所有幫助是majorly讚賞。

回答

12

如果我理解你想要做什麼......你可以做這樣的事情:

​​

parents()siblings()方法都非常適合這種事情。

編輯:之前有一個錯誤沒有顯示父母兄弟姐妹。試試這個新版本。

編輯2:現在它可以在錨點而不是列表項目上使用class =「active」。

+0

這差不多就是我要找的。父母的事情是驚人的!我找到了一個使用eq方法的解決方案,但這種方法更加簡潔。 唯一的一點是,它不是li.active,它是a.active,所以我仍然試圖讓兄弟姐妹展示。 非常感謝:D – 2010-01-12 23:48:50

+0

我只是改變它與a.active一起工作。請記住投票並點擊答案旁邊的綠色複選標記。 :) – 2010-01-12 23:56:55

+0

檢查並投票。你的快速和明確的反應是一個巨大的幫助。 – 2010-01-13 01:34:14

0

$(this).parents().get()[4]會給你第五

3

爲了簡化蘭斯McNeary的非常有用的答案,關鍵是要使用:

.parents([selector]) 

如果提供的jQuery代表了一組DOM元素,在 。家長()方法允許我們搜索通過DOM樹中這些 元素的祖先並從 匹配元素中構建一個新的jQuery對象;元素 按從最接近的父元素到外部元素的順序返回。

另一個用戶建議:

.closest([selector]) 

到。家長(類似),這可能是更好的選擇,因爲它一旦停止它發現它正在尋找的元件。似乎在這種情況下它會更有效率。 有關更多詳細信息,請參閱http://api.jquery.com/closest/。 希望這有助於人們理解.closest()和.parents()之間的差異以及jQuery的強大和靈活性。

+0

請不要重新配置其他答案。一個新的答案是提出一個新想法。如果需要改進,請評論或建議修改。 – 2012-11-15 02:23:26

+1

我認爲邁克爾的答案更清晰。當我無法理解蘭斯的答案時,它有所幫助。 – 2014-12-16 22:56:10

-1

嘗試使用此代碼行:

$(this).parent().parent().fadeOut(); 
+2

請爲你解答一個答案。 – 2016-06-20 14:54:51

相關問題