Активное состояние вкладки в JQuery Mobile
Скажем, у нас есть 2 вкладки, используя data-role="navbar"
, и мы переключаемся на вторую вкладку, а затем переходим на другую новую страницу. Когда мы возвращаемся с предыдущей страницы, почему вкладка, которую мы выбрали для второй вкладки, не является активной. Первая вкладка отображается как активная. Является ли JQuery Mobile не справиться с этим.
3 ответа
Описание:
к несчастью jQuery Mobile
не обрабатывать это правильно, поэтому мы должны сделать это. В основном вам нужно удалить href
от Навбара li
элемент. Смена страницы будет обработана вручную. Что мы делаем здесь, так это привязываем событие click к navbar li
элемент. Когда пользователь нажимает на панель навигации, он удаляет классы ui-btn-activ и ui-state- persist из выбранного в данный момент элемента. Он добавит его к выбранному в данный момент элементу и инициализирует pageChange
после небольшого перерыва. Время ожидания необходимо, потому что мы должны быть уверены, что класс добавлен до того, как произойдет изменение страницы.
Решение:
Вот рабочий пример, который я сделал некоторое время назад: http://jsfiddle.net/Gajotres/6h7gn/
Код:
Этот код создан для моего текущего примера и его панели навигации, поэтому слегка измените его для работы с панелью навигации.
$(document).on('pagebeforeshow', '#index', function(){
$(document).on('click', '#kml li', function(){
var selectedLi = $(this);
$('#kml li').each(function( index ) {
var loopLi = $(this);
if(loopLi.find('a').hasClass('ui-btn-active')) {
$(this).find('a').removeClass('ui-btn-activ').removeClass('ui-state-persist');
}
});
selectedLi.find('a').addClass('ui-state-persist');
setTimeout(function(){
$.mobile.changePage( "#second", { transition: "slide"});
},100);
});
});
Редактировать:
Следующий пример версии: http://jsfiddle.net/Gajotres/6h7gn/
Этот работает на каждой странице.
$(document).on('pagebeforeshow', '#index', function(){
$(document).off('click', '#custom-navbar li').on('click', '#custom-navbar li', function(e){
var selectedLi = $(this);
$('#custom-navbar li').each(function( index ) {
var loopLi = $(this);
if(loopLi.find('a').hasClass('ui-btn-active') || loopLi.find('a').hasClass('ui-state-persist')) {
loopLi.find('a').removeClass('ui-btn-activ').removeClass('ui-state-persist');
}
if(loopLi.attr('id') == selectedLi.attr('id')) {
loopLi.find('a').addClass('ui-state-persist');
}
});
setTimeout(function(){
$.mobile.changePage( selectedLi.find('a').attr('data-href'), { transition: "slide"});
},100);
});
});
Вот мое краткое решение. Это прекрасно работает для меня
Пример структуры HTML
<div id="profile-screen" data-role="page" class="page">
<div data-role="content" class="content inner-page group">
<div data-role="tabs">
<div data-role="navbar">
<ul>
<li><a href="#tab-profile" class="ui-btn-active">Profile</a></li>
<li><a href="#tab-addresses">Addresses</a></li>
</ul>
</div>
<!-- Profile tab -->
<div id="tab-profile" class="main-content"> Sample Content for the first tab</div>
<!-- Addresses tab -->
<div id="tab-addresses" class="main-content"> Sample Content for the second tab</div>
</div>
</div>
</div>
И это решение
$( "#profile-screen" ).on( "pagebeforeshow", function() {
var active_content = $('#profile-screen .ui-tabs-panel[style*="block"]').attr('id');
$('#profile-screen a[href^="#'+ active_content +'"]').addClass('ui-btn-active');
});
Сначала вы должны найти активный контент. Типичным для активного контента является то, что он имеет style="display:block"
, Когда вы найдете его, вы должны получить идентификатор (это var active_content
в моем коде). Когда вы знаете, какой контент активен, все, что вам нужно сделать, это найти правильный тег привязки и установить класс ui-btn-active
, И все эти вещи, которые вы должны ввести pagebeforeshow
событие.
Я знаю, что это старо, но нет необходимости во всем этом.
У меня тоже была эта проблема, и все, что вам нужно, это несколько строк, чтобы исправить ее. В моем случае это были вкладки, поэтому не нужно было менять страницу.
$(document).on( "pageinit", "#yourpageID", function() {
$('div[data-role="tabs"] [data-role="navbar"] a').click( function(e) {
e.preventDefault();
$('div[data-role="tabs"] [data-role="navbar"] .ui-btn-active').removeClass('ui-btn-active ui-state-persist');
$(this).addClass('ui-btn-active ui-state-persist');
});
});
Также будьте осторожны, используя события страницы, такие как pagebeforeshow, для привязки событий в JQM, предыдущая (или более) страница может находиться в кэше, и если вы будете перемещаться назад и вперед, событие click будет связано несколько раз. Вместо этого используйте Pageinit или.one, чтобы связать события