87,915
社区成员
发帖
与我相关
我的任务
分享
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>简易下拉菜单</title>
<style type="text/css">
*{
font-size:12px;
}
/* 菜单容器 */
.menuFrame{
position:absolute;
}
/* 闭合菜单 */
.menuTag{
float:left;
cursor:pointer;
width:100px;
height:18px;
margin:0px 0px 0px 0px;
padding:1px 0px 1px 0px;
border: 1px solid #EEE8DD;
background-color:#F5F5F5;
text-align:center;
line-height: 150%;
color:#999999;
}
/* 打开菜单 */
.menuTagOpen{
float:left;
cursor:pointer;
width:100px;
height:auto;
margin:0px 0px 0px 0px;
padding:1px 0px 1px 0px;
border: 1px solid #EEE8DD;
background-color:#FFFFCC;
text-align:center;
line-height: 150%;
color:#0099FF;
filter:alpha(opacity=80);
-moz-opacity:0.8;
}
/* 子菜单 */
.menuItems{
cursor:pointer;
visibility:hidden;
height:0px;
text-align:left;
padding:0px 3px 0px 3px;
}
/* 二级菜单 */
.menuItemTag{
cursor:pointer;
visibility:hidden;
height:18px;
text-align:left;
padding:0px 3px 0px 3px;
}
.menuItemTagOpen{
cursor:pointer;
visibility:hidden;
height:auto;
text-align:left;
padding:0px 3px 0px 3px;
color:#000000;
}
</style>
<script type="text/javascript">
//代码看起来很痛苦,但是在Firefox上一次通过,爽!慢慢就习惯了。
//Class MenuEvent
function MenuEvent(){
this._Args = arguments;
}
MenuEvent.prototype = {
//遍历
_TraversalBindEvent:function(closeStyle,openStyle){
for(var i = 0; i<this._Args.length; i++){
var menuObj = this._GetElement(this._Args[i])
menuObj.onmouseover = this._BindEvent(menuObj,"onmouseover",closeStyle,openStyle);
menuObj.onmouseout = this._BindEvent(menuObj,"onmouseout",closeStyle,openStyle);
//偏移,让两个Div的边框重叠
if(i>0){menuObj.style.margin = "0 0 0 -1";}
}
},
//获取对象
_GetElement:function(elementID){
var menuObj = window.document.getElementById(elementID);
if(!menuObj || menuObj.tagName.toLowerCase()!="div")
{
throw "主菜单对象中至少有一个是非法对象!";
}
return menuObj;
},
//绑定事件
_BindEvent:function(menuObj,onmouse,closeStyle,openStyle){
var obj = this;
switch(onmouse){
case "onmouseover":
return function(){
obj._onMouseOverModel(menuObj,openStyle);
}
break;
case "onmouseout":
return function(){
obj._onMouseOutModel(menuObj,closeStyle)
}
break;
}
},
//事件模型
_onMouseOverModel:function(menuObj,openStyle){
//切换样式,打开菜单
menuObj.className = openStyle;
//子对象链带事件
this._ChildBindEvent(menuObj,"onmouseover");
},
//事件模型
_onMouseOutModel:function(menuObj,closeStyle){
//切换样式,关闭菜单
menuObj.className = closeStyle;
//子对象链带事件
this._ChildBindEvent(menuObj,"onmouseout");
},
//子对象跟随父对象的事件(这里并不是子对象自身触发的事件,而是父对象的事件连带触发的事件,这里还可以继续扩展子对象的样式)
_ChildBindEvent:function(menuObj,onmouse){
for(var i=0; i<menuObj.childNodes.length; i++){
var menuItemObj = menuObj.childNodes[i];
//避免非对象 和 非文档标签对象
if( !menuItemObj || !menuItemObj.tagName ){
continue;
}
//避免非div标签
if( menuItemObj.tagName.toLowerCase()!="div" ){
continue;
}
//通过父对象过滤孙子
if( menuItemObj.parentNode.id != menuObj.id ){
continue;
}
switch(onmouse){
case "onmouseover":
menuItemObj.style.height = "auto";
menuItemObj.style.visibility = "visible";
break;
case "onmouseout":
menuItemObj.style.height = "0px";
menuItemObj.style.visibility = "hidden";
break;
}
}
}
}
//Class MenuEvent - OVER
//入口程序
window.onload = function(){
//JavaScript调试最痛苦,用try语句是一个非常非常妙的调试手段,不用不知道。^_^ 用了就知道,一般人我不告诉他。
try{
//一级菜单
new MenuEvent("menuTag1","menuTag2","menuTag3")._TraversalBindEvent("menuTag","menuTagOpen");
//二级菜单
new MenuEvent("menuTag1_1")._TraversalBindEvent("menuItemTag","menuItemTagOpen");//下面两个也可以写到这句一起,都是面向对象。
//三级菜单
new MenuEvent("menuTag1_1_2","menuTag1_1_2_1")._TraversalBindEvent("menuItemTag","menuItemTagOpen");//这里方便CSS高手改进
}catch(error){
alert(error);
}
}
</script>
</head>
<body>
<div class="menuFrame">
<div id="menuTag1" class="menuTag">
一级菜单1
<div id="menuTag1_1" class="menuItems">
二级菜单↓
<div class="menuItems"> 三级菜单</div>
<div id="menuTag1_1_2" class="menuItems">
三级菜单↓
<div id="menuTag1_1_2_1" class="menuItems">
四级菜单↓
<div class="menuItems"> 五级菜单</div>
</div>
</div>
</div>
<div class="menuItems">二级菜单</div>
<div class="menuItems">二级菜单</div>
<div class="menuItems">二级菜单</div>
<div class="menuItems">二级菜单</div>
<div class="menuItems">二级菜单</div>
<div class="menuItems">二级菜单</div>
<div class="menuItems">二级菜单</div>
<div class="menuItems">二级菜单</div>
<div class="menuItems">二级菜单</div>
</div>
<div id="menuTag2" class="menuTag">
一级菜单2
<div class="menuItems">二级菜单</div>
<div class="menuItems">二级菜单</div>
<div class="menuItems">二级菜单</div>
<div class="menuItems">二级菜单</div>
<div class="menuItems">二级菜单</div>
</div>
<div id="menuTag3" class="menuTag">
一级菜单3
<div class="menuItems">二级菜单</div>
<div class="menuItems">二级菜单</div>
<div class="menuItems">二级菜单</div>
<div class="menuItems">二级菜单</div>
<div class="menuItems">二级菜单</div>
</div>
</div>
<br/>
<br/>
测试内容<br/>
1<br/>
2<br/>
3<br/>
4<br/>
5<br/>
</body>
</html>
<!--张郎:http://feb-.blog.163.com/-->
window.onunload = function()
{
var tags = document.getElementsByTagName("*");//获取全部标签
for(var i=0,l=tags.length;i<l;i++)//遍历全部标签 优化了for循环
for(var o in tags[i])//遍历全部属性
if(o.indexOf("on")==0)//判断属性是否以"on"开头 是否是事件柄
tags[i][o] = null;//清除事件柄的内容
}