日期:2014-05-17 浏览次数:20744 次
下面是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].