我有一些像这样的导航链接:
<ul id="nav">
<li><a href="index.html">Home</a>
<li><a href="about.html">About</a>
<li><a href="contact.html">Contact</a>
</ul>
如何将名为active
的CSS类添加到包含其值与当前网址匹配的<li>
的列表项的开始a href
标记中?
例如,如果用户所在的当前页面为about.html
,则导航应如下所示:
<ul id="nav">
<li><a href="index.html">Home</a>
<li class="active"><a href="about.html">About</a>
<li><a href="contact.html">Contact</a>
</ul>
请注意:
网址可以包含其他参数:
about.html富=栏&安培;栏= 1.00
所以用于检测网址的内容不应该考虑参数,而应该只考虑页面名称和扩展名。
我更喜欢在普通的JavaScipt中实现这一点,因为我没有在网站上使用jQuery,但其中任何一个都没问题。
当它从另一个页面登陆时,索引页面在url中有index.html,但如果域名是类型,则显示为:
http://www.sitename.com/
因此,如果没有指定页面,则应将活动类附加到主列表的标记。
答案 0 :(得分:4)
jQuery的:
if(window.location.pathname === '') {
$('#nav li:first-child').addClass('active');
}
else {
var path = window.location.pathname;
path = path.substr(path.lastIndexOf('/') + 1);
$('#nav li').filter(function(index) {
return path === $(this).children('a').attr('href');
}).addClass('active');
}
普通JavaScript:
var menu_elements = document.getElementById('nav').children;
if(window.location.pathname === '') {
menu_elements[0].className += ' active';
}
else {
var path = window.location.pathname;
path = path.substr(path.lastIndexOf('/') + 1);
for(var i = menu_elements.length; i--;) {
var element = menu_elements[i];
var a = element.children[0];
if(a.href === path) {
element.className += ' active';
break;
}
}
}
注意:children[]
is not supported by FF 3.0。如果您在使用children
时遇到任何问题,可以使用相应的getElementsByTagName
来代替此问题。
答案 1 :(得分:1)
简易版
window.onload=function() {
var activeLi;
if (location.pathname) {
var fileName = location.pathname.substring(pathname.lastIndexof('/')+1);
/* just take the start -
not handling filenames that are substrings of other filenames
nor filenames with more than one dot. */
fileName = fileName.split('.')[0];
var links = document.getElementById('nav').getElementsByTagName('a');
for (var i=0;i<links.length;i++) {
if (links[i].href.indexOf(fileName)==0) { // starts with filename
activeLi = links[i].parentNode;
break;
}
}
}
else { // no page given
activeLi = document.getElementById('nav').getElementsByTagName('li')[0];
}
if (activeLi) activeLi.className="active";
}
更复杂的是将活动添加到className,但是如果你没有在LI上有其他类,那么就不需要了 - 但是如果使用jQuery则更简单。
答案 2 :(得分:0)
//Get sub-domain url
var currentUrl = window.location.href,
splitUrlArr = currentUrl.replace(/\?.*/,'').split('\/');
subDomainUrl = splitUrlArr[splitUrlArr.length-1];
//if url matches the site home url, add classname 'active' to first li
if(splitUrlArr.join('\/') == currentUrl) {
document.getElementById('nav').getElementsByTagName('li')[0].className = "active";
}else {
//Find the matching href and add className 'active' to its parent li
var targetLi = null;
var links = document.getElementById('nav').getElementsByTagName('a');
for (var i=0; i < links.length; i++) {
if (links[i].href === subDomainUrl) {
targetLi = links[i].parentNode;
break;
}
}
if(targetLi) { targetLi.className = "active"; }
}