JQuery аккордеонное меню - держать аккордеонное меню открытым для страницы, на которой я нахожусь - PullRequest
10 голосов
/ 21 октября 2009

Я надеюсь, вы можете помочь. Я очень новичок в jQuery и работаю над пяти- или шестиуровневым аккордеонным меню для боковой навигации. Я получил большую часть кода, который у меня есть, от Dane Peterson @ daneomatic.com (спасибо, Dane!). Но я застрял на одном:

Я бы хотел, чтобы мой аккордеон или дерево работали так:

Когда я спускаюсь, скажем, на третий уровень и нажимаю на ссылку, чтобы открыть страницу, связанную с этим уровнем, как мне указать, когда страница третьего уровня загружается, что я на этой странице? Кроме того, как сохранить дерево открытым до этого уровня при загрузке страницы?

Наверное, я спрашиваю: есть ли способ, чтобы аккордеон / дерево автоматически обновлялось, чтобы показать, на какой странице вы находитесь, и открыть ли дерево до этого уровня?

Заранее спасибо!

Ответы [ 6 ]

9 голосов
/ 21 октября 2009

Чтобы аккордеон автоматически открывал правильный раздел на основе URL, вы начнете с включения опции navigation с чем-то вроде:

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

По умолчанию эта опция ищет ссылку заголовка аккордеона, которая имеет href, который соответствует фрагменту URL (если ваш URL равен http://somesite.com/about#contact, #contact - это фрагмент), и открывает раздел ссылки этого заголовка. Поскольку вы используете аккордеон для перехода на разные страницы, у вас, вероятно, не будет фрагментов URL для сравнения, поэтому вам придется написать пользовательский navigationFilter:

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

Вы можете использовать опцию navigationFilter, чтобы переопределить, как плагин accordion сопоставляет ссылки заголовка с URL текущей страницы.

Пока у нас есть правильный раздел аккордеона, который можно открыть на основе текущей страницы. Далее нам нужно выделить ссылку в этом разделе, которая соответствует странице. Вы сделаете это с чем-то вроде:

<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>

Здесь мы просматриваем все ссылки на страницы в навигационном аккордеоне, выбираем ту, которая соответствует текущему URL, и применяем к ней класс .active, который затем можно стилизовать по-разному с помощью CSS.


Кроме того: другой, возможно, лучший способ выполнить вторую часть - это создать страницу с классом .active, уже примененным к соответствующей ссылке, но это предполагает, что у вас есть контроль над бэкэндом и что ты знаешь как это сделать. Фактически, если это так, вы можете пропустить целую вещь navigationFilter и сгенерировать блок <script>, чтобы установить опцию active на аккордеоне, чтобы открыть правую часть.

2 голосов
/ 30 декабря 2011

ОК, эта проблема меня давно беспокоила, и я подумал, что опубликую свое решение этой проблемы. (Я новичок в JQuery, так что ...)

В моих обстоятельствах у меня есть главная страница, которая содержит скрипт JQuery для управления автоматизацией меню, и у меня есть несколько страниц контента с разными меню (у меня есть горизонтальное меню поперек заголовка страницы, а затем аккордеон JQuery обрабатывает подменю так сказать).

Я добавил теги id в div заголовка меню, а затем поместил следующее в заполнитель содержимого страницы содержимого.

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

Это работает отлично, и это заставило меня задуматься, почему я боролся с этим на прошлой неделе или около того, когда решение настолько простое!

0 голосов
/ 24 апреля 2010

Вот пример, который работал для меня:

Нужна помощь с опцией JQuery UI Accordion navigationFilter

0 голосов
/ 23 марта 2010

Ничто из вышеперечисленного не сработало для меня. Документация для jquery ui является запасной, и исходный код не оставил много подсказок для кого-то, кто не очень хорошо разбирается в jquery.

Я использовал аккордеон на боковой панели, а ссылки в каждом разделе контента были внутри таблиц, поэтому мне пришлось следить за своей HTML-структурой (хрупкая вещь) и делать это сразу после создания аккордеона:

        $("#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());
            }
        });

Да, это ужасно, резервное копирование tr, tbody, table и div, но это сработало, и в нашем случае мы не меняли HTML-структуру месяцами.

0 голосов
/ 06 февраля 2010
0 голосов
/ 21 октября 2009

Это одна из ловушек веб-сайтов с навигацией по JavaScript - ваш URL фактически не указывает на вашу страницу, как на обычную страницу. Это затрудняет использование обычных функций браузера, таких как закладки и кнопка возврата.

Одним из решений, которое некоторые люди, похоже, используют в наши дни, является сохранение этой информации после хеш-части URL.

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

Сохраняя информацию вместо "jsPageIndicator" выше, вы можете затем проанализировать ее с помощью JavaScript после $ (document) .ready () и попросить указать, какую страницу следует загрузить. В вашем случае это может быть что-то простое, например, индекс аккордеона, который имеет фокус (должен быть открытым).

Возможно, вы захотите взглянуть на плагин jQuery history.

Или, как указывает Алекс ниже, benalman.com / projects / jquery-bbq-plugin

...