其实实现并不难。废话不说,先看效果图:
(点击“更多功能”按钮,出现下拉菜单,这样就能把一些菜单按钮放到这里,使可视页面不会很拥挤)
(在当前页面的任何位置鼠标右键,弹出菜单选项)
现在看看这样通过Extjs实现:
1 <script language="javascript"> 2 var menu = new Ext.menu.Menu(); 3 menu.add({id: 'menu1',text:'上笔',handler:prevBill,iconCls:'icon-prev'}); 4 menu.add({id: 'menu2',text:'下笔',handler:nextBill,iconCls:'icon-next'}); 5 menu.add({id: 'menu3',text:'增加(F2)',handler:addBill,iconCls:'icon-add'}); 6 menu.add({id: 'menu4',text:'查找(F3)',handler:productFind,iconCls:'icon-search'}); 7 menu.add({id: 'menu5',text:'导入',handler:pdInput,iconCls:'icon-add-row'}); 8 menu.add({id: 'menu6',text:'导出',handler:xslquery,iconCls:'icon-add-row'}); 9 menu.add({id: 'menu7',text:'条码(F7)',handler:txmInput,iconCls:'icon-add-row'}); 10 menu.add({id: 'menu8',text:'整单折扣修改',handler:bathnewDiscount,iconCls:'icon-add-row'}); 11 12 function showMenus(el){ 13 menu.show(el); 14 } 15 16 //鼠标右键菜单 17 Ext.onReady(function(){ 18 //禁止整个页面的右键 19 Ext.getDoc().on("contextmenu", function(e){ 20 e.stopEvent(); 21 }); 22 //注册右键 23 Ext.getBody().on("contextmenu",function(e){ 24 menu.showAt(e.getPoint()); //显示在当前位置 25 }); 26 }); 27 28 </script>
是不是很简单,接下来要说下怎样加入系统的权限判断,思路是这样的,当它没有浏览该菜单项的权限时,我们就不把它加入到menu中,也就是说“menu.add({id: 'XX',text:'XX',handler:XX,iconCls:'XX'});”语句不产生。系统里,用的是自定义jsp标签,然后再java服务端一个一个按钮判断权限,有浏览权限时就加上该js语句,实现过程有:
1.先自定义一个按钮,比如我用一个标志区别于其他的按钮,加入到要产生加入menu时位置。如jsp加入:
<script language="javascript"> var menu = new Ext.menu.Menu(); <sws:Button icon='icon-prev' name="menu1" moremenu="true" hotkey="37" onclick="prevBill" value="上笔"/> <sws:Button icon='icon-next' name="menu2" moremenu="true" hotkey="39" onclick="nextBill" value="下笔"/> <sws:Button icon='icon-search' name="menu3" hotkey="F3,114" moremenu="true" onclick="productFind" value="查找"/> <sws:Button icon='icon-add-row' invoke="isDbinEdit" name="menu4" moremenu="true" onclick="pdInput" value="导入"/> <sws:Button icon='icon-add-row' invoke="isDbinEdit" name="menu5" moremenu="true" onclick="xslquery" value="导出"/> <sws:Button icon='icon-add-row' invoke="isDbinEdit" name="menu6" hotkey="F7,118" moremenu="true" onclick="txmInput" value="条码"/> <sws:Button icon='icon-add-row' invoke="isDbinEdit" name="menu7" moremenu="true" onclick="bathnewDiscount" value="整单折扣修改"/> function showMenus(el){ menu.show(el); } //鼠标右键菜单 Ext.onReady(function(){ //禁止整个页面的右键 Ext.getDoc().on("contextmenu", function(e){ e.stopEvent(); }); //注册右键 Ext.getBody().on("contextmenu",function(e){ menu.showAt(e.getPoint()); //显示在当前位置 }); }); </script>
有看到不同了吗,是的,其中只是把本来添加菜单项的js语句用jsp的自定义标签写上,然后再解析标签,这样就能控制权限了。
2.根据jsp自定义标签的解析步骤,在tld中写的处理类中的doEndTag()方法中做处理:
比如:
if (MORE_MENU_FALSE.equalsIgnoreCase(this.getMoremenu())) {//区别于其他按钮的标志
...... } else {
results.append(" menu.add({");
results.append("id: '");
results.append(this.getName());
results.append("',");
results.append("text:'");
results.append(this.getValue());
results.append("'");
if(StringUtil.isNotBlank(this.getOnclick())){
results.append(",");
results.append("handler:");
results.append(this.getOnclick());
}
if (StringUtil.isNotBlank(this.getIcon())) {
results.append(",");
results.append("iconCls:'");
results.append(this.getIcon());
results.append("'");
}
results.append("});");
}
TagUtils.getInstance().write(pageContext, results.toString());
这样就可以按情况加入菜单项了,好了,就写到这,希望对你有所帮助。