JavaScript实现菜单视觉标识

以前写过一篇文章也是关于视觉标识的:《CSS实现视觉标识》。在这篇文章中我介绍了用CSS来实现视觉标识的效果,但是里面的DEMO只有一个页面,而且链接没有动态的参数。

很多时候我们在实际开发的时候都是在同一个页面而且有如:“article.php?id=10”这样的样子,看下面这段代码:

<ul id=”menu”>
<li><a id=”a11″ href=”?id=11″>index</a></li>
<li><a id=”a12″ href=”?id=12″>video</a></li>
<li><a id=”a13″ href=”?id=13″>music</a></li>
<li><a id=”a14″ href=”?id=14″>message</a></li>
</ul>

当我们想用JS来在当前页面写代码实现点击后变色,可能你会想到下面这段JS代码:

var menu = document.getElementById(“menu”);
var menuA = menu.getElementsByTagName(“a”);
for ( var i = 0; i<menuA.length; i++ ) {
menuA[i].onclick=function(e){
this.style.background=”red”;
return false;
}
}

但是这段代码确没有达到效果。

原因:

因为只有一个页面而且每个链接都是有参数的,点击任何一个链接都会重新载入页面。DOM重新载入,那么JS的效果就不起作用了。

解决方法:

在页面每次载入时取出URL的参数,对应的给每个A链接加上ID。页面载入时判断参数与ID是否一致,一致就给链接动态加上样式Class。正确的JS是这样写的:

var str = window.location.search.substring(4,6);  //取参数ID号
var menu = document.getElementById(“menu”);
var menuA = menu.getElementsByTagName(“a”);       //获取所有链接
for ( var i = 0; i<menuA.length; i++ ) {          //循环确定是否匹配
var menuAID = menuA[i].getAttribute(“id”).substring(1,3);
if ( str == menuAID ) {
menuA[i].className = “active”;            //动态加上class
}
}

查看DEMO效果

特别感谢青色和亚当学院3群的同学提供思路。

JavaScript实现菜单视觉标识》上有 29 条评论

  1. 不得不说,很烂的思路。。
    首先
    document.getElementsByTagName(“a”).onclick = function(){
    this.style.backgroundColor = “red”;
    }
    就是错误的代码,getElementsByTagName获取的是DOM节点集合,这不是jQuery对象,哪能直接全部绑定事件。
    改下你的代码
    var menu = document.getElementById(“menu”);
    var menuA = menu.getElementsByTagName(“a”);
    for ( var i = 0; i<menuA.length; i++ ) {
    menuA[i].onclick=function(e){
    this.style.background="red";
    return false;
    }
    }

    • @QiQiBoY 嗯。我也在摸索中哈。感谢提示。那段代码本来就是错的,关于这个效果的实现你有什么更好的方法还请指教呀!

  2. 其实这个时候最合适的不是js处理,而是后台直接把相关class参数传过去,因为页面有刷新的机会何不让后台代码直接搞定呢~

  3. 呵呵,看来有很多人都关心你,找到工作了。继续忙吧。有很多烦心事就要来了。在北京闯荡,不容易。

发表评论

电子邮件地址不会被公开。 必填项已用 * 标注

*

您可以使用这些 HTML 标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

注意: 评论者允许使用'@user空格'的方式将自己的评论通知另外评论者。例如, ABC是本文的评论者之一,则使用'@ABC '(不包括单引号)将会自动将您的评论发送给ABC。使用'@all ',将会将评论发送给之前所有其它评论者。请务必注意user必须和评论者名相匹配(大小写一致)。