2009-10-21 33 views
10

Tôi hy vọng bạn có thể trợ giúp. Tôi rất mới với jQuery và đang làm việc trên một trình đơn accordion năm hoặc sáu cấp cho điều hướng bên của tôi. Tôi đã nhận được phần lớn mã tôi có từ Dane Peterson @ daneomatic.com (cảm ơn Dane!). Nhưng, tôi đang bị mắc kẹt trên một điều:Menu accordion jQuery - giữ menu accordion mở trên trang Tôi đang ở trên

Tôi muốn có accordion/cây công việc của tôi như thế này:

Khi tôi di chuyển xuống, nói rằng, mức độ ba, và nhấp vào liên kết để mở trang được liên kết với cấp đó, làm cách nào để tôi chỉ ra khi trang cấp ba tải lên mà tôi đang ở trên trang đó? Ngoài ra, làm cách nào để giữ cây mở ở cấp đó khi tôi tải trang?

Tôi đoán những gì tôi yêu cầu là: có cách nào để accordion/tree tự động cập nhật để hiển thị trang bạn đang ở không và có cây mở cho cấp đó không?

Cảm ơn trước!

Trả lời

0

Đây là một trong những cạm bẫy của các trang web được điều hướng bằng JavaScript - URL của bạn không thực sự trỏ đến trang của bạn, như một trang truyền thống. Việc sử dụng các tính năng của trình duyệt thông thường như dấu trang và nút quay lại trở nên khó khăn.

Một giải pháp mà một số người dường như đang sử dụng những ngày này là lưu trữ thông tin này sau phần băm của url.

http://www.mysite.com/path/index.html#jsPageIndicator 

Bằng cách lưu trữ thông tin thay cho "jsPageIndicator" ở trên, bạn có thể phân tích nó với JavaScript sau $ (document) .ready(), và có nó cho bạn biết những gì trang nên được nạp. Trong trường hợp của bạn, điều này có thể là một cái gì đó đơn giản, chẳng hạn như chỉ số của accordion có trọng tâm (nên được mở).

Bạn cũng có thể muốn nhìn vào jQuery history plugin.

Hoặc, như Alex chỉ ra dưới đây, benalman.com/projects/jquery-bbq-plugin

+0

Nếu bạn đã đi với phương pháp thay đổi băm được mô tả ở đây, plugin sau đây chưa được so khớp: http://benalman.com/projects/jquery-bbq-plugin/ - nó sẽ sớm thay thế plugin lịch sử jQuery ngày tháng khủng khiếp. –

+0

@ Alex - đẹp quá! không nhận thức được điều đó. – Matt

+0

Cảm ơn bạn đã thông tin - Tôi sẽ xem liệu tôi có thể làm cho nó hoạt động với giải pháp của bạn hay không với giải pháp từ Không có bất ngờ (ở trên) - các ngón tay được vượt qua! – MelissaTA

9

Để có được accordion để tự động mở phần đúng dựa trên URL, bạn sẽ bắt đầu với cho phép tùy chọn navigation với một cái gì đó như:

$('#accordion').accordion('option', 'navigation', true); 

Theo mặc định, tùy chọn này sẽ tìm kiếm các liên kết tiêu đề accordion có một href phù hợp với fragme URL nt (nếu URL của bạn là http://somesite.com/about#contact, #contact là đoạn) và mở phần liên kết của tiêu đề đó. Vì bạn đang sử dụng accordion để điều hướng đến các trang khác nhau, bạn có thể sẽ không có mảnh vỡ URL để phù hợp chống lại, vì vậy bạn sẽ phải viết một tùy chỉnh navigationFilter:

$('#accordion').accordion('option', 'navigationFilter', function(){ ... }); 

Bạn có thể sử dụng tùy chọn navigationFilter để ghi đè cách plugin accordion khớp với các liên kết tiêu đề đến URL của trang hiện tại.

Cho đến nay, chúng tôi đã có phần phù hợp của accordion để mở dựa trên trang hiện tại. Tiếp theo, chúng ta cần đánh dấu liên kết trong phần đó tương ứng với trang. Bạn sẽ làm điều đó với một cái gì đó như:

<script type="text/javascript"> 
    $(document).ready(function() { 
    $('#accordion li').each(function() { 
     var li = $(this); 
     var a = $('a', li); 
     if(/* compare the href of the 'a' element to the current URL */) { 
     li.addClass('active'); 
     } 
    }); 
    }); 
</script> 

<div id="accordion"> 
    <h3><a href="#">Section 1</a></h3> 
    <div> 
    <ul> 
     <li><a href="/about">About</a></li> 
     <li><a href="/contact">Contact</a></li> 
    </ul> 
    </div> 
    <h3><a href="#">Section 2</a></h3> 
    <div> 
    <ul> 
     <li><a href="/help">Help</a></li> 
     <li><a href="/faq">FAQ</a></li> 
    </ul> 
    </div> 
</div> 

Ở đây chúng ta đang trải qua tất cả các liên kết trang trong accordion menu, chọn một trong đó phù hợp với URL hiện tại, và áp dụng một lớp .active với nó, mà bạn sau đó có thể tạo kiểu khác với CSS.


Một sang một bên: khác, có lẽ tốt hơn, cách để thực hiện phần thứ hai là xây dựng trang web với các lớp .active đã áp dụng cho các liên kết thích hợp, nhưng điều đó giả sử bạn có quyền kiểm soát trên phụ trợ và rằng Bạn biết làm thế nào để làm điều đó. Trong thực tế, nếu đúng như vậy, bạn có thể bỏ qua toàn bộ điều navigationFilter và tạo khối <script> để đặt tùy chọn active trên accordion để mở phần bên phải.

+0

Cảm ơn, tôi sẽ thử các giải pháp này. Thư sau vui vẻ! – MelissaTA

0

Không có điều nào ở trên phù hợp với tôi. Các tài liệu cho jquery ui là phụ tùng, và mã nguồn đã không để lại nhiều manh mối cho ai đó không thạo trong jquery.

Tôi đã sử dụng accordion trong thanh bên và liên kết trong mỗi phần nội dung nằm bên trong bảng, vì vậy tôi phải theo dõi cấu trúc HTML của mình (một thứ dễ vỡ) và thực hiện việc này ngay sau khi tạo ra accordion:

 $("#sidebar td").each(function() { 
      var td = $(this); 
      var a = td[0].firstChild; 
      if (a.href == location.href) { 
       $("#sidebar").accordion("activate", 
         td.parent().parent().parent().parent().prev()); 
      } 
     }); 

Có, khủng khiếp, sao lưu tr, tbody, bảng và div, nhưng nó hoạt động và trong trường hợp của chúng tôi, chúng tôi đã không thay đổi cấu trúc HTML trong tháng.

2

OK vấn đề này đã được bugging tôi trong một thời gian và nghĩ rằng tôi sẽ gửi giải pháp của tôi cho vấn đề này. (Tôi là một chút của một newbie với JQuery như vậy ....)

Trong trường hợp của tôi, tôi có một trang chủ chứa tập lệnh JQuery để xử lý tự động hóa menu và tôi có một số trang nội dung có các menu khác nhau (Tôi có một menu ngang trên tiêu đề trang và sau đó accordion JQuery xử lý menu phụ để nói).

Tôi đã thêm thẻ id vào div tiêu đề trình đơn và sau đó được đặt sau vào phần giữ chỗ nội dung của trang nội dung.

$(document).ready(function() { 
     $('.active').next().hide().removeClass('active'); 
     $('#yourMenuHeaderIdTag).addClass('active').next().show(); 
    }; 

Điều này hoạt động hoàn hảo và điều này khiến tôi tự hỏi tại sao tôi phải vật lộn với điều này trong tuần qua hoặc khi giải pháp đơn giản như vậy!

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