Начальной загрузки активной навигации государство не работает
у меня есть bootstrap v3.
Я использую class="active" наnavbar и он не переключается при нажатии пунктов меню. Я знаю, как это сделать с jQuery и построить функцию щелчка, но я думаю, что эта функция должна быть включена в bootstrap? Так, может быть, это проблема JavaScript?
вот мой заголовок с моими файлами js/css / bootstrap, которые я включил:
<!-- Bootstrap CSS -->
<link rel="stylesheet" href= "/bootstrap/css/bootstrap.css" />
<link rel="stylesheet" href="//ajax.googleapis.com/ajax/libs/jqueryui/1.10.4/themes/smoothness/jquery-ui.css" />
<link rel="stylesheet" href= "/stylesheets/styles.css" />
<!--jQuery -->
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js">
<script src="//ajax.googleapis.com/ajax/libs/jqueryui/1.10.4/jquery-ui.min.js"></script>
<!-- Bootstrap JS -->
<script src="/bootstrap/js/bootstrap.min.js"></script>
<script src="/bootstrap/js/bootstrap-collapse.js"></script>
<script src="/bootstrap/js/bootstrap-transition.js"></script>
вот мой navbar код:
<nav class="navbar navbar-default navbar-fixed-top" role="navigation">
<div class="container-fluid">
<div class="navbar-header">
<button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbarCollapse">
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a class="navbar-brand" href="/index.php">MyBrand</a>
</div>
<div class="collapse navbar-collapse navbarCollapse">
<ul class="nav navbar-nav navbar-right">
<li class="active">
<a href="/index.php">Home</a>
</li>
<li>
<a href="/index2.php"> Links</a>
</li>
<li>
<a href="/history.php">About</a>
</li>
<li>
<a href="/contact.php">Contact</a>
</li>
<li>
<a href="/login.php">Login</a>
</li>
</ul>
</div>
</div>
</nav>
я настраиваю это верно?
(на несвязанной ноте, но это возможно связано? Когда меню становится мобильным, я нажимаю кнопку меню, и оно сворачивается. Нажатие на него снова не отменяет его, Хотя. Так что этот вопрос,. с другой стороны, оба означают неправильную настройку JavaScript, возможно?)
18 ответов:
вы включили минифицированный файл JS Bootstrap и свернуть / переход плагины в то время как документы утверждают, что:
оба bootstrap.js и bootstrap.минута.Яш содержат все плагины в одном файле.
Включите только один.и
для простых эффектов перехода включите переход.js один раз рядом другие файлы JS. Если вы используете скомпилированный (или уменьшенный) загрузчик.js, нет необходимости включать это-это уже быть.
Так что вполне может быть ваша проблема для минимизации проблемы.
для активного класса, вы должны управлять им самостоятельно, но это только одна или две строки.
Bootstrap 3:
$(".nav a").on("click", function(){ $(".nav").find(".active").removeClass("active"); $(this).parent().addClass("active"); });Bootply:http://www.bootply.com/IsRfOyf0f9
Bootstrap 4:
$(".nav .nav-link").on("click", function(){ $(".nav").find(".active").removeClass("active"); $(this).addClass("active"); });
вот мое решение для переключения активных страниц
$(document).ready(function() { $('li.active').removeClass('active'); $('a[href="' + location.pathname + '"]').closest('li').addClass('active'); });
с версией 3.3.4 bootstrap, на длинных html-страницах вы можете ссылаться на разделы страницы. по классу или идентификатору для управления активной ссылкой navbar с помощью spy-scroll с элементом body:
<body data-spy="scroll" data-target="spy-scroll-id">цель данных будет div с id= "spy-scroll-id"
<div id="spy-scroll-id" class="collapse navbar-collapse"> <ul class="nav navbar-nav"> <li class="active"><a href="#topContainer">Home</a></li> <li><a href="#details">About</a></li> <li><a href="#carousel-container">SlideShow</a></li> </ul> </div>это должно активировать ссылки, щелкнув без каких-либо функций javascript, а также автоматически активировать каждую ссылку при прокрутке соответствующих связанных разделов страницы, которые а JS onclick () не будет.
это работает perfekt для меня, причина " окно.местоположение.pathname " также содержит данные перед реальным именем страницы, например каталог / страница.РНР. Таким образом, фактическая ссылка navbar будет активна только в том случае, если url-адрес содержит эту ссылку.
$(document).ready(function() { // ----------------------------------------------------------------------- $.each($('#navbar').find('li'), function() { $(this).toggleClass('active', window.location.pathname.indexOf($(this).find('a').attr('href')) > -1); }); // ----------------------------------------------------------------------- });
Если вы не используете анкор ссылки, вы можете использовать что-то вроде этого:
$(document).ready(function () { $.each($('#navbar').find('li'), function() { $(this).toggleClass('active', '/' + $(this).find('a').attr('href') == window.location.pathname); }); });
все, что вам нужно сделать, это просто добавить data-toggle= "tab" к вашей ссылке внутри bootstrap navbar, как это:
<ul class="nav navbar-nav"> <li class="active"><a data-toggle="tab" href="#">Home</a></li> <li><a data-toggle="tab" href="#">Test</a></li> <li><a data-toggle="tab" href="#">Test2</a></li> </ul>
это элегантное решение сделал трюк для меня. Любые новые идеи/предложения приветствуются.
$( document ).on( 'click', '.nav-list li', function ( e ) { $( this ).addClass( 'active' ).siblings().removeClass( 'active' ); } );вы можете использовать метод jQuery "siblings ()", чтобы поддерживать только активный элемент доступа, а его братья и сестры неактивны.
С Bootstrap 4 Вы можете использовать это:
$(document).ready(function() { $(document).on('click', '.nav-item a', function (e) { $(this).parent().addClass('active').siblings().removeClass('active'); }); });
Я боролся с этим сегодня, data-togle работал только если я на одной странице приложения.
Я не использую ajax для загрузки контента, который я фактически делаю post-запрос для других страниц, поэтому первый сценарий js тоже был бесполезен. Я решаю это с помощью следующих строк:
var active = window.location.pathname; $(".nav a[href|='" + active + "']").parent().addClass("active");
Я надеюсь, что это поможет решить эту проблему.
var navlnks = document.querySelectorAll(".nav a"); Array.prototype.map.call(navlnks, function(item) { item.addEventListener("click", function(e) { var navlnks = document.querySelectorAll(".nav a"); Array.prototype.map.call(navlnks, function(item) { if (item.parentNode.className == "active" || item.parentNode.className == "active open" ) { item.parentNode.className = ""; } }); e.currentTarget.parentNode.className = "active"; }); });
У меня была некоторая боль с этим, используя динамически генерируемые элементы списка - стек WordPress.
добавил Это, и это сработало:
$(document).ready(function () { $(".current-menu-item").addClass("active"); });будет делать это на лету.
класс "active" не управляется из коробки с bootstrap. В вашем случае, так как вы используете PHP, вы можете увидеть:
как добавить class= 'active' в меню html с php
чтобы помочь вам с методом в основном автоматизации его.
для bootstrap mobile меню un-свернуть после нажатия на элемент вы можете использовать это
$("ul.nav.navbar-nav li a").click(function() { $(".navbar-collapse").removeClass("in"); });
Я м, используя тема ушко чуть-чуть, вот пример кода навигации. Обратите внимание на имя класса элемента -> .nav - как это указано в Java script.
/ Collect the nav links, forms, and other content for toggling #bs-example-navbar-collapse-1.collapse.navbar-collapse %ul.nav.navbar-nav %li %a{:href => "/demo/one"} Page One %li %a{:href => "/demo/two"} Page Two %li %a{:href => "/demo/three"} Page Threeна странице просмотра (или частично) добавьте это: javascript, это должно выполняться каждый раз при загрузке страницы.
haml посмотреть фрагмент ->
- content_for :javascript do :javascript $(function () { $.each($('.nav').find('li'), function() { $(this).toggleClass('active', $(this).find('a').attr('href') == window.location.pathname); }); });в отладчике javascript убедитесь, что значение атрибута' href ' совпадает с window.местоположение.имя пути. Это немного отличается от решения @Zitrax, который помог мне решить мою проблему.
на
AngularJS, вы можете использоватьng-classС такой функцией:HTML ->
<nav class="navbar navbar-default" ng-controller="NavCtrl as vm"> <div class="container"> <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1"> <ul class="nav navbar-nav" > <li ng-class="vm.Helper.UpdateTabActive('Home')"><a href="#" ng-click>Home</a></li> <li ng-class="vm.Helper.UpdateTabActive('About')"><a href="#about">About</a></li> <li ng-class="vm.Helper.UpdateTabActive('Contact')"><a href="#contact">Contact</a></li> </ul> </div> </nav>и контролером
app.controller('NavCtrl', ['$scope', function($scope) { var vm = this; vm.Helper = { UpdateTabActive: function(sTab){ return window.location.hash && window.location.hash.toLowerCase() == ("#/" + sTab).toLowerCase() ? 'active' : ''; } } }]);если вы используете $location, то хэша не будет. Таким образом, вы можете извлечь необходимую строку из URL с помощью $location
не будет работать во всех случаях -->
использование переменной области видимости, как показано ниже, будет работать только при нажатии, но если переход осуществляется с помощью
$state.transitionToили окно.расположение или вручную обновить URL, значение вкладки не будет обновляться<ul class="nav navbar-nav" ng-init="Tab='Home'"> <li ng-class="Tab == 'Home' ? 'active' : ''"><a href="#" ng-click="Tab = 'Home'">Home</a></li> <li ng-class="Tab == 'About' ? 'active' : ''"><a href="#" ng-click="Tab = 'About'">About</a></li> </ul>
добавьте этот JavaScript в ваш основной файл js.
$(".navbar a").on("click", function(){ $(".navbar").find(".active").removeClass("active"); $(this).parent().addClass("active"); });
мне пришлось сделать шаг вперед, потому что мои имена файлов не совпадали с названиями моих навигационных панелей. т. е. моя первая ссылка на панель навигации была дома, но имя файла-индекс..
поэтому просто возьмите путь и соответствовать ему.
очевидно, что это грубый пример и может быть более эффективным, но весьма пользовательские потребности.
var loc_path = location.pathname; $('li.active').removeClass('active'); if(loc_path.includes('index')){ $('li :eq(0)').addClass('active'); }else if(loc_path.includes('blog')){ $('li :eq(2)').addClass('active'); }else if(loc_path.includes('news')){ $('li :eq(3)').addClass('active'); }else if(loc_path.includes('house')){ $('li :eq(4)').addClass('active'); }
Bootstrap 4 решение, которое работало для меня:
$(document).ready(function() { //You can name this function anything you like function activePage(){ //When user lands on your website location.pathname is equal to "/" and in //that case it will add "active" class to all links //Therefore we are going to remove first character "/" from the pathname var currentPage = location.pathname; var slicedCurrentPage = currentPage.slice(1); //This will add active class to link for current page $('.nav-link').removeClass('active'); $('a[href*="' + location.pathname + '"]').closest('li').addClass('active'); //This will add active class to link for index page when user lands on your website if (location.pathname == "/") { $('a[href*="index"]').closest('li').addClass('active'); } } //Invoke function activePage(); });это будет работать только если href содержит расположение.путь!
Если вы тестируете свой сайт на своем собственном ПК (используя wamp, xampp, lamp и т. д...) и ваш сайт находится в какой-то подпапке, то ваш путь на самом деле "/somefolder/something.php", так что не путайтесь.
Я бы предложил, если вы не уверены, используйте следующий код, чтобы убедиться, что это правильно расположение.путь:
$(document).ready(function() { alert(location.pathname); });
Comments