2010-01-12 34 views
12

Vì vậy, tôi có điều hướng là danh sách và có danh sách phụ và danh sách phụ.Di chuyển nhiều cha mẹ trong jQuery - cách hiệu quả hơn?

Về cơ bản, điều hướng theo mặc định bị thu hẹp, nhưng nếu mọi người nhấp vào một trang nằm trong danh sách phụ, tôi muốn hiển thị danh sách chính. Và nếu đó là danh sách phụ của danh sách phụ, tôi cần cả hai danh sách mẹ để hiển thị. Tôi đã thiết lập nó, nhưng, tôi không thích đặt 5. Parent(). Parent() 's để đi ngang lên để mở rộng danh sách. Có cách nào hiệu quả hơn không?

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> 

Các 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); 

Bất kỳ và tất cả sự giúp đỡ được majorly đánh giá cao.

Trả lời

12

Nếu tôi hiểu những gì bạn đang cố gắng để làm ... bạn có thể làm một cái gì đó như thế này:

// For my benefit, hide all lists except the root items 
$('ul, li', $('#lesson-sidebar ul li')).hide(); 

// Show active parents and their siblings 
$('li a.active').parents('ul, li').each(function() { 
    $(this).siblings().andSelf().show(); 
}); 

// Show the active item and its siblings 
$('li a.active').siblings().andSelf().show(); 

Các parents()siblings() phương pháp đều tuyệt vời cho loại điều.

Chỉnh sửa: Đã xảy ra lỗi trước khi không hiển thị anh chị em ruột. Hãy thử phiên bản mới này.

Chỉnh sửa 2: Bây giờ nó hoạt động với class = "active" trên neo thay vì mục danh sách.

+0

này là khá nhiều những gì tôi đang tìm kiếm. Điều cha mẹ thật tuyệt vời !! Tôi đã tìm thấy một giải pháp bằng cách sử dụng phương pháp: eq, nhưng đây là cách dọn dẹp. Điều duy nhất là nó không phải là li.active, nó là a.active, và vì vậy tôi vẫn đang cố gắng để các anh chị em hiển thị. Cảm ơn rất nhiều: D –

+0

Tôi vừa thay đổi nó để làm việc với a.active. Hãy nhớ bỏ phiếu và nhấn dấu kiểm màu xanh bên cạnh câu trả lời nếu nó hoạt động. :) –

+0

Đã kiểm tra và bỏ phiếu. Phản ứng nhanh chóng và rõ ràng của bạn là một trợ giúp lớn. –

16

$(this).closest("ul") sẽ đi qua các bậc phụ huynh cho đến khi nó tìm thấy một ul

http://docs.jquery.com/Traversing/closest#expr

... được những yếu tố đầu tiên mà phù hợp với selector bằng cách kiểm tra các yếu tố bản thân và vượt qua lên thông qua tổ tiên của nó trong DOM cây ...

0

$(this).parents().get()[4] sẽ cung cấp cho bạn thứ năm

3

Để đơn giản hóa câu trả lời rất hữu ích Lance McNeary, những Bí quyết là để sử dụng:

.parents([selector]) 

Cho một đối tượng jQuery đại diện cho một tập hợp các phần tử DOM, các .parents() phương pháp cho phép chúng ta tìm kiếm thông qua tổ tiên của các phần tử trong cây DOM và xây dựng một đối tượng jQuery mới từ các phần tử phù hợp được đặt hàng từ cha mẹ trực tiếp trên; các phần tử được trả về theo thứ tự từ bố mẹ gần nhất đến các phần tử bên ngoài.

Một người dùng khác đề nghị:

.closest([selector]) 

Tương tự như .parents(), đây có thể là một lựa chọn tốt hơn khi nó dừng lại khi nó tìm thấy các yếu tố đó đang tìm kiếm. Có vẻ như nó sẽ hiệu quả hơn trong trường hợp này. Xem http://api.jquery.com/closest/ để biết thêm chi tiết. Hy vọng điều này sẽ giúp mọi người hiểu được sự khác biệt giữa .closest() và .parents() và jQuery mạnh mẽ và linh hoạt như thế nào.

+0

Vui lòng không sửa đổi các câu trả lời khác. Một câu trả lời mới là đưa ra một ý tưởng mới. Vui lòng nhận xét hoặc đề xuất chỉnh sửa nếu cần cải thiện điều gì đó. –

+1

Tôi nghĩ câu trả lời của Michael là sạch hơn. Nó đã giúp khi tôi không thể hiểu được điểm trong câu trả lời của Lance. –

-1

Hãy thử với dòng mã này:

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

Vui lòng thêm giải thích cho bạn câu trả lời. –

Các vấn đề liên quan