Мобильные навигационные вкладки jQuery - PullRequest
15 голосов
/ 27 июля 2011

Я хочу иметь навигацию по вкладкам в моем проекте jQuery Mobile. Я знаю, что могу использовать роль данных «navbar», но я хочу изменить только содержимое под этой панелью навигации, не переходя на новую страницу. До сих пор у меня могло быть только несколько разных страниц с одной и той же панелью навигации, ссылающейся друг на друга, но это не то, что я хочу.

Кто-нибудь может мне помочь?

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

Ответы [ 6 ]

32 голосов
/ 27 июля 2011

Вы можете использовать стиль панели навигации jQuery Mobile, но использовать свой собственный обработчик кликов, поэтому вместо смены страниц щелчок будет просто скрывать / показывать соответствующий контент на той же странице.

HTML

<div data-role="navbar">
    <ul>
        <li><a href="#" data-href="a">One</a></li>
        <li><a href="#" data-href="b">Two</a></li>
    </ul>
</div><!-- /navbar -->
<div class="content_div">onLoad Content</div>
<div id="a" class="content_div">Some 'A' Content</div>
<div id="b" class="content_div">Some 'B' Content</div>

JAVASCRIPT

$(document).delegate('[data-role="navbar"] a', 'click', function () {
    $(this).addClass('ui-btn-active');
    $('.content_div').hide();
    $('#' + $(this).attr('data-href')).show();
    return false;//stop default behavior of link
});

CSS

.content_div {
    display: none;
}
.content_div:first-child {
    display: block;
}

Вот jsfiddle кода выше: http://jsfiddle.net/3RJuX/

Примечание:

  • Каждая из ссылок в панели навигации имеет атрибут «data-href», установленный на идентификатор div (или любого контейнера, который вы хотите использовать), который будет отображаться.

Обновление

Через 1 год я вернулся к этому ответу и заметил, что делегированный селектор обработчика событий может быть немного оптимизирован для использования класса, а не атрибута (который намного быстрее поиска):

$(document).delegate('.ui-navbar a', 'click', function () {
    $(this).addClass('ui-btn-active');
    $('.content_div').hide();
    $('#' + $(this).attr('data-href')).show();
});

Обновление

Этот код можно сделать более модульным, используя относительные селекторы, а не абсолютные (например, $('.content_div'), поскольку при этом будут выбраны все совпадающие элементы в DOM, а не только те, которые относятся к нажатой кнопке).

//same selector here
$(document).delegate('.ui-navbar ul li > a', 'click', function () {

    //un-highlight and highlight only the buttons in the same navbar widget
    $(this).closest('.ui-navbar').find('a').removeClass('ui-navbar-btn-active');

    //this bit is the same, you could chain it off of the last call by using two `.end()`s
    $(this).addClass('ui-navbar-btn-active');

    //this starts the same but then only selects the sibling `.content_div` elements to hide rather than all in the DOM
    $('#' + $(this).attr('data-href')).show().siblings('.content_div').hide();
});​

Это позволяет вкладывать вкладки и / или иметь несколько наборов вкладок на страницах или псевдостраницах.

Некоторая документация для используемых "относительных селекторов":

Вот пример: http://jsfiddle.net/Cfbjv/25/ (сейчас не в сети)

4 голосов
/ 17 февраля 2012

ОБНОВЛЕНИЕ: Проверьте мой jsfiddle на http://jsfiddle.net/ryanhaney/eLENj/

Я просто потратил некоторое время на выяснение этого, поэтому подумал, что отвечу на это Примечание. Я использую многостраничный файл, YMMV.

<div data-role="footer" data-position="fixed">
    <div data-role="navbar">
        <ul>
            <li><a href="#page-1" data-role="tab" data-icon="grid">Page 1</a></li>
            <li><a href="#page-2" data-role="tab" data-icon="grid">Page 2</a></li>
            <li><a href="#page-3" data-role="tab" data-icon="grid">Page 3</a></li>
        </ul>
    </div>
</div>

$("div[data-role=page]").bind("pagebeforeshow", function () {
    // prevents a jumping "fixed" navbar
    $.mobile.silentScroll(0);
});

$("a[data-role=tab]").each(function () {
        // bind to click of each anchor
        var anchor = $(this);
        anchor.bind("click", function () {
            // change the page, optionally with transitions
            // but DON'T navigate...
            $.mobile.changePage(anchor.attr("href"), {
                transition: "none",
                changeHash: false
        });

        // cancel the click event
        return false;
    });
});
2 голосов
/ 27 июня 2012

@ Майк Бартлетт

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

Где он разместил

$(document).delegate('[data-role="navbar"] a', 'click', function () {
$(this).addClass('ui-btn-active');
$('.content_div').hide();
$('#' + $(this).attr('data-href')).show(); });

Мне показалось полезным изменить последнюю строку, чтобы просто вызывать любой контент, для которого вы установили значение "data-href", на вашей панели навигации.

$('div[data-role="navbar"] a').live('click', function () {
    $(this).addClass('ui-btn-active');
    $('div.content_div').hide();
    $($(this).attr('data-href')).show();
  });

мой navbar html затем читает

<div data-role="navbar">
<ul>
    <li><a href="#" data-href="#a">One</a></li>
    <li><a href="#" data-href="#b">Two</a></li>
</ul>

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

1 голос
/ 27 июля 2015

Я заметил, что вопрос был задан четыре года назад, поэтому я не уверен, что виджет Tab был доступен в JQ Mobile в то время. В любом случае, я парень с 2015 года

потрясающее решение, которое я использую, как показано ниже, с Jquery Mobile 1.4.5

<div data-role="tabs" id="tabs">
  <div data-role="navbar">
    <ul>
      <li><a href="#one" data-ajax="false">one</a></li>
      <li><a href="#two" data-ajax="false">two</a></li>
      <li><a href="ajax-content-ignore.html" data-ajax="false">three</a></li>
    </ul>
  </div>
  <div id="one" class="ui-body-d ui-content">
    <h1>First tab contents</h1>
  </div>
  <div id="two">
    <ul data-role="listview" data-inset="true">
        <li><a href="#">Acura</a></li>
        <li><a href="#">Audi</a></li>
        <li><a href="#">BMW</a></li>
        <li><a href="#">Cadillac</a></li>
        <li><a href="#">Ferrari</a></li>
    </ul>
  </div>
</div>
1 голос
/ 02 июля 2013

Пожалуйста, используйте эту ссылку ниже для всех видов навигационной панели в jquery

http://jquerymobile.com/demos/1.0rc2/docs/toolbars/docs-navbar.html

<div data-role="navbar">
   <ul>
    <li><a href="a.html" class="ui-btn-active">One</a></li>
    <li><a href="b.html">Two</a></li>
   </ul>
</div>

спасибо

0 голосов
/ 14 октября 2014

Мне понравился ответ @ Ryan-Haney, но я решил добавить свой черновик, если кто-нибудь сможет найти более эффективный способ сделать это, тогда, пожалуйста, добавьте комментарий .. спасибо

Я сделал это таким образом, потому что у меня есть куча «включаемых» файлов, которые загружаются в DOM во время выполнения, поэтому я не мог жестко кодировать, что n-я вкладка подсвечивается / активна для каждой страницы, такой как Райан мог. У меня также есть роскошь иметь только одну вкладку в моем приложении.

$(document).delegate('.ui-navbar a', 'tap', function ()
{
  $('.ui-navbar').find('li').find('a').removeClass('ui-btn-active');
  $('.ui-navbar').find('li:nth-child(' + ($(this).parent().index() + 1) + ')').find('a').addClass('ui-btn-active');
});
...