使用twitter bootstrap,我需要启动活动类到主导航的li部分。自动的。 我们使用php而不是ruby。
示例导航:
<ul class="nav">
<li><a href="/">Home</a></li>
<li><a href="/forums">Forums</a></li>
<li><a href="/blog">Blog</a></li>
<li><a href="/faqs.php">FAQ's</a></li>
<li><a href="/item.php">Item</a></li>
<li><a href="/create.php">Create</a></li>
</ul>
Bootstrap代码如下:
<li class="active"><a href="/">Home</a></li>
因此,只需要弄清楚如何将活动类附加到当前页面。已经看过几乎所有关于Stack的答案,没有真正的快乐。
我玩过这个:
/*menu handler*/
$(function(){
var url = window.location.pathname;
var activePage = url.substring(url.lastIndexOf('/')+1);
$('.nav li a').each(function(){
var currentPage = this.href.substring(this.href.lastIndexOf('/')+1);
if (activePage == currentPage) {
$(this).parent().addClass('active');
}
});
})
但没有快乐。
答案 0 :(得分:126)
对于Bootstrap 3:
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');
对于Bootstrap 4:
var url = window.location;
// Will only work if string in href matches with location
$('ul.navbar-nav a[href="'+ url +'"]').parent().addClass('active');
// Will also work for relative and absolute hrefs
$('ul.navbar-nav a').filter(function() {
return this.href == url;
}).parent().addClass('active');
答案 1 :(得分:37)
我们最终成功解决了问题:
/*menu handler*/
$(function(){
function stripTrailingSlash(str) {
if(str.substr(-1) == '/') {
return str.substr(0, str.length - 1);
}
return str;
}
var url = window.location.pathname;
var activePage = stripTrailingSlash(url);
$('.nav li a').each(function(){
var currentPage = stripTrailingSlash($(this).attr('href'));
if (activePage == currentPage) {
$(this).parent().addClass('active');
}
});
});
答案 2 :(得分:30)
你真的不需要任何带Bootstrap的JavaScript:
<ul class="nav">
<li><a data-target="#" data-toggle="pill" href="#accounts">Accounts</a></li>
<li><a data-target="#" data-toggle="pill" href="#users">Users</a></li>
</ul>
要在选择菜单项后执行更多任务,您需要JS,如其他帖子所述。
希望这有帮助。
答案 3 :(得分:13)
答案 4 :(得分:10)
这对我来说很有帮助,包括积极的主要下拉菜单和活跃的孩子(感谢422):
$(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');
});
答案 5 :(得分:8)
如果您正在使用具有路由和操作的MVC框架:
$(document).ready(function () {
$('a[href="' + this.location.pathname + '"]').parent().addClass('active');
});
如Christian Landgren的回答所示: https://stackoverflow.com/a/13375529/101662
答案 6 :(得分:6)
试试这个。
// Remove active for all items.
$('.page-sidebar-menu li').removeClass('active');
// highlight submenu item
$('li a[href="' + this.location.pathname + '"]').parent().addClass('active');
// Highlight parent menu item.
$('ul a[href="' + this.location.pathname + '"]').parents('li').addClass('active');
答案 7 :(得分:3)
这对我来说很好。它将简单的nav元素和下拉导航元素标记为活动。
$(document).ready(function () {
var url = window.location;
$('ul.nav a[href="' + this.location.pathname + '"]').parent().addClass('active');
$('ul.nav a').filter(function() {
return this.href == url;
}).parent().parent().parent().addClass('active');
});
将this.location.pathname
传递给$('ul.nav a[href="'...'"]')
标记也是简单的导航元素。通过url
对我没有用。
答案 8 :(得分:2)
以防你在Angulajs中使用Boostrap:这是一个适合我的简单指令(因为Kam引用的数据切换不包含在Angular-ui中)。希望可以提供帮助。
app.directive("myDataToggle", function(){
function link(scope, element, attrs) {
var e = angular.element(element);
e.on('click', function(){
e.parent().parent().children().removeClass('active');
e.parent().addClass("active");
})
}
return {
restrict: 'A',
link: link
};
});
<ul class="nav nav-sidebar">
<li><a href="#/page1" my-data-toggle>Page1</a></li>
<li><a href="#/page2" my-data-toggle>Page2</a></li>
<li><a href="#/page3" my-data-toggle>Page3</a></li>
</ul>
答案 9 :(得分:1)
解决方案很简单,不需要服务器端或ajax,只需要jQuery和Bootstrap。在每个页面上为id
标记添加body
。使用id
查找包含页面名称(标记值)的标记。
示例:
<强> page1.html 强>
<body id="page1">
<ul class="nav navbar-nav">
<li><a href="page1.html">Page1</a></li>
<li><a href="page2.html">Page2</a></li>
</ul>
<script src="script.js"></script>
</body>
<强> page2.html 强>
<body id="page2">
<ul class="nav navbar-nav">
<li><a href="page1.html">Page1</a></li>
<li><a href="page2.html">Page2</a></li>
</ul>
<script src="script.js"></script>
</body>
<强>的script.js 强>
<script>
$(function () {
$("#page1 a:contains('Page1')").parent().addClass('active');
$("#page2 a:contains('Page2')").parent().addClass('active');
});
</script>
非常感谢Ben! YouTube
答案 10 :(得分:1)
在极少数情况下,引导4会出现可接受的答案: 为了将解决方案用于相对路径,例如:
<ul class="navbar-nav nav-t">
<li class="nav-item"><a href="index.php" class="nav-link">Home</a></li>
<li class="nav-item"><a href="about.php" class="nav-link">About</a></li>
<li class="nav-item"><a href="blog.php" class="nav-link">Blog</a></li>
<li class="nav-item"><a href="info.php" class="nav-link">Info</a></li>
</ul>
然后,您将发现以下代码:
if (activePage == currentPage) {
$(this).parent().addClass('active');
}
活动页面返回整个URL,当前位置返回当前的href DOM元素值,即filename.php。 要解决此问题,只需添加一些方法即可对代码稍作调整:
//... other js/jquery code
var activeMenuItemChanges=function () {
function stripTrailingSlash(str) {
if(str.substr(-1)=='/'){
return str.substr(0, str.length -1);
}
return str;
}
// for cases where we do not use full url but relative file names in the href of ul>li>a tags:
function getRelativeFileName(str){
let page=str.substr(str.lastIndexOf('/')+1);
if(page.length > 0){
return page;
}
return 'index'|'index.php';
}
let url=window.location.pathname;
let activeLocation=stripTrailingSlash(url);
let activeFileName=getRelativeFileName(activeLocation);
$('.nav-item a').each(function() {
let currentLocation=stripTrailingSlash($(this).attr('href'));
if(activeFileName==currentLocation){
$(this).parent().addClass('active');
}
});
}
activeMenuItemChanges();
//... other js/jquery code
答案 11 :(得分:0)
这是完整的Twitter bootstrap示例,并基于查询字符串应用了活动类。
要实现正确的解决方案,需要采取以下措施:
1)包括最新的jquery.js和bootstrap.js javascript文件。
2)包含最新的bootstrap.css文件
3)包含querystring-0.9.0.js以获取js中的查询字符串变量值。
4)HTML:
<div class="navbar">
<div class="navbar-inner">
<div class="container">
<ul class="nav">
<li class="active">
<a href="#?page=0">
Home
</a>
</li>
<li>
<a href="#?page=1">
Forums
</a>
</li>
<li>
<a href="#?page=2">
Blog
</a>
</li>
<li>
<a href="#?page=3">
FAQ's
</a>
</li>
<li>
<a href="#?page=4">
Item
</a>
</li>
<li>
<a href="#?page=5">
Create
</a>
</li>
</ul>
</div>
</div>
</div>
脚本标记中的JQuery:
$(function() {
$(".nav li").click(function() {
$(".nav li").removeClass('active');
setTimeout(function() {
var page = $.QueryString("page");
$(".nav li:eq(" + page + ")").addClass("active");
}, 300);
});
});
我已经完成了垃圾箱,所以请点击这里http://codebins.com/bin/4ldqpaf
答案 12 :(得分:0)
这些都不适合我。我的Bootstrap设置导航到单独的页面(因此我无法在单击操作上执行此操作,但在导航到新页面时将删除活动类),并且我的URL不完全匹配。基于我的异常情况,这就是我的所作所为。希望它能帮助他人:
//Adding the active class to Twitter bootstrap navs, with a few alternate approaches
$(document).ready(function() {
var rawhref = window.location.href; //raw current url
var newpage = ((window.location.href.match(/([^\/]*)\/?$/)[1]).substring(1)); //take only the last part of the url, and chop off the first char (substring), since the contains method below is case-sensitive. Don't need to do this if they match exactly.
if (newpage == 'someNonMatchingURL') { //deal with an exception literally
newpage = 'matchingNavbarText'
}
if (rawhref.indexOf('somePartofURL') != -1) { //look for a consistent part of the path in the raw url to deal with variable urls, etc.
newpage = "moreMatchingNavbarText"
}
$(".nav li a:contains('" + newpage + "')").parent().addClass('active'); //add the active class. Note that the contains method requires the goofy quote syntax to insert a variable.
});
答案 13 :(得分:0)
要激活菜单和子菜单,即使使用URL中的参数,也请使用以下代码:
// Highlight the active menu
$(document).ready(function () {
var action = window.location.pathname.split('/')[1];
// If there's no action, highlight the first menu item
if (action == "") {
$('ul.nav li:first').addClass('active');
} else {
// Highlight current menu
$('ul.nav a[href="/' + action + '"]').parent().addClass('active');
// Highlight parent menu item
$('ul.nav a[href="/' + action + '"]').parents('li').addClass('active');
}
});
这会接受以下网址:
/帖子
/帖/ 1
/帖/ 1 /编辑
答案 14 :(得分:0)
我遇到了同样的问题,这就是我在我的应用启动脚本中添加的内容,它运行顺畅。这是javascript
$(document).ready(function($){
var navs = $('nav > ul.nav');
// Add class .active to current link
navs.find('a').each(function(){
var cUrl = String(window.location).split('?')[0];
if (cUrl.substr(cUrl.length - 1) === '#') {
cUrl = cUrl.slice(0,-1);
}
if ($($(this))[0].href===cUrl) {
$(this).addClass('active');
$(this).parents('ul').add(this).each(function(){
$(this).parent().addClass('open');
});
}
});
});
相应的HTML如下所示。我正在使用CoreUI,一个非凡的开源管理模板,并支持许多前端框架,如Angular,普通引导程序,Angular 4等。
<div class="sidebar">
<nav class="sidebar-nav open" >
<ul class="nav" id="navTab" role="tablist">
<li class="nav-item">
<a class="nav-link" href="/summary"><i class="icon-speedometer"></i> Dashboard </a>
</li>
<li class="nav-item">
<a class="nav-link" href="/balanceSheet"><i class="icon-chart"></i> Balance Sheet </a>
</li>
<li class="divider"></li>
<li class="nav-title border-bottom">
<p class="h5 mb-0">
<i class="icon-graph"></i> Assets
</p>
</li>
</ul>
</nav>
</div>
答案 15 :(得分:0)