日期:2014-05-17  浏览次数:20552 次

js+css实现的简易弹出式菜单(第二版模仿ibm开发中心的菜单)

下面是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].