I have a html as sidebar, and use Bootstrap
.
<ul class="nav nav-list">
<li class="active"><a href="/">Link 1</a></li>
<li><a href="/link2">Link 2</a></li>
<li><a href="/link3">Link 3</a></li>
</ul>
I want to do some thing:
When I click
a link such as Link 3, the page content
will change to Link 3's content, and the Link 3 will have class active
, and remove the active clss in Link 1.
I think this can be implemented in jQuery
, and I have searched many question in SO, such as:
I use this script:
$(document).ready(function () {
$('.nav li').click(function(e) {
$('.nav li').removeClass('active');
var $this = $(this);
if (!$this.hasClass('active')) {
$this.addClass('active');
}
//e.preventDefault();
});
});
But most of them use preventDefault
, this will prevent the continued action. So it can't change to Link 3's page content.
If I remove the preventDefault statement, when the page load Link 3's content, the active class will back to Link 1.
So Is there any way to solve this problem?
This question is related to
javascript
jquery
html
twitter-bootstrap
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>_x000D_
$(document).ready(function () {_x000D_
var url = window.location;_x000D_
$('ul.nav a[href="' + url + '"]').parent().addClass('active');_x000D_
$('ul.nav a').filter(function () {_x000D_
return this.href == url;_x000D_
}).parent().addClass('active').parent().parent().addClass('active');_x000D_
});_x000D_
_x000D_
This works perfectly
_x000D_
You can use cookies for save postback data from one page to another page.After spending a lot time finally i was able to make this happen. I am suggesting my answer to you(this is fully working since I also needed this).
first give your li tag to valid id name like
<ul class="nav nav-list">_x000D_
<li id="tab1" class="active"><a href="/">Link 1</a></li>_x000D_
<li id="tab2"><a href="/link2">Link 2</a></li>_x000D_
<li id="tab3"><a href="/link3">Link 3</a></li>_x000D_
</ul>
_x000D_
After that copy and paste this script. since I have written some javascript for reading, deleting and creating cookies.
$('.nav li a').click(function (e) {_x000D_
_x000D_
var $parent = $(this).parent();_x000D_
document.cookie = eraseCookie("tab");_x000D_
document.cookie = createCookie("tab", $parent.attr('id'),0);_x000D_
});_x000D_
_x000D_
$().ready(function () {_x000D_
var $activeTab = readCookie("tab");_x000D_
if (!$activeTab =="") {_x000D_
$('#tab1').removeClass('ActiveTab');_x000D_
}_x000D_
// alert($activeTab.toString());_x000D_
_x000D_
$('#'+$activeTab).addClass('active');_x000D_
});_x000D_
_x000D_
function createCookie(name, value, days) {_x000D_
if (days) {_x000D_
var date = new Date();_x000D_
date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));_x000D_
var expires = "; expires=" + date.toGMTString();_x000D_
}_x000D_
else var expires = "";_x000D_
_x000D_
document.cookie = name + "=" + value + expires + "; path=/";_x000D_
}_x000D_
_x000D_
function readCookie(name) {_x000D_
var nameEQ = name + "=";_x000D_
var ca = document.cookie.split(';');_x000D_
for (var i = 0; i < ca.length; i++) {_x000D_
var c = ca[i];_x000D_
while (c.charAt(0) == ' ') c = c.substring(1, c.length);_x000D_
if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length, c.length);_x000D_
}_x000D_
return null;_x000D_
}_x000D_
_x000D_
function eraseCookie(name) {_x000D_
createCookie(name, "", -1);_x000D_
}
_x000D_
Note: Make sure you have implmeted according to your requirement. I have written this script according to my implementation and its working fine for me.
If you change the classes and load the content within the same function you should be fine.
$(document).ready(function(){
$('.nav li').click(function(event){
//remove all pre-existing active classes
$('.active').removeClass('active');
//add the active class to the link we clicked
$(this).addClass('active');
//Load the content
//e.g.
//load the page that the link was pointing to
//$('#content').load($(this).find(a).attr('href'));
event.preventDefault();
});
});
html code in my case
<ul class="navs">
<li id="tab1"><a href="index-2.html">home</a></li>
<li id="tab2"><a href="about.html">about</a></li>
<li id="tab3"><a href="project-02.html">Products</a></li>
<li id="tab4"><a href="contact.html">contact</a></li>
</ul>
and js code is
$('.navs li a').click(function (e) {
var $parent = $(this).parent();
document.cookie = eraseCookie("tab");
document.cookie = createCookie("tab", $parent.attr('id'),0);
});
$().ready(function () {
var $activeTab = readCookie("tab");
if (!$activeTab =="") {
$('#tab1').removeClass('ActiveTab');
}
// alert($activeTab.toString());
$('#'+$activeTab).addClass('active');
});
function createCookie(name, value, days) {
if (days) {
var date = new Date();
date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));
var expires = "; expires=" + date.toGMTString();
}
else var expires = "";
document.cookie = name + "=" + value + expires + "; path=/";
}
function readCookie(name) {
var nameEQ = name + "=";
var ca = document.cookie.split(';');
for (var i = 0; i < ca.length; i++) {
var c = ca[i];
while (c.charAt(0) == ' ') c = c.substring(1, c.length);
if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length, c.length);
}
return null;
}
function eraseCookie(name) {
createCookie(name, "", -1);
}
<script type="text/javascript">
$(document).ready(function(){
$('.nav li').click(function(){
$(this).addClass('active');
$(this).siblings().removeClass('active');
});
});
<ul class="nav nav-list">_x000D_
<li id="tab1" class="active"><a href="/">Link 1</a></li>_x000D_
<li id="tab2"><a href="/link2">Link 2</a></li>_x000D_
<li id="tab3"><a href="/link3">Link 3</a></li>_x000D_
</ul>
_x000D_
I had the same issue before. Try this answer here, it works on my site.
$(function(){
var current_page_URL = location.href;
$( "a" ).each(function() {
if ($(this).attr("href") !== "#") {
var target_URL = $(this).prop("href");
if (target_URL == current_page_URL) {
$('nav a').parents('li, ul').removeClass('active');
$(this).parent('li').addClass('active');
return false;
}
}
});
});
Source: It was original posted here how to set active class to nav menu from twitter bootstrap
$(".nav li").click(function() {
if ($(".nav li").removeClass("active")) {
$(this).removeClass("active");
}
$(this).addClass("active");
});
This is what I came up with. It checks if the "li" element has the class of active, if it doesn't it skips the remove class part. I'm a bit late to the party, but hope this helps. :)
If you are using server side code like Java then you need to return active tab name and on return page have some function to disable( meaning remove active class) all tabs except the one you returned.
This would require you to add id or name to each tab. Little bit more work :)
This will do the trick
$(document).ready(function () {
var url = window.location;
var element = $('ul.nav a').filter(function() {
return this.href == url || url.href.indexOf(this.href) == 0;
}).addClass('active').parent().parent().addClass('in').parent();
if (element.is('li')) {
element.addClass('active');
}
});
guys try this is a perfect answer for this question:
<script>
$(function(){
$('.nav li a').filter(function(){return this.href==location.href}).parent().addClass('active').siblings().removeClass('active')
$('.nav li a').click(function(){
$(this).parent().addClass('active').siblings().removeClass('active')
})
})
</script>
_x000D_
I am using bootstrap navigation
This did the job for me including active main dropdown's and the active children
$(document).ready(function () {
var url = window.location;
// Will only work if string in href matches with location
$('ul.nav a[href="' + url + '"]').parent().addClass('active');
// Will also work for relative and absolute hrefs
$('ul.nav a').filter(function () {
return this.href == url;
}).parent().addClass('active').parent().parent().addClass('active');
});
Source: Stackoverflow.com