Bootstrap navbar Active State无法正常工作

时间:2014-07-01 16:00:30

标签: javascript html twitter-bootstrap twitter-bootstrap-3

我有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设置?)

27 个答案:

答案 0 :(得分:131)

你已经包含了缩小的Bootstrap js文件和崩溃/转换插件,而文档声明:

  

bootstrap.js和bootstrap.min.js都包含单个文件中的所有插件    只包括一个。

  

对于简单的过渡效果,请将transition.js包括在内   其他JS文件。如果你正在使用编译(或缩小)   bootstrap.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");
});

答案 1 :(得分:62)

以下是我切换活动页面的解决方案

$(document).ready(function() {
  $('li.active').removeClass('active');
  $('a[href="' + location.pathname + '"]').closest('li').addClass('active'); 
});

答案 2 :(得分:13)

使用版本3.3.4的bootstrap,在长html页面上,您可以参考pg的各个部分。通过class或id来管理带有spy-scroll和body元素的活动导航栏链接:

  <body data-spy="scroll" data-target="spy-scroll-id">

数据目标将是一个div,其id =&#34; spy-scroll-id&#34;

    <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()则不会。

答案 3 :(得分:13)

这对我来说是完美的,因为“window.location.pathname”还包含真实页面名称之前的数据,例如:目录/ page.php文件。因此,如果网址包含此链接,则实际的导航栏链接将仅设置为有效。

$(document).ready(function() {
    // -----------------------------------------------------------------------
    $.each($('#navbar').find('li'), function() {
        $(this).toggleClass('active', 
            window.location.pathname.indexOf($(this).find('a').attr('href')) > -1);
    }); 
    // -----------------------------------------------------------------------
});

答案 4 :(得分:9)

如果您不使用锚链接,可以使用以下内容:

$(document).ready(function () {
    $.each($('#navbar').find('li'), function() {
        $(this).toggleClass('active',
            '/' + $(this).find('a').attr('href') == window.location.pathname);
    });
});

答案 5 :(得分:9)

您只需将 data-toggle =“tab”添加到bootstrap导航栏中的链接,如下所示:

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

答案 6 :(得分:5)

使用Bootstrap 4,您可以使用:

$(document).ready(function() {
    $(document).on('click', '.nav-item a', function (e) {
        $(this).parent().addClass('active').siblings().removeClass('active');
    });
});

答案 7 :(得分:4)

这个优雅的解决方案为我做了诀窍。欢迎任何新的想法/建议。

$( document ).on( 'click', '.nav-list li', function ( e ) {
    $( this ).addClass( 'active' ).siblings().removeClass( 'active' );
} );

您可以使用jQuery的“siblings()”方法来保持只有被访问的项目处于活动状态且其兄弟处于非活动状态。

答案 8 :(得分:2)

Bootstrap 4:navbar Active State 工作,只需使用 .navbar-nav .nav-link 类

 $(function () {
  // this will get the full URL at the address bar
  var url = window.location.href;
  // passes on every "a" tag
  $(".navbar-nav .nav-link").each(function () {
    // checks if its the same on the address bar
    if (url == (this.href)) {
      $(this).closest("li").addClass("active");
      //for making parent of submenu active
      $(this).closest("li").parent().parent().addClass("active");
    }
  });
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css" integrity="sha384-Gn5384xqQ1aoWXA+058RXPxPg6fy4IWvTNh0E263XmFcJlSAwiGgFAW/dAiS6JXm" crossorigin="anonymous">

<script src="https://code.jquery.com/jquery-3.2.1.slim.min.js" integrity="sha384-KJ3o2DKtIkvYIK3UENzmM7KCkRr/rE9/Qpg6aAZGJwFDMVNA/GpGFF93hXpG5KkN" crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.9/umd/popper.min.js" integrity="sha384-ApNbgh9B+Y1QKtv3Rn7W3mgPxhU9K/ScQsAP7hUibX39j7fakFPskvXusvfa0b4Q" crossorigin="anonymous"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js" integrity="sha384-JZR6Spejh4U02d8jOt6vLEHfe/JQGiRRSQQxSfFWpi1MquVdAyjUar5+76PVCmYl" crossorigin="anonymous"></script>

<nav class="navbar navbar-expand-lg navbar-light bg-light">
  <a class="navbar-brand" href="#">Navbar</a>
  <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
    <span class="navbar-toggler-icon"></span>
  </button>

  <div class="collapse navbar-collapse" id="navbarSupportedContent">
    <ul class="navbar-nav mr-auto">
      <li class="nav-item">
        <a class="nav-link" href="#">Home</a>
      </li>
      <li class="nav-item">
        <a class="nav-link" href="#">Link</a>
      </li>
      <li class="nav-item dropdown">
        <a class="nav-link dropdown-toggle" href="#" id="navbarDropdown" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
          Dropdown
        </a>
        <div class="dropdown-menu" aria-labelledby="navbarDropdown">
          <a class="dropdown-item" href="#">Action</a>
          <a class="dropdown-item" href="#">Another action</a>
          <div class="dropdown-divider"></div>
          <a class="dropdown-item" href="#">Something else here</a>
        </div>
      </li>
      <li class="nav-item">


        <a class="nav-link" href="#">Other</a>
      </li>
    </ul>
    <form class="form-inline my-2 my-lg-0">
      <input class="form-control mr-sm-2" type="search" placeholder="Search" aria-label="Search">
      <button class="btn btn-outline-success my-2 my-sm-0" type="submit">Search</button>
    </form>
  </div>
</nav>

答案 9 :(得分:2)

我今天一直在努力解决这个问题,数据转换只有在单页应用程序上才有效。

我没有使用ajax加载内容我实际上正在为其他页面发帖请求,所以第一个js脚本也没用。我用这句话解决了这个问题:

var active = window.location.pathname;
$(".nav a[href|='" + active + "']").parent().addClass("active");

答案 10 :(得分:1)

我对此有些痛苦,使用动态生成的列表项 - WordPress Stack。

添加了这个并且有效:

$(document).ready(function () {
    $(".current-menu-item").addClass("active");
});

将动态做到。

答案 11 :(得分:1)

我希望这有助于解决这个问题。

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

答案 12 :(得分:1)

我用这个。它简短,易懂且易于理解。

$(document).ready(function() {
    $('a[href$="' + location.pathname + '"]').addClass('active');
});

答案 13 :(得分:0)

在导航页代码的每个页面上使用header.php时,jquery无法正常工作,先应用active然后再将其删除,一个简单的解决方法如下

在每个页面设置变量上

<?php $pageName = "index"; ?>在“索引”页面上,并且类似 <?php $pageName = "contact"; ?>在“与我们联系”页面上

然后调用header.php(即导航代码在header.php中) <?php include('header.php'); >

在header.php中,确保每个导航链接如下

<a class="nav-link <?php if ($page_name == 'index') {echo "active";} ?> href="index.php">Home</a>

<a class="nav-link <?php if ($page_name == 'contact') {echo "active";} ?> href="contact.php">Contact Us</a>

希望这有助于导致我花了几天的时间才能使jquery工作,但失败了,

如果有人友好地解释了在包含header.php并随后加载页面时究竟是什么问题...为什么jquery无法将活动类添加到nav-link ..

答案 14 :(得分:0)

我一直在寻找可以在bootstrap 4导航栏和其他链接组上使用的解决方案。

由于某种原因,大多数解决方案都不起作用,尤其是那些尝试在onclick链接上添加“活动”的解决方案,因为一旦单击链接(如果该链接将您带到另一个页面),那么您添加的“活动”就会赢了因为DOM已更改,所以不在那儿。 其他许多解决方案都不起作用,或者是因为它们通常不匹配链接,或者匹配了多个。

这种优雅的解决方案适用于不同的链接,例如:about.php,index.php等...

$(function() {
   $('nav a[href^="' + location.pathname.split("/")[2] + '"]').addClass('active');
});

但是,当涉及到具有不同查询字符串(例如index.php?tag = a,index.php?tag = b,index.php?tag = c)的相同链接时,它将全部设置为活动状态单击,因为它与路径名匹配,而不与查询匹配。

因此,我尝试了这段与路径名和查询字符串匹配的代码,它适用于所有带有查询字符串的链接,但是当单击类似index.php的链接时,它也会将类似的查询字符串链接设置为活动状态。这是因为如果链接中没有查询字符串,那么我的函数将返回一个空字符串,再次与路径名匹配。

$(function() {
   $('nav a[href^="' + location.pathname.split("/")[2] + returnQueryString(location.href.split("?")[1]) + '"]').addClass('active');
});
/** returns a query string if there, else an empty string */
function returnQueryString (element) {
   if (element === undefined)
      return "";
   else
      return '?' + element;
}

所以最终我放弃了这条路线,并保持简单并编写了此路线。

$('.navbar a').each(function(index, element) {
    //console.log(index+'-'+element.href);
    //console.log(location.href);
    /** look at each href in the navbar
      * if it matches the location.href then set active*/
    if (element.href === location.href){
        //console.log("---------MATCH ON "+index+" --------");
        $(element).addClass('active');
    }
});

它适用于所有带有或不带有查询字符串的链接,因为element.href和location.href都返回完整路径。对于其他菜单等,您可以简单地将父类选择器(navbar)更改为另一个,即:

$('.footer a').each(function(index, element)...

最后一件事似乎也很重要,那就是您正在使用的js&css库,但这也许是另一篇文章。 我希望这会有所帮助。

答案 15 :(得分:0)

对于 AngularJS ,您可以将 ng-class 与以下函数一起使用:

HTML - &gt;

<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,那么就不会有哈希值。因此,您可以使用$location

从URL中提取所需的字符串

以下内容不适用于所有情况 - &gt;

使用如下所示的范围变量仅在单击时才起作用,但如果使用$state.transitionTo或window.location完成转换或手动更新URL,则Tab值将不会更新

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

答案 16 :(得分:0)

我尝试了前5个解决方案以及它们的不同变体,但是它们对我不起作用。

最后,我可以使用这两个功能。

$(document).on('click', '.nav-link', function () {
    $(".nav-item").find(".active").removeClass("active");
})

$(document).ready(function() {
    $('a[href="' + location.pathname + '"]').closest('.nav-item').addClass('active'); 
});

答案 17 :(得分:0)

引导程序4要求您将li项定位为活动类。为此,您必须找到a的父级。 a的'hitbox'与li一样大,但是由于JS中事件的冒泡,它将使您退回a事件。因此,您必须手动将其添加到其父级。

  //set active navigation after click
  $(".nav-link").on("click", (event) => {
    $(".navbar-nav").find(".active").removeClass('active');
    $(event.target).parent().addClass('active');
  });

答案 18 :(得分:0)

作为一个不懂javascript的人,这是一个对我有用的PHP方法,易于理解。我的整个导航栏位于一个PHP函数中,该函数位于页面中包含的常见组件文件中。例如,在我的“ index.php”页面中,我有... `

<?php
   function my_navbar($calling_file)
   {
      // All your usual nabvbar code here up to the menu items
      if ($calling_file=="index.php")   {   echo '<li class="nav-item active">';    } else {    echo '<li class="nav-item">';   }
    echo '<a class="nav-link" href="index.php">Home</a>
</li>';
      if ($calling_file=="about.php")   {   echo '<li class="nav-item active">';    } else {    echo '<li class="nav-item">';   }
    echo '<a class="nav-link" href="about.php">About</a>
</li>';
      if ($calling_file=="galleries.php")   {   echo '<li class="nav-item active">';    } else {    echo '<li class="nav-item">';   }
    echo '<a class="nav-link" href="galleries.php">Galleries</a>
</li>';
       // etc for the rest of the menu items and closing out the navbar
     }
  ?>

然后在“ my_common_includes.php”中,我有...

public function channel() {
    return $this->belongsTo(Channel::class, 'entityId', 'uuid')->select(array('columns name you want to get'));
}

答案 19 :(得分:0)

下一个答案适用于拥有多级菜单的人:

var url = window.location.href;

var els = document.querySelectorAll(".dropdown-menu a");
for (var i = 0, l = els.length; i < l; i++) {
    var el = els[i];
    if (el.href === url) {
       el.classList.add("active");
       var parent = el.closest(".main-nav"); // add this class for the top level "li" to get easy the parent
       parent.classList.add("active");
    }
}

Exeample how it works

答案 20 :(得分:0)

对我有用的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 包含 location.pathname

时,此方法才有效!

如果要在自己的PC上测试站点(使用wamp,xampp,灯等),并且站点位于某个子文件夹中,则您的路径实际上是“ /somefolder/something.php”,因此请不要不会感到困惑。

我建议您不确定是否使用以下代码,以便确保正确的 location.pathname

$(document).ready(function() {
  alert(location.pathname);
});

答案 21 :(得分:0)

我不得不前进一步,因为我的文件名与我的导航栏标题不同。即我的第一个导航栏链接是HOME,但文件名是索引..

所以只需抓住路径名并匹配它。

显然,这是一个粗略的例子,可能更有效,但它是高度定制的需求。

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');
}

答案 22 :(得分:0)

在主js文件中添加此JavaScript。

$(".navbar a").on("click", function(){
      $(".navbar").find(".active").removeClass("active");
      $(this).parent().addClass("active");
    });

答案 23 :(得分:0)

我使用bootstrap裸主题,这是示例导航条代码。注意元素的类名 - &gt; .nav - 因为这是在java脚本中引用的。

/ 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 view snippet - &gt;

- content_for :javascript do
  :javascript
      $(function () {
          $.each($('.nav').find('li'), function() {
              $(this).toggleClass('active',
                  $(this).find('a').attr('href') == window.location.pathname);
          });
      });

在javascript调试器中,确保您具有&#39; href&#39;属性与window.location.pathname匹配。这与@Zitrax的解决方案略有不同,后者帮助我解决了我的问题。

答案 24 :(得分:0)

对于bootstrap移动菜单在单击项目后解除折叠,您可以使用此

$("ul.nav.navbar-nav li a").click(function() {    

    $(".navbar-collapse").removeClass("in");
});

答案 25 :(得分:0)

Class&#34; active&#34;没有使用bootstrap开箱即用。在您使用PHP的情况下,您可以看到:

How add class='active' to html menu with php

帮助您实现一种主要使其自动化的方法。

答案 26 :(得分:-1)

$(document).ready(function() {
            
   var url = window.location.href;
            
   $('a[href*="'+url+'"]').addClass("active");
            
});