标记了所有的菜单名称(包括子菜单),只要用ASP语言并结合Script脚本动态地控制相应的菜单选项显示或隐藏,即可实现折叠菜单。
现在的问题是如何在程序中加入菜单项名称,当然可以在网页中直接加入,但是如果改变菜单选项时,必须重新改动网页的控制代码,这种办法显然不够明智。本文采用的是将所有的菜单选项名称按一定格式另外存放在一个
文本文件中,在网页载入时,ASP代码自动读取其内容,这样如果改变菜单选项,只要在此文件中作相应改动即可。
关于文件操作,我们用ASP内置的文件存取组件来完成,具体的用法见文后的程序代码。
菜单文本文件 本文约定菜单文本文件内容必须遵循以下规则:描述一个菜单选项的名称必须有三行内容(见下例);文件中不允许有空行;菜单选项名称前可以有空格,但必须用空格键(space)形成,不能用Tab键;文件的结尾用两行“*END*”来完成。
假设有如下的三级菜单:
操作
系统软件
计算机软件---- 应用系统软件
工具软件----- PC TOOLS
CuteFTP
在菜单文本中应为如下格式:
1------表示第1个主菜单名
计算机软件-------- 菜单名称(以下同)
3 若不为0,指定本菜单的子菜单个数;本例为3个
1*1 表示第1个主菜单的第1个子菜单(必须用*号)
操作系统软件
0
http://… --------- 若为0,表示该菜单项没有子菜单,后跟超链接URL
1*2---------- 表示第1个主菜单的第2个子菜单(以下同)
应用系统软件
0 http://…
1*3
工具软件
2
1*3*1-------- 第1个主菜单中第3个子菜单的第1个子菜单
PC TOOLS
0
http://… 程序代码:
用ASP在网页中实现折叠式菜单示例
<% '----| 计算菜单id中的*个数 |-----
Function spnum(str)
dim tmpstr,m,t
tmpstr=str
m=InStr(str,"*")
t=0
While m<>0
t=t+1
tmpstr=Mid(tmpstr,m+1)
m=InStr(tmpstr,"*")
Wend
spnum=t
End Function
'-----| 向浏览器送出一个菜单选项 |-----
Sub output_line(ct_flag,curid,txtname,ct,txtcolor)
dim ptl,sp,dispval,tspace
sp=spnum(curid)
dispval="none"
If sp=0 Then dispval=""
tspace=""
While sp>0
tspace=tspace+" "
sp=sp-1
Wend
If ct_flag=1 Then '该级菜单有子菜单,只用
标记
ptl="
ptl=ptl+" ct:"+ct+"; line-height:25px;"
ptl=ptl+" cursor:hand;"
ptl=ptl+" display:"+dispval+chr(34)
ptl=ptl+" onclick="+chr(34)+"disp_sub_menu('"+curid+"')"+chr(34)
ptl=ptl+">"+tspace+txtname+"
"+chr(13)
Else '该级菜单是最低层菜单,用
和
标记
ptl=" ptl=ptl+"line-height:25px; color:"+txtcolor+"; ct:0"+chr(34)+">"
ptl=ptl+tspace+"
"+txtname+" "+chr(13)
End If
response.write ptl
End Sub
'----| 主控过程 |-----
dim curid,txtname,ct,ct_flag,txtcolor
set fs=createobject("SCRIPTING.FILESYSTEMOBJECT")
menufile=replace(request.servervariables("path_translated"),"menu.asp","mfile.txt")
set txtstr=fs.opentextfile(menufile)
curid=txtstr.readline
While curid<>"*END*"
curid="y"+Trim(curid) '形成当前菜单项的id
txtname=Trim(txtstr.readline) '读取菜单名称
ct=Trim(txtstr.readline) '读取该项菜单的子菜单个数
ct_flag=1
If Mid(ct,1,1)="0" Then
ct_flag=0
ct=LTrim(Mid(ct,2))
End If
txtcolor="black"
Select case spnum(curid)
case 1
txtcolor="red" '一级子菜单颜色
case 2
txtcolor="green" '二级子菜单颜色
case 3
txtcolor="blue" '三级子菜单颜色,可继续增加
End Select
output_line ct_flag,curid,txtname,ct,cstr(txtcolor)
curid=txtstr.readline
Wend
txtstr.close
%>
本代码在Win98/PWS(Personal Web Server)下通过。