日期:2014-05-17 浏览次数:20598 次
下面是html代码,包括了css和js及测试的html标签,在ie6和ff3下测试通过,附详细注释以及源文件下载
<!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> <TITLE> New Document </TITLE> <META NAME="Generator" CONTENT="EditPlus"> <META NAME="Author" CONTENT=""> <META NAME="Keywords" CONTENT=""> <META NAME="Description" CONTENT=""> <style type="text/css"> body { font-size: 14px; } .hrtc_popupmenu,.hrtc_popupmenu ul { margin: 0; padding: 0; list-style: none;/*取消列表样式*/ } /*顶层链接样式*/ .hrtc_popupmenu a{ display: block;/*使a链接可以撑满父标签,这样空白处也会响应事件*/ /*word-break:break-all; 文本过长自动换行*/ text-decoration: none; color: #293D6B; background: #C3D3E0; text-align:center; width: 120px;/*顶层链接宽度*/ font-weight: bold; } /*下层链接样式*/ .hrtc_popupmenu ul li a{ display: block;/*使a链接可以撑满父标签,这样空白处也会响应事件*/ /*border:1px solid black;*/ /*word-break:break-all; 文本过长自动换行*/ text-decoration: none; text-align:left; width: 190px;/*下层链接宽度*/ padding-left: 10px; } .hrtc_popupmenu a:hover{ background-color: #98B1C4; } .hrtc_popupmenu li { float:left;/*设为浮动使得第一层菜单可以水平展开*/ margin: 0; padding: 0; line-height: 20px;/*为了计算方便不设置padding属性,因此设置了该属性来控制间距*/ position: relative; z-index: 1; } .hrtc_popupmenu li ul { display:none;/*隐藏子菜单*/ position: absolute;/*设为绝对位置,不会影响父元素布局*/ z-index: 100;/*最大允许zindex*/ border:1px solid #98B1C4; } .hrtc_popupmenu li ul li { clear: left;/*下级菜单换行*/ } .hrtc_popupmenu li ul li ul{ top:0px;/*弹出式菜单偏移量*/ } </style> <SCRIPT LANGUAGE="JavaScript"> <!-- /* 该例子只是为了演示,直接创建了对象*/ var hrtc_popupmenu = { /** 返回父节点下和某个路径匹配的元素集合 @pNode 父节点 @path 例如li>a 和 xpath类似 */ selectNodes:function(pNode,path){ var nodesRes = [pNode]; var strs = path.toUpperCase().split(">"); for(var i = 0;i < strs.length;i++){ var nodesResT = []; for(j = 0;j < nodesRes.length;j++){ nodesResT = nodesResT.concat(this.searchNodes(nodesRes[j],strs[i])); } nodesRes = nodesResT; if(nodesRes.length == 0){ break; } } return nodesRes; } , /** 搜索父节点下和某个标签匹配的元素集合 @pNode 父节点 @tagName 标签名 */ searchNodes:function(pNode,tagName){ var nodesRes = []; var nodes = pNode.childNodes; for(var i = 0;i < nodes.length;i++){ if(nodes[i].nodeType == "1"){ if(tagName == "*" || nodes[i].tagName == tagName){ nodesRes.push(nodes[i]); } } } return nodesRes; } , /** 返回父节点下第一个和某个路径匹配的元素 @pNode 父节点 @path 例如li>a 和 xpath类似 */ selectNode:function(pNode,path){ var strs = path.toUpperCase().split(">"); var node = pNode; for(var i = 0;i < strs.length;i++){ node = this.searchNode(node,strs[i]); if(!node){ break; } } return node; } , /** 搜索父节点下和第一个某个标签匹配的元素 @pNode 父节点 @tagName 标签名 */ searchNode:function(pNode,tagName){ var nodes = pNode.childNodes; for(var i = 0;i < nodes.length;i++){ if(nodes[i].nodeType == "1"){ if(nodes[i].tagName == tagName){ return nodes[i]; } } } } , doOnMouseOver:function(eleUL){ eleUL.style.display = "block"; } , doOnMouseOut:function(eleUL){ eleUL.style.display = "none"; } , /** 绑定事件,为了兼容ie和ff @obj 要绑定事件的元素名 @event 事件名 @handler 处理事件 */ bindEvent:function(obj,event,handler){ if(document.all){ obj.attachEvent("on"+event,handler); }else{ obj.addEventListener(event,handler,false); } } , /** 遍历菜单树 @pNode 结点 @left 样式,左边偏移位置 */ traver:function(pNode,left){ //绑定事件和属性 if(pNode.nodeType == "1" && pNode.tagName == "UL"){ var nodesUL = this.selectNodes(pNode,"li>ul"); for(var i = 0;i < nodesUL.length;i++){ var objLi = nodesUL[i].