json+pop窗体实现的无限菜单(网上的代码改进)

从后台代码直接返回json对象就可以显示成菜单了
<HTML>
<HEAD>
<style>
body,td{
font-size:9pt;margin:0;overflow:hidden;border:0;
}
.PopMenuOutset{border:1px solid;border-color: buttonface threeddarkshadow threeddarkshadow buttonface;FILTER: progid:DXImageTransform.Microsoft.Shadow(direction=135,color=buttonshadow,strength=3); }
.PopMenuInset{border:1px solid;border-color: buttonhighlight buttonshadow buttonshadow buttonhighlight;}
.PopMenu{background-color: buttonface;}
.PopMenuItem{height:18px;cursor:default;}
.PopMenuItemOver{height:18px;background-color: highlight;color:highlighttext;cursor:default;}
.PopMenuItemOver img{height:18px;background-color: highlight;color:highlighttext;cursor:default;}
</style>

<SCRIPT LANGUAGE="JScript">

var Menu={
MenuItem:[
{
id:1,
title:"menu1",
MenuItem:[
{id:11,title:"menu11"},{id:12,title:"menu12",MenuItem:[{id:121,title:"menu121"}]}
]
},
{
id:2,
title:"menu2"
},
{
id:3,
title:"menu3"
}
]
}


// 当前展开的菜单项
var preObj = null;

// 创建当前窗体(可以是IE窗体也可以是Popup窗体)的Popup对象
// 这个Popup对象就是用来存储子菜单数据的
var oPopup = document.parentWindow.createPopup();


// 鼠标经过菜单项
function ItemOver(obj)
{
// 隐藏已经打开的菜单项
if (preObj != null)
{
if (preObj == obj)
return;
oPopup.hide();

// 要清空原Popup中的数据——document.write()方法是接着原来的内容往里面写,所以如果不清空会出现重复数据
oPopup = document.parentWindow.createPopup();

// 恢复前一个菜单项的状态
ItemNormal(preObj);
preObj = null;
}

if (obj.cells(2).children.length > 0) //有子菜单
{
// 根据子菜单xml数据和当前xsl文档生成HTML
var sHtml = document.documentElement.outerHTML;

sHtml=sHtml.replace(/<TABLE class(=+[\s\S]*)<\/TD><\/TR><\/TBODY><\/TABLE><\/TD><\/TR><\/TBODY><\/TABLE><\/TD><\/TR><\/TBODY><\/TABLE>/ig,'');

sHtml=sHtml.replace(/document.write\(ShowMenu\(([^\(]*)\)\)/,'document.write(ShowMenu("'+obj.cells(1).id+'"))');

oPopup.document.write(sHtml);

// 计算popup内容的实际宽度高度
oPopup.show(0, 0, 1, 1, document.body);
var width = oPopup.document.body.scrollWidth;
var height = oPopup.document.body.scrollHeight;
oPopup.hide();

// 显示菜单
oPopup.show(obj.offsetWidth, 0, width, height, document.body);

preObj = obj;
obj.cells(2).children(0).src = "images/ArrowRHighlight.gif";
}
obj.className='PopMenuItemOver';
}

function ItemClick(obj)
{
ItemOver(obj);
}


// 鼠标移出菜单项
function ItemOut(obj)
{
if (oPopup.isOpen && preObj == obj) // 如果子菜单被打开则跳过
return;
ItemNormal(obj);
}

// 恢复到菜单项的默认状态
function ItemNormal(obj)
{
obj.className='PopMenuItem';
if (obj.cells(2).children.length > 0)
{
obj.cells(2).children(0).src = "images/ArrowR.gif";
}
}


function ShowMenu(id){

var shtml="";
shtml+="<table id=popupmenu border='0' cellpadding='0' cellspacing='0' width='110' class='PopMenuOutset' >";
shtml+="<tr><td><table border='0' cellpadding='1' cellspacing='0' width='100%' class='PopMenuInset'>";
shtml+="<tr><td class='PopMenu'><table border='0' cellpadding='0' cellspacing='0' width='100%' onselectstart='return false;'>";

for (var i=0; i< eval(id+".length");i++){

shtml+="<tr height=18 οnmοuseοver='ItemOver(this)' οnmοuseοut='ItemOut(this)' οnclick='ItemClick(this)' >";
shtml+="<td width='17' align='center'><IMG SRC='images/dot1.gif' WIDTH='6' HEIGHT='6' BORDER='0' ALT=''/></td>";

shtml+="<td id='"+id+"["+i+"].MenuItem'>"+eval(id+"["+i+"].title")+"</td>";


shtml+="<td width='20' align='right' valign='top' style='padding-right: 6px; padding-top:4px;'>";

if (eval(id+"["+i+"].MenuItem")!=null)
shtml+="<img src='images/arrowR.gif'/>";

shtml+="</td></tr>";
}

shtml+="</table></td></tr></table></td></tr></table>";

return shtml;

}


</SCRIPT>

</head>

<body>
<script>document.write(ShowMenu("Menu.MenuItem"));</script>
</body>

</html>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值