HTML级联菜单分析及实现
2014-07-24谭朝贵
谭朝贵
摘要:该文介绍在应用系统中级联菜单基于WEB信息管理系统的级联菜单技术:多次提取菜单项和一次性提取菜单项。
关键词:HTML; 菜单; 菜单项; 提取
中图分类号:G642 文献标识码:A 文章编号:1009-3044(2014)14-3522-03
1 概述
所谓级联菜单就是上一级菜单的选择决定下一级菜单的选择。如客户端用户选择地市级公司后,县市级公司的选择就只能属于该地市级公司。在开发应用系统时,服务器一次性把数据提供给客户端,也可多次提供给客户端。
在C++和JAVA等语言中有菜单命令,实现菜单很容易,但在HTML中没有提供专用命令,因而实现起来比较困难。
2 菜单项的提取
菜单项有固定和动态之分。固定菜单易,活动菜单难。动态菜单项一般放在一个表中,需要时从表中提取。这个表至少有两个字段:菜单代码和菜单文字。在我开发的系统中有地市级公司表和县市级公司表。
3 菜单的实现
在HTML中菜单是用select语句和option语句来实现的。
3.1 菜单项多次提取的实现
每次只提取某一级的菜单项。当然下次提取的菜单要包含前面提取的菜单。例如在页面中首先显示地市级公司菜单,县市级菜单为空;选择地市级公司后提交网页,这时网页包含地市级公司菜单和县市级公司菜单。下面代码是用ASP实现二级菜单的一段完整的HTML代码。
<% ‘文件名:index.asp
Dim connstr
connstr=" Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & Server.MapPath("S_D_Ter.mdb" )
set conn=Server.CreateObject("ADODB.Connection" )
conn.Open connstr%>
function textshow(){
document.form1.show.value=document.form1.tmpid.options[document.form1.tmpid.selectedIndex].innerText+" —" +document.form1.City_select.options[document.form1.City_select.selectedIndex].innerText;
}
endprint
3.2 菜单项一次性提取的实现
一次性把所有菜单项都提交给客户端,其难点是如何组织菜单。下面一段代码实现二级菜单,菜单项存放在一个二维数组selects中。
<%Dim connstr
connstr=" Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & Server.MapPath("S_D_Ter.mdb" )
set conn=Server.CreateObject("ADODB.Connection" )
conn.Open connstr%>
<% dim sql,i,j
set rs_Province= server.createobject("adodb.recordset")
sql="select * from Province_Code order by P_Code"
rs_Province.open sql,conn,1,1%>
var selects=[]; //第一维为地市级公司代码,第二维为县市级公司代码和名称
selects['yyy']=new Array(new Option('…请选择地市级公司…','yyy'));
<%for i=1 to rs_Province.recordcount%>
selects['<%=rs_Province("P_Code")%>']=new Array(
<% set rs_City= server.createobject("adodb.recordset")
sql="select * from Region_Code where P_Code='"&rs_Province("P_Code")&"' order by R_Code"
rs_City.open sql,conn,3,2
if rs_City.recordcount>0 then
for j=1 to rs_City.recordcount
if j=rs_City.recordcount then
%>new Option('<%=trim(rs_City("R_Name"))%>','<%=trim(rs_City("R_Code"))%>'));
<%else%>
new Option('<%=trim(rs_City("R_Name"))%>','<%=trim(rs_City("R_Code"))%>'),
<%
end if
rs_City.movenext
next
else
response.write(");") %>
//new Option('','0'));
<% end if
rs_City.close
set rs_City=nothing
rs_Province.movenext
next
rs_Province.close
set rs_Province=nothing%>
function chsel(){
with (document.form1){
if(Province_select.value!="yyy") {
City_select.options.length=0;
City_select.add(selects['yyy'][0]);
for(var i=0;i City_select.add(selects[Province_select.value][i]); }}}}
<!—Province_select下拉列表—>
<!—City_select下拉列表—>
4 结束语
本文两种方法实现的菜单在开发应用系统经常用到,根据自己的开发经验第二种方法应用效果要好一些,因为一次传输就可得到所有数据,减少了在网络中传输次数和时间。
参考文献:
[1] 冯昊.ASP动态网页设计与上机指导[M].北京:清华大学出版社,2002.
[2] 孙卫琴,李洪成.Tomcat与Java Web 开发技术详解[M].北京:电子工业出版社,2004.
[3] 吴兆福,许先斌. 基于P2P的分布式多媒体服务[J].计算机应用,2005,12(25).endprint