Sub InitDyItemStr( s ) gDyItemName = StrHead(s, "=") gDyItemTitle = StrHead(s, ",") gDyItemLink = s End Sub % > 这里调用了一个StrHead函数,这个函数也是出自本人之手,在处理字符串时十分有用,是我在编程时使用频率最高的函数之一。另外为了方更地在程序中输出引号,就写了一个专门在字符串两端加上引号的函数,因为在编写ASP程序时常常要调用这两个函数,所以我单独把他们放在一个文件中,在要使用时把这个文件包含进行就可以了,下面就是这个文件:
文件名:Str.inc <% '在第一次遇参数c的位置载取ss '返回载取的前半载,ss中保留后半载 '当ss中不包含c时,相当于从ss的最后载取 Public Function StrHead(ss, c) i = InStr(ss, c) If i > 0 Then StrHead = Mid(ss, 1, i - 1) ss = Mid(ss, i + Len(c)) Else StrHead = ss ss = "" End If End Function ' 在s 的 两 端 加 上 引 号 返 回 Public Function YH(s) YH = Chr(34) & s & Chr(34) End Function % > 在响应OnChick事件时,为书写简单,可以先写成一个JavaScript函数,以备调用(注意:这里的JavaScript函数是在浏览器上执行的,一定要与服务器端执行的代码区分开来):
< % curDyItemIndex=0 Function DyItemId() DyItemId="dy" & curDyItemIndex End Function % > 有了这些准备工作,最后的输出就不难了,提炼一下我们要完成的任务,就在从LsTest.ini文件中读取数据,输出如LsTest.htm文件中的格式数据。由于数据是树状的,所以很自然地会使用上函数的递归,请看下面实现的主体函数:
Sub ListItems(proPath,ItemName,Disp) '建立并初始化ProFile对象 Set ItemProf = Server.CreateObject("vbProFile.ProFile") ItemProf.FileName = proPath
'开始一个DIV对象,包含所有的子条目在其中 Response.Write "< Div Id=" & YH(DyItemId) & _ " Style=display:" & Disp & " >< ul >" & vbCrLf
'开始输出每一个子条目 buf = ItemProf.FirstValue(ItemName) Do While Len(buf) > 0 InitDyItemStr buf If Len(gDyItemLink) > 0 then Response.Write "< li >< a href= " & YH(gDyItemLink) & " >" & _ gDyItemTitle & "< /a >" & vbCrLf Else '如果链接地址为空,则开始下一层的列表 curDyItemIndex = curDyItemIndex + 1 Response.Write "< li > < a href=" & YH("#") & _ " onclick=" & YH("return OnClickDiv ('" & DyItemId & "')") & _ ") >" & gDyItemTitle & "< /a >" & vbCrLf ListItems proPath,gDyItemName,"none" '使用递归 End If
buf=ItemProf.NextValue() Loop
'结束定义的DIV对象 Response.Write "< /ul >< /div >" & vbCrLf End Sub 最后为了调用方便,再定义一个对外的接口函数: Public Sub DyList(proName,rootItem) '将逻辑路径映射成物理路径 proPath=Server.mappath(proName) curDyItemIndex = curDyItemIndex + 1 ListItems proPath,rootItem,"" End Sub 把上面这些片段保存到一个文件中,文件名就叫dyList.inc吧,我们就算大功告成了,你是不是想马上看看效果呢?用下面这个ASP文件来做一下实验,瞧瞧你是否满意?