菜单系统在桌面应用中应该不是什么很稀奇的东西,每种开发语言都提供了很成熟的的菜单系统,比如VB,DelPhi等等,我们只要直接调用就可以了。但在B/S开发中,情况就不是那么单纯了,HTML标记语言并没有給我们提供一个直接可以调用的菜单标签,所以,利用JS来编写自己的菜单系统就成了大多数Web应用开发者的所选途径了。
目前已经有很多形形色色的各种JS开发的页面菜单系统可以供我们免费下载使用了,但论功能,笔者个人觉得还是JSCookMenu最强(不同意的可别砸我板砖哦:) )。
JSCookMenu的作者是一个在美的中国留学生---袁衡。中国人发起的开源项目不多,能被广泛使用的就更少了,这也是当初吸引我的一个地方。
JSCookMenu目前最新的版本是2.0.3,大家可以到其站点http://jscook.yuanheng.org下载最新版本。以下主要介绍其用法。
首先,先下载其最新版本的Core代码,将其解压后,得到两个JS文件:JSCookMenu.js 和 effect.js,再下载其皮肤文件,JSCookMenu目前提供三种皮肤样式:ThemeGray,ThemeOffice2003,ThemePanel,将其下载后,解压。
下面以ThemeOffice2003为例,编写我们的测试页面,其源码如下:
<html> <head> <script type="text/javascript" src="jscookmenu-2.0.3/JSCookMenu.js"></script> <script type="text/javascript" src="jscookmenu-2.0.3/effect.js"></script> <link rel="stylesheet" href="ThemeOffice2003/theme.css" type="text/css"> <script type="text/javascript" src="ThemeOffice2003/theme.js"></script> <script type="text/javascript"> var myMenu = [ ['<img src="images/cut.small.png" />','首页1','http://www.sohu.com','_self',null], [null,'首页2','http://www.sina.com','_self',null, ['<img src="images/cross.gif" />','一级1','http://www.sina.com','_self',null, [null,'一级2','http://www.sina.com','_self',null] ] ], _cmSplit, [null,'首页3','http://www.sina.com','_self',null] ]; </script> </head> <body> <div id="myMenuID"></div> <script type="text/javascript"> cmDraw ('myMenuID', myMenu, 'vbr', cmThemeOffice2003); </script> </body> </html> |
怎么样,是不是看到一个漂亮的菜单了:)。
以下着重介绍一下cmDraw 这个函数,这个函数也是所有实现的入口,其构造方法是:
cmDraw (id, menu, orient, nodeProperties, prefix)
id:描述菜单的Array对象,
menu :画菜单的区域,对应例子中的<div>myMenuID.
orient :菜单的排列方向,其参数值可以为:hbr(横排向下靠右),hbl(横排向下靠左),hur(横排向上靠右),hul(横排向上靠左),vbr(竖排向下靠右),vbl(竖排向下靠左),vur,vul
nodeProperties :节点的外观属性,这个属性一般定义在theme.js文件中,必须与你应用的theme中的变量是一致的。
prefix 样式的前缀。默认为'',可以不用管。
值得一提的是,如果你使用的是themeoffice2003的样式,必须修改theme.js这个文件中的cmThemeOffice2003Base这个变量,这个变量标记的是菜单样式中所用的图片文件所在的路径,如果配置不合适,图片是无法很好显示的。
以上介绍了JSCookMenu的一般应用,除此之外,JSCookMenu还可以在菜单中集成动作,实现一些很Cool了的特性,下面再給一个例子:
<html> <head> <script type="text/javascript" src="jscookmenu-2.0.3/JSCookMenu.js"></script> <script type="text/javascript" src="jscookmenu-2.0.3/effect.js"></script> <link rel="stylesheet" href="ThemeOffice2003/theme.css" type="text/css"> <script type="text/javascript" src="ThemeOffice2003/theme.js"></script> </head> <body>
<STYLE><!-- tr.Palette { height: 15px } td.Palette { width: 15px; border: 2px solid white; padding: 0; } td.PaletteHover { width: 15px; border: 2px solid blue; padding: 0; } --></STYLE> <SCRIPT LANGUAGE="JavaScript"><!-- function overPalette (obj) { obj.className = "PaletteHover"; } function outPalette (obj) { obj.className = "Palette"; } function clickPalette (obj) { document.bgColor = obj.bgColor; } --></SCRIPT> <DIV ID=PaletteMenu></DIV> <SCRIPT LANGUAGE="JavaScript"><!-- var paletteMenu = [ [null, 'File', null, null, null, [null, 'Open', null, null, null], [null, 'Save', null, null, null] ], [null, 'Palette', null, null, null, [null, 'Options', null, null, null], _cmSplit, [_cmNoAction, '<td class="ThemeOfficeMenuItemLeft"><td colspan="2"><table summary="" border="0" cellpadding="0" cellspacing="2" style="cursor: default">' + '<tr class="Palette">' + '<td οnmοuseοver="overPalette (this)" οnmοuseοut="outPalette (this)" οnclick="clickPalette (this)" class="Palette" bgcolor="#000000"> </td>' + '<td οnmοuseοver="overPalette (this)" οnmοuseοut="outPalette (this)" οnclick="clickPalette (this)" class="Palette" bgcolor="#00007F"> </td>' + '<td οnmοuseοver="overPalette (this)" οnmοuseοut="outPalette (this)" οnclick="clickPalette (this)" class="Palette" bgcolor="#007F00"> </td>' + '<td οnmοuseοver="overPalette (this)" οnmοuseοut="outPalette (this)" οnclick="clickPalette (this)" class="Palette" bgcolor="#007F7F"> </td>' + '<td οnmοuseοver="overPalette (this)" οnmοuseοut="outPalette (this)" οnclick="clickPalette (this)" class="Palette" bgcolor="#7F0000"> </td>' + '<td οnmοuseοver="overPalette (this)" οnmοuseοut="outPalette (this)" οnclick="clickPalette (this)" class="Palette" bgcolor="#7F007F"> </td>' + '<td οnmοuseοver="overPalette (this)" οnmοuseοut="outPalette (this)" οnclick="clickPalette (this)" class="Palette" bgcolor="#7F7F00"> </td>' + '<td οnmοuseοver="overPalette (this)" οnmοuseοut="outPalette (this)" οnclick="clickPalette (this)" class="Palette" bgcolor="#7F7F7F"> </td>' + '</tr>' + '<tr class="Palette">' + '<td οnmοuseοver="overPalette (this)" οnmοuseοut="outPalette (this)" οnclick="clickPalette (this)" class="Palette" bgcolor="#CCCCCC"> </td>' + '<td οnmοuseοver="overPalette (this)" οnmοuseοut="outPalette (this)" οnclick="clickPalette (this)" class="Palette" bgcolor="#0000FF"> </td>' + '<td οnmοuseοver="overPalette (this)" οnmοuseοut="outPalette (this)" οnclick="clickPalette (this)" class="Palette" bgcolor="#00FF00"> </td>' + '<td οnmοuseοver="overPalette (this)" οnmοuseοut="outPalette (this)" οnclick="clickPalette (this)" class="Palette" bgcolor="#00FFFF"> </td>' + '<td οnmοuseοver="overPalette (this)" οnmοuseοut="outPalette (this)" οnclick="clickPalette (this)" class="Palette" bgcolor="#FF0000"> </td>' + '<td οnmοuseοver="overPalette (this)" οnmοuseοut="outPalette (this)" οnclick="clickPalette (this)" class="Palette" bgcolor="#FF00FF"> </td>' + '<td οnmοuseοver="overPalette (this)" οnmοuseοut="outPalette (this)" οnclick="clickPalette (this)" class="Palette" bgcolor="#FFFF00"> </td>' + '<td οnmοuseοver="overPalette (this)" οnmοuseοut="outPalette (this)" οnclick="clickPalette (this)" class="Palette" bgcolor="#FFFFFF"> </td>' + '</tr>' + '</table>'] ] ]; cmDraw ('PaletteMenu', paletteMenu, 'hbr', cmThemeOffice2003); --></SCRIPT> </body> </html> |
下面就是运行后的效果:
怎么样,是不是很Cool :)。实现以上效果的主要是将节点声明为:_cmNoAction
以上只介绍了JSCookMenu的两种使用方法,如果大家感兴趣的话,可以到其站点,那里有更加详细的示例。