Status Aktif navbar bootstrap tidak berfungsi

91

Saya memiliki bootstrap v3.

Saya menggunakan tombol class="active"on navbardan tidak menyala saat saya menekan item menu. Saya tahu bagaimana melakukan ini dengan jQuerydan membangun fungsi klik tetapi saya pikir fungsionalitas ini harus disertakan dalam bootstrap? Jadi mungkin ini masalah JavaScript?

Ini adalah header saya dengan file js / css / bootstrap yang telah saya sertakan:

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

Ini navbarkode saya :

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

Apakah saya menyiapkannya dengan benar?

(Pada catatan yang tidak terkait, tetapi mungkin terkait? Saat menu beralih ke seluler, saya klik tombol menu dan tombol menu itu menciut. Menekannya lagi tidak akan membatalkan penciutan. Jadi masalah ini, dengan yang lain, keduanya menandakan penyiapan JavaScript yang salah mungkin?)

TheLettuceMaster
sumber
3
Sejak saya bekerja dengan bootstrap, saya pikir Boostrap tidak mengelolanya, Anda harus mengaktifkan kelas sendiri ... Jika saya salah, saya akan belajar banyak dengannya ...
BENARD Patrick
1
Ya @TheLittlePig benar, Anda perlu menambahkan activekelas sendiri saat aplikasi Anda menghasilkan HTML.
DavidG

Jawaban:

143

Anda telah menyertakan file Bootstrap js yang diperkecil dan plugin penciutan / transisi sementara dokumen menyatakan bahwa:

Baik bootstrap.js dan bootstrap.min.js berisi semua plugin dalam satu file.
Sertakan hanya satu.

dan

Untuk efek transisi sederhana, sertakan transisi.js satu kali di samping file JS lainnya. Jika Anda menggunakan bootstrap.js yang dikompilasi (atau dikecilkan), tidak perlu menyertakan ini — ini sudah ada di sana.

Jadi itu bisa jadi masalah Anda untuk meminimalkan masalah.

Untuk kelas aktif, Anda harus mengelolanya sendiri, tetapi itu hanya satu atau dua baris.

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");
});
Pete TNT
sumber
2
Apakah ini berfungsi jika Anda berpindah dari halaman ke halaman lain dalam href(bukan hash tetapi mengirim permintaan lain)?
Blaszard
1
@Blaszard dalam aplikasi / situs non-halaman tunggal Anda harus memiliki activekelas pada navitem secara default.
Pete TNT
Tidak bekerja untuk saya. Item daftar tidak pernah muncul sebagai aktif !? Apa yang tidak saya lakukan yang kalian lakukan?
pengguna465342
4
ini tidak berfungsi untuk saya, ini semakin ditambahkan tetapi di detik berikutnya akan ke kelas aktif awal sehingga tidak tinggal di halaman tolong siapa pun yang membantu dalam hal ini
sourav78611
9
@Pete TNT - Masih belum jelas dan sangat membingungkan ketika orang memberikan 90% soloution dan berasumsi semua orang tahu bagaimana menerapkan 10% sisanya. Terutama dalam skenario ketika sintaksis sulit dilakukan dengan benar.
Dave
97

Inilah solusi saya untuk mengganti halaman aktif

$(document).ready(function() {
  $('li.active').removeClass('active');
  $('a[href="' + location.pathname + '"]').closest('li').addClass('active'); 
});
Jon
sumber
2
Di mana kita harus meletakkan ini? Maaf; baru di JS: #
mrateb
2
Ini berfungsi dengan baik di Bootstrap 4. @ Thomas8: ini harus berada di antara tag <script>dan </script> tags at the bottom of the html file before the </body> `(dengan asumsi Anda memiliki semuanya dalam satu file html).
alwaysCurious
menambahkan yang sama di site.js tanpa tag <script> apa pun dan berhasil $ (document) .ready (function () {$ ('li.active'). removeClass ('active'); $ ('a [href = "'+ location.pathname +'"] '). terdekat (' li '). addClass (' active ');});
Oracular Man
Bagi saya ini adalah satu-satunya solusi yang bekerja pada bootstrap 3.3.7 terima kasih banyak.
MitchellK
Solusi ini akhirnya berhasil untuk saya. Saya menambahkan fungsi: console.log (location.pathname) dan menyadari, di <a href='foo/bar>, saya melewatkan "/" terakhir, jika saya mengubah ke <a href = 'foo / bar / '>, maka fungsi ini berfungsi untuk membuat "li" yang benar aktif di navbar.
Emily
16

Ini bekerja dengan sempurna untuk saya, karena "window.location.pathname" juga berisi data sebelum nama halaman sebenarnya, misalnya direktori / halaman.php. Jadi link navbar sebenarnya hanya akan aktif jika url berisi link ini.

$(document).ready(function() {
    $.each($('#navbar').find('li'), function() {
        $(this).toggleClass('active', 
            window.location.pathname.indexOf($(this).find('a').attr('href')) > -1);
    }); 
});
Bettelbursche
sumber
5
semua solusi lain tidak berfungsi kecuali solusi Anda, saya mencobanya satu per satu
Lynob
14

Dengan bootstrap versi 3.3.4, pada halaman html yang panjang Anda dapat merujuk ke bagian halaman. berdasarkan kelas atau id untuk mengelola link navbar aktif dengan spy-scroll dengan elemen body:

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

Data-target akan menjadi div dengan 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>

Ini harus mengaktifkan tautan dengan mengklik tanpa memerlukan fungsi javascript dan juga akan secara otomatis mengaktifkan setiap tautan saat Anda menggulir melalui bagian terkait dari halaman yang tidak akan dilakukan oleh js onclick ().

jim
sumber
1
Terima kasih. Seharusnya: data-target = "# spy-scroll-id" dan bukan data-target = "spy-scroll-id"
Vdex
10

Yang perlu Anda lakukan hanyalah menambahkan data-toggle = "tab" ke tautan Anda di dalam bilah navigasi bootstrap seperti ini:

<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>
Hakan Fıstık
sumber
ini sangat berguna, tetapi tidak berfungsi jika Anda memiliki navbar-nav (normal) dan juga daftar kedua di kanan navbar. Anda berakhir dengan dua aktif yang tidak pernah dihapus
Karl P
5
ketika saya menambahkan "data-toggle", halaman tidak bisa pergi ke "#place" yang ditentukan di href.
scorpiozj
Sebenarnya pembaruan. Seperti yang disebutkan @scorpiozj. Ketika ini ditambahkan, tautan itu sendiri tidak berfungsi
mrateb
9

Jika Anda tidak menggunakan tautan jangkar, Anda dapat menggunakan sesuatu seperti ini:

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

Dengan Bootstrap 4 Anda dapat menggunakan ini:

$(document).ready(function() {
    $(document).on('click', '.nav-item a', function (e) {
        $(this).parent().addClass('active').siblings().removeClass('active');
    });
});
Carlos Cuesta
sumber
Terima kasih, tidak ada petunjuk mengapa yang lain (Bootstrap 3) tidak berfungsi
information_interchange
4

Solusi elegan ini berhasil untuk saya. Ide / saran baru dipersilakan.

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

Anda bisa menggunakan metode "siblings ()" jQuery agar hanya item yang diakses yang aktif dan saudara kandungnya tidak aktif.

JefferinJoseph
sumber
2

Saya telah berjuang dengan ini hari ini, data-togle hanya berfungsi jika saya menggunakan aplikasi satu halaman.

Saya tidak menggunakan ajax untuk memuat konten. Saya sebenarnya membuat permintaan posting untuk halaman lain jadi skrip js pertama juga tidak berguna. Saya menyelesaikannya dengan baris ini:

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

Saya harap ini akan membantu menyelesaikan masalah ini.

      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";
            });
        });
Kirill Shur
sumber
1

Saya mengalami sedikit kesulitan dengan ini, menggunakan item daftar yang dibuat secara dinamis - WordPress Stack.

Menambahkan ini dan berhasil:

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

Akan melakukannya dengan cepat.

Someguywhocodes
sumber
1

Saya menggunakan ini. Singkat, elegan, dan mudah dimengerti.

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

Untuk bootstrap menu ponsel un-collapse setelah mengklik item Anda dapat menggunakan ini

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

    $(".navbar-collapse").removeClass("in");
});
Nurul Amin
sumber
0

Saya menggunakan tema bootstrap telanjang, berikut adalah contoh kode navbar. Catat nama kelas elemen -> .nav - karena ini disebut dalam 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

di halaman tampilan (atau sebagian) tambahkan ini: javascript, ini perlu dijalankan setiap kali halaman dimuat.

cuplikan tampilan haml ->

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

Dalam debugger javascript, pastikan Anda memiliki nilai atribut 'href' yang cocok dengan window.location.pathname. Ini sedikit berbeda dari solusi oleh @Zitrax yang membantu saya memperbaiki masalah saya.

Resi
sumber
0

Sebab AngularJS, Anda bisa menggunakan ng-classdengan fungsi seperti ini:

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>

Dan pengontrol

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

Jika Anda menggunakan $ location, maka tidak akan ada hash. Jadi Anda dapat mengekstrak string yang diperlukan dari URL menggunakan $ location

Mengikuti tidak akan berfungsi di semua kasus ->

Menggunakan variabel cakupan seperti berikut hanya akan berfungsi saat diklik, tetapi jika transisi dilakukan menggunakan $state.transitionToatau window.location atau memperbarui URL secara manual, nilai Tab tidak akan diperbarui

<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>
Mahesh
sumber
0

Tambahkan JavaScript ini ke file js utama Anda.

$(".navbar a").on("click", function(){
      $(".navbar").find(".active").removeClass("active");
      $(this).parent().addClass("active");
    });
Md. Abunaser Khan
sumber
3
Silakan tambahkan deskripsi solusinya.
sg7
0

Saya harus melangkah maju karena nama file saya tidak sama dengan judul bilah navigasi saya. yaitu, tautan bilah navigasi pertama saya adalah HOME tetapi nama filenya adalah indeks ..

Jadi ambil saja nama jalur dan cocokkan.

Jelas ini adalah contoh kasar dan bisa lebih efisien tetapi sangat dibutuhkan.

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

Solusi bootstrap 4 yang berhasil untuk saya:

$(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();
});

Ini hanya akan berfungsi jika href berisi location.pathname !

Jika Anda menguji situs Anda di pc Anda sendiri (menggunakan wamp, xampp, lamp, dll ...) dan situs Anda terletak di beberapa subfolder maka jalur Anda sebenarnya adalah "/somefolder/something.php", jadi jangan dapatkan bingung.

Saya akan menyarankan jika Anda tidak yakin untuk menggunakan kode berikut sehingga Anda dapat memastikan apa itu location.pathname yang benar :

$(document).ready(function() {
  alert(location.pathname);
});
Luka Sh
sumber
0

jawaban selanjutnya adalah untuk mereka yang memiliki menu multi level:

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

Contoh cara kerjanya

futur1st
sumber
0

Sebagai seseorang yang tidak tahu javascript, berikut adalah metode PHP yang cocok untuk saya dan mudah dimengerti. Seluruh navbar saya ada dalam fungsi PHP yang ada di file komponen umum yang saya sertakan dari halaman saya. Jadi misalnya di halaman 'index.php' saya, saya punya ... `

<?php
   $calling_file = basename(__FILE__);
   include 'my_common_includes.php';    // Going to use my navbar function "my_navbar"
   my_navbar($calling_file);    // Call the navbar function
 ?>

Kemudian di 'my_common_includes.php' saya punya ...

<?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
     }
  ?>
M61Vulcan
sumber
0

Bootstrap 4 mengharuskan Anda menargetkan liitem untuk kelas aktif. Untuk melakukan itu, Anda harus mencari induk dari a. The 'hitbox' aadalah sebesar itu litetapi karena gelembung acara di JS itu akan mengembalikan aacara tersebut. Jadi, Anda harus menambahkannya secara manual ke induknya.

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

Saya mencoba tentang 5 solusi pertama dan variasinya yang berbeda, tetapi tidak berhasil untuk saya.

Akhirnya saya membuatnya bekerja dengan dua fungsi ini.

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

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

ketika menggunakan header.php untuk setiap halaman untuk kode navbar, jquery tidak berfungsi, aktif diterapkan dan kemudian dihapus, solusi sederhana, adalah sebagai berikut

pada setiap halaman mengatur variabel <?php $pageName = "index"; ?>pada halaman Indeks dan juga <?php $pageName = "contact"; ?>pada halaman Hubungi kami

lalu panggil header.php (yaitu kode nav ada di header.php) <?php include('header.php'); >

di header.php pastikan bahwa setiap nav-link adalah sebagai berikut

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

Semoga ini membantu karena saya telah menghabiskan waktu berhari-hari untuk membuat jquery berfungsi tetapi gagal,

jika seseorang dengan ramah akan menjelaskan apa sebenarnya masalahnya ketika header.php disertakan dan kemudian halaman dimuat ... mengapa jquery gagal menambahkan kelas aktif ke nav-link .. ??

Srikanth Kamath
sumber
0

Saya telah mencari solusi yang dapat saya gunakan pada bootstrap 4 navbar dan grup tautan lainnya.

Karena satu dan lain alasan, sebagian besar solusi tidak berfungsi terutama yang mencoba menambahkan 'aktif' ke tautan onclick karena tentu saja begitu tautan diklik jika membawa Anda ke halaman lain maka 'aktif' yang Anda tambahkan tidak akan di sana karena DOM telah berubah. Banyak dari solusi lain yang tidak berfungsi karena sering kali tidak cocok dengan tautan atau cocok lebih dari satu.

Solusi elegan ini bagus untuk tautan yang berbeda yaitu: about.php, index.php, dll ...

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

Namun ketika datang ke tautan yang sama dengan string kueri yang berbeda seperti index.php? Tag = a, index.php? Tag = b, index.php? Tag = c itu akan mengatur semuanya untuk aktif mana saja yang diklik seperti itu mencocokkan nama jalur, bukan kueri juga.

Jadi saya mencoba kode ini yang cocok dengan nama path dan string kueri dan itu bekerja pada semua tautan dengan string kueri tetapi ketika tautan seperti index.php diklik itu akan mengatur tautan string kueri serupa aktif juga. Ini karena fungsi saya mengembalikan string kosong jika tidak ada string kueri di tautan, lagi-lagi hanya cocok dengan nama jalur.

$(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;
}

Jadi pada akhirnya saya meninggalkan rute ini dan membuatnya tetap sederhana dan menulis ini.

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

Ini berfungsi pada semua tautan dengan atau tanpa string kueri karena element.href dan location.href keduanya mengembalikan jalur lengkap. Untuk menu lain dll Anda cukup mengubah pemilih kelas induk (navbar) untuk yang lain yaitu:

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

Satu hal terakhir yang juga tampaknya penting dan itu adalah pustaka js & css yang Anda gunakan, tetapi itu mungkin posting lain. Saya harap ini membantu dan berkontribusi.

Steve Whitby
sumber