Начальная загрузка, навигационные вкладки, выпадающие меню; как установить активную вкладку на основе URI


Я использую компонент загрузочных навигационных вкладок/выпадающих меню в качестве основной панели навигации, но я не могу понять, как настроить активное меню на основе входящего URI.

В сети есть много разных примеров/сообщений, которые используют навигационные вкладки для скрытия и отображения определенного содержимого div или работы с символом #, но я просто хочу прочитать входящий URI с помощью PHP, переменной _SERVER["REQUEST_URI"] и установить активную вкладку. Будь то вложенное местоположение в навигации или нет тоже проблема.

Вот что я пытался сделать:

<ul class="nav nav-tabs" id="supernav">
    <li class="active"><a href="/page1.html" data-toggle="tab"><i class="icon-home" style="margin-top:4px;"></i> Page 1</a></li>
    <li class="dropdown">
        <a href="#" class="dropdown-toggle" data-toggle="dropdown">Page 2 <b class="caret"></b></a>
        <ul class="dropdown-menu">
            <li><a href="/page2.html" data-toggle="tab">Home</a></li>
            <li class="divider"></li>
            <li><a href="/page2.2.html" data-toggle="tab">Page 2.2</a></li>
            <li><a href="/page2.3.html" data-toggle="tab">Page 2.3</a></li>
        </ul>
    </li>
    <li class="dropdown">
        <a href="#" class="dropdown-toggle" data-toggle="dropdown">Page 3 <b class="caret"></b></a>
        <ul class="dropdown-menu">
            <li><a href="/page3.html" data-toggle="tab">Home</a></li>
            <li class="divider"></li>
            <li class="dropdown-submenu">
                <a href="/page3.2.html" data-toggle="tab">Page 3.2</a>
                <ul class="dropdown-menu">
                    <li><a href="/page3.2.1.html" data-toggle="tab">Page 3.2.1</a></li>
                    <li><a href="/page3.2.2.html" data-toggle="tab">Page 3.2.2</a></li>
                </ul>
            </li>
        </ul>
    </li>
    <li><a href="/page4.html" data-toggle="tab">Page 4</a></li>
</ul>

<script>
window.onload=function (e) {
    e.preventDefault();
    $('#supernav a[href="<?=$_SERVER["REQUEST_URI"];?>"]').tab('show');
};
</script>

Вот несколько примеров URI:

http://abc.com/page1.html
http://abc.com/page2.3.html
http://abc.com/page3.2.2.html

Может ли кто-нибудь указать мне на хороший пример того, как этого добиться, или я просто прошу слишком многого от этого компонента?

ПРИМЕЧАНИЕ: Я предварительно загрузил все ресурсы начальной загрузки и jquery в свой заголовок.

Author: Pigueiras, 2013-06-19

6 answers

Я немного опоздал на вечеринку, но только что наткнулся на этот пост и решил добавить свои дополнительные 2 цента...

В принципе, лучший метод, который я нашел для установки вкладки/таблетки активной начальной загрузки, - это использование Javascript/jQuery для сопоставления текущего URL-адреса с href активной ссылки.

Поэтому, если ваше меню настроено следующим образом:

<ul class="nav nav-tabs">
    <li><a href="/page1.html" data-toggle="tab">Page 1</a></li>
    <li><a href="/page2.html" data-toggle="tab">Page 2</a></li>
</ul>

Ваш jQuery будет:

$(document).ready(function() {

    $('.nav-tabs a[href="'+location.href+'"]').parents('li').addClass('active');

});

Это предполагает отсутствие пути для ссылки href, но это может быть легко переопределено чем-то например:

$(document).ready(function() {

    var url_parts = location.href.split('/');

    var last_segment = url_parts[url_parts.length-1];

    $('.nav-tabs a[href="' + last_segment + '"]').parents('li').addClass('active');

  });

Надеюсь, это поможет кому-нибудь во Вселенной!:)

Ура!

 6
Author: Yani, 2014-03-29 01:54:06

Я решил свою собственную проблему, вот краткое изложение цели и того, что потребовалось для ее достижения.

Цели:

  1. Я хотел использовать компонент начальной загрузки nav-вкладки для моей панели навигации, потому что мне больше понравился ее внешний вид.
  2. Я хотел иметь возможность установить "активный" класс , проанализировав входящий URI.
  3. Я хотел, чтобы поднавигация также работала.

Новый код, основанный на первом сообщении:

<ul class="nav nav-tabs" id="supernav">
    <li id="page1"><a href="/page1.html"><i class="icon-home" style="margin-top:4px;"></i> Page 1</a></li>
    <li class="dropdown" id="page2">
        <a href="#" class="dropdown-toggle" data-toggle="dropdown">Page 2 <b class="caret"></b></a>
        <ul class="dropdown-menu">
            <li id="page2_home"><a href="/page2.html">Home</a></li>
            <li class="divider"></li>
            <li id="page2_2"><a href="/page2.2.html">Page 2.2</a></li>
            <li id="page2_3"><a href="/page2.3.html">Page 2.3</a></li>
        </ul>
    </li>
    <li class="dropdown" id="page3">
        <a href="#" class="dropdown-toggle" data-toggle="dropdown">Page 3 <b class="caret"></b></a>
        <ul class="dropdown-menu">
            <li id="page3_home"><a href="/page3.html">Home</a></li>
            <li class="divider"></li>
            <li class="dropdown-submenu" id="page3_2">
                <a href="/page3.2.html">Page 3.2</a>
                <ul class="dropdown-menu">
                    <li id="page3_2_1"><a href="/page3.2.1.html">Page 3.2.1</a></li>
                    <li id="page3_2_2"><a href="/page3.2.2.html">Page 3.2.2</a></li>
                </ul>
            </li>
        </ul>
    </li>
    <li id="page4"><a href="/page4.html">Page 4</a></li>
</ul>

Обратите внимание в приведенном выше коде, что нет

Класс= "активный"

Или

Переключение данных="вкладка"

Установить в любом месте.

Поскольку я хотел создать навигацию на статическом шаблоне, который используется в качестве заголовка для всех шаблонов, я не мог добавить динамически сгенерированный код на основе входящих URI, но оказалось, что в этом нет необходимости.

Я добавил следующий код Javascript в нижней части каждого шаблона, который вызывает посетитель, чтобы помочь указать навигационному списку, какие элементы должны быть помечен как "активный".

Я использовал этот скрипт в нижней части моего/page1.html

<script type="text/javascript">
window.onload=function () {
    $('#page1').addClass('active');
};
</script>

Для установки /page3.2.2.html в качестве активной страницы и всех навигационных уровней над ней я сделал это

<script type="text/javascript">
window.onload=function () {
    $('#page3').addClass('active');
    $('#page3_2').addClass('active');
    $('#page3_2_2').addClass('active');
};
</script>

Теперь, когда пользователь заходит на мой сайт, навигация загружается из статического файла, а остальная часть страницы содержит динамический JavaScript, который задает, какие компоненты я хочу активировать.

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

.nav-tabs > li { margin-bottom: -3px; }

Я бы опубликовал несколько SS, но моя "репутация" еще не превышает 10, ха-ха-ха. Надеюсь, это поможет кому-то еще, боже, помоги нам всем, когда выйдет версия 3 bootstrap, и нам придется разобраться во всем этом снова. 8^)Р

 5
Author: Vince, 2013-06-20 09:09:02

Я столкнулся с аналогичной проблемой, когда у меня было несколько URL-адресов страниц, таких как: www.somedomain.com/pages/xyz/abc/samplepage.html

Этот код сработал в моем случае как по волшебству.

    $(document).ready(function() {
        var permalink_nodomain = window.location.pathname;
        $('.nav-tabs a[href="' + permalink_nodomain + '"]').parents('li').addClass('active');
    });

Может быть, кто-то все еще ищет это решение, как и я:)

 1
Author: Gouranga Tarafder, 2015-10-11 07:28:43

Использование PHP для установки активного не является идеальным способом, так как PHP - это код на стороне сервера, а начальная загрузка - это пользовательский интерфейс на стороне клиента. Недавно у меня был проект с использованием начальной загрузки, и я обнаружил, что та же проблема довольно раздражает, учитывая, насколько мощна начальная загрузка, и искренне надеюсь, что они исправят это в предстоящем выпуске 3.0.

Способ, которым я это исправил, состоял в том, чтобы использовать jquery для ссылки на уникальный идентификатор в теге ссылки и обновлять значение активной вкладки на основе этого.

Так что на самом деле все, что сделал jquery, это удалил активный класс и назначьте его текущей нажатой ссылке.

Если вы все еще хотите использовать URL-адрес, я бы посоветовал вам использовать javascript/jquery вместо PHP. Ознакомьтесь с этой статьей о том, как это сделать. http://css-tricks.com/snippets/javascript/get-url-and-url-parts-in-javascript/

Надеюсь, это поможет.

 0
Author: devfunkd, 2013-06-19 20:16:22

Вкладка активна на стороне клиента, а не на сервере. Это связано с тем, что обычно все содержимое каждой вкладки на самом деле уже есть в документе при загрузке страницы. Нажатие на вкладку просто скрывает одну вкладку, а затем показывает вкладку с идентификатором, на который ссылается элемент привязки.

Вот как выглядит простейшая реализация вкладки начальной загрузки:

<!-- tab navigation -->
<ul class="nav nav-tabs">
    <li class="active">
        <a href="#tab1">Home</a>
    </li>
    <li><a href="#tab2">...</a></li>
    <li><a href="#tab3">...</a></li>
</ul>

<!-- tab contents are inside -->
<div class="tab-content">
    <!-- content of each tab is put inside a tab-pane or tab-pill -->
    <div class="tab-pane active" id="tab1">
        <p>content of tab 1</p>
    </div>
    <div class="tab-pane" id="tab2">
        <p>content of tab 2</p>
    </div>
    <div class="tab-pane" id="tab2">
        <p>content of tab 3</p>
    </div>
</div>

Это еще не все, вам все равно нужно активировать вкладку с помощью JS, например это:

$('ul.nav.nav-tabs > li > a').click(function(e) {
    e.preventDefault();
    $(this).tab('show');
});

Исходя из того, как построен ваш вопрос, я думаю, вам следует лучше рассмотреть, что означает каждый компонент начальной загрузки, и попытаться понять, каков их подходящий вариант использования.

Если вашей целью было показать определенную вкладку в ответ на запрос. Просто добавьте класс "активный" в элемент div, который обертывает его содержимое.

А затем сделайте так, чтобы это было видно:

$('tab-pane active').tab('show');

Примечание: все, что вам нужно сделать, это добавить активный в каждый раз в нужном месте.

Конкретно для вас проблема заключается в вашем jQuery. Вот правильный способ написать это:

$('#supernav active').tab('show');
 0
Author: Igwe Kalu, 2013-06-19 22:37:50

Использование начальной загрузки 4

Дано (HAML)

%nav.nav.nav-pills.flex-column
  %a.nav-link.active{href: '#users', 'data-toggle'=>'pill', role: 'tab'} Users
  %a.nav-link{href: '#deals', 'data-toggle'=>'pill', role: 'tab'} Deals
  %a.nav-link{href: '#facilitators', 'data-toggle'=>'pill', role: 'tab'} Facilitators

Это сведено к (Coffeescript)

if location.hash
  $('nav.nav-pills a[href="'+location.hash+'"]').tab('show')

Документ: http://v4-alpha.getbootstrap.com/components/navs/#via-javascript

 0
Author: Chloe, 2017-08-13 08:09:05