一个简单的JS菜单

在看jquery源码时看到的一个菜单,将它改写成了JS源码。

HTML代码:

<div id="menu" class="nav">
	<span>类型一</span>
    <div class="detail">
    	<a href="#">列表一</a>
        <a href="#">列表一</a>
        <a href="#">列表一</a>
        <a href="#">列表一</a>
    </div>
    <span>类型二</span>
    <div class="detail">
    	<a href="#">列表二</a>
        <a href="#">列表二</a>
        <a href="#">列表二</a>
        <a href="#">列表二</a>
    </div>
    <span>类型三</span>
    <div class="detail">
    	<a href="#">列表三</a>
        <a href="#">列表三</a>
        <a href="#">列表三</a>
        <a href="#">列表三</a>
    </div>
    <span>类型四</span>
    <div class="detail">
    	<a href="#">列表四</a>
        <a href="#">列表四</a>
        <a href="#">列表四</a>
        <a href="#">列表四</a>
    </div>
</div>
CSS代码:
.nav{width:300px;margin:20px auto;overflow:Hidden;}
.nav span{width:300px;margin:0 0 1px;height:24px;line-height:24px;background:#333;display:block;color:#fff;}
.nav .detail{width:280px;padding:4px 10px;overflow:hidden;display:none;background:#CCC;}
.nav .block {display:block;}
.nav .active{background:#9C9;}
.detail a{color:#000;height:24px;line-height:24px;display:block;}
JS代码:
var oMenu = document.getElementById('menu');
var oSpans = getChildren(oMenu,'span');
for(var i=0;i<oSpans.length;i++){
	oSpans[i].onclick = showDiv;
}
function showDiv(){
	var oDivs = getChildren(oMenu,'div');
	var nIndex = getIndex(this);
	if(this.className.indexOf('active') == -1){
		for(i=0;i<oSpans.length;i++){
			removeClass(oSpans[i],'active');
			removeClass(oDivs[i],'block');
		}
		addClass(oSpans[nIndex],'active');
		addClass(oDivs[nIndex],'block');
	}else{
		removeClass(oSpans[nIndex],'active');
		removeClass(oDivs[nIndex],'block');
	}
}
function getChildren(ele,tagName){
	if(ele && ele.nodeType && ele.nodeType == 1){
		var a = [];
		var childNodes = ele.childNodes;
		if(arguments.length == 1){
			for(i=0;i<childNodes.length;i++){
				if(childNodes[i].nodeType == 1){
					a.push(childNodes[i]);
				}
			}
		}else if(arguments.length == 2){
			for(var j=0;j<childNodes.length;j++){
				if(childNodes[j].nodeType == 1 && childNodes[j].tagName.toUpperCase() == tagName.toUpperCase()){
					a.push(childNodes[j]);
				}
			}
		}
		return a;
	}
}
function getIndex(ele){
	if(ele && ele.nodeType && ele.nodeType == 1){
		var index = 0;
		if(ele.previousElementsibling){
			var prev = ele.previousElementsibling;
			while(prev){
				index ++;
				prev = prev.previousElementsibling;
			}
		}else{
			prev = ele.previousSibling;
			while(prev){
				if(prev.nodeType == 1){
					index ++;
				}
				prev = prev.previousSibling;
			}
		}
		return index/2;
	}
}
function addClass(ele,className){
	var reg = new RegExp('\\b'+ className +'\\b');
	if(reg.test(className)){
		ele.className += ' '+ className;
	}
}
function removeClass(ele,className){
	var reg = new RegExp('\\b'+ className +'\\b');
	if(reg.test(className)){
		ele.className = ele.className.replace(reg,'');
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值