1. var menu = (function() {
  2. var _menu = {data:{},
  3. initMenu : function() {
  4. $.jstree.defaults.core.themes.variant = "large";
  5. $.jstree.defaults.core.themes.responsive = true;
  6. $.jstree.defaults.sort=function(a,b){
  7. return this.get_node(a).original.order > this.get_node(b).original.order ? 1 : -1;
  8. }
  9. var jsTree = $('#tree_1').jstree(
  10. {
  11. 'core' : {
  12. 'data' :{
  13. 'url':$.hr_contextUrl()+"menu/list",
  14. 'data':function(node){
  15. return node;
  16. }
  17. }
  18. },
  19. 'plugins':['contextmenu','sort'],
  20. "contextmenu":{
  21. "items":{
  22. "create":null,
  23. "rename":null,
  24. "remove":null,
  25. "ccp":null,
  26. "新建菜单":{
  27. "label":"新建菜单",
  28. "action":function(data){
  29. var node = _menu.data.jsTree.jstree('get_node',data.reference[0])
  30. var pid = node.parent;
  31. _menu.operation.addMenu(pid,node);
  32. }
  33. },
  34. "删除菜单":{
  35. "label":"删除菜单",
  36. "action":function(data){
  37. var node = _menu.data.jsTree.jstree('get_node',data.reference[0]);
  38. _menu.operation.delMenu(node);
  39. }
  40. },
  41. "修改菜单":{
  42. "label":"修改菜单",
  43. "action":function(data){
  44. var node = _menu.data.jsTree.jstree('get_node',data.reference[0]).original;
  45. _menu.operation.editMenu(node);
  46. }
  47. },
  48. "上移菜单":{
  49. "label":"上移菜单",
  50. "action":function(data){
  51. var node = _menu.data.jsTree.jstree('get_node',data.reference[0]);
  52. var prev_dom = $(data.reference[0]).closest("li").prev();
  53. _menu.operation.sortMenu(node,prev_dom);
  54. }
  55. },
  56. "下移菜单":{
  57. "label":"下移菜单",
  58. "action":function(data){
  59. var node = _menu.data.jsTree.jstree('get_node',data.reference[0]);
  60. var next_dom = $(data.reference[0]).closest("li").next();
  61. _menu.operation.sortMenu(node,next_dom);
  62. }
  63. },
  64. "新建子菜单":{
  65. "label":"新建子菜单",
  66. "action":function(data){
  67. var node = _menu.data.jsTree.jstree('get_node',data.reference[0]);
  68. var pid = node.id;
  69. _menu.operation.addMenu(pid,node);
  70. }
  71. }
  72. }
  73. }
  74. });
  75. this.data.jsTree=jsTree;
  76. },
  77. initEvent: function(){
  78. $("#closeMenu").click(function(){
  79. _menu.data.jsTree.jstree('close_all');
  80. });
  81. _menu.data.jsTree.on('load_node.jstree',function(){
  82. var root = _menu.data.jsTree.jstree('get_node',"#");
  83. var children = _menu.data.jsTree.jstree("get_children_dom",root);
  84. var a = $("a",children);
  85. $.each(a,function(){
  86. $(this).bind("contextmenu",function(){
  87. var parent = _menu.data.jsTree.jstree('get_parent',$(this));
  88. if(parent!=='#'){
  89. if(_menu.data.jsTree.jstree(true).settings.contextmenu.items["新建子菜单"]){
  90. delete _menu.data.jsTree.jstree(true).settings.contextmenu.items["新建子菜单"];
  91. }
  92. }else{
  93. if(!_menu.data.jsTree.jstree(true).settings.contextmenu.items["新建子菜单"]){
  94. _menu.data.jsTree.jstree(true).settings.contextmenu.items["新建子菜单"]={
  95. "label":"新建子菜单",
  96. "action":function(data){
  97. var node = _menu.data.jsTree.jstree('get_node',data.reference[0]);
  98. var pid = node.id;
  99. _menu.operation.addMenu(pid);
  100. }
  101. };
  102. }
  103. }
  104. });
  105. });
  106. _menu.data.jsTree.jstree('select_node',root.children[0]);
  107. });
  108. _menu.data.jsTree.on('select_node.jstree',function(node,selected,event){
  109. $.get($.hr_contextUrl()+"menu/getMenu",{id:selected.node.id},function(data){
  110. $("#menuForm").resetForm();
  111. $("#menuForm").disableForm();
  112. $("#menuForm").loader(data);
  113. $("#menuForm [name='pMenuName']").val(data.pMenu?(data.pMenu.text||''):'');
  114. },"json")
  115. });
  116. $("#showMenu").click(function(){
  117. _menu.data.jsTree.jstree('open_all');
  118. });
  119. },
  120. operation:{
  121. addMenu:function(pid,node){
  122. if(pid==="#"){
  123. $("#menuForm [name=pid]").val("");
  124. }else{
  125. $("#menuForm [name=pid]").val(pid);
  126. }
  127. $("#menuForm").resetForm();
  128. this.setOrder(pid);
  129. $("#menuForm").enableForm();
  130. },
  131. editMenu:function(node){
  132. $("#menuForm").resetForm();
  133. $("#menuForm").enableForm().loader(node);
  134. },
  135. sortMenu:function(node,dom){
  136. if(dom.length>0){
  137. var otherNode = _menu.data.jsTree.jstree('get_node',dom[0]);
  138. $.post($.hr_contextUrl()+"menu/order",{"currId":node.id,"otherId":otherNode.id},function(){
  139. _menu.operation.refresh();
  140. },"json");
  141. }
  142. },
  143. setOrder:function(pid){
  144. var root = _menu.data.jsTree.jstree('get_node',pid);
  145. var children = _menu.data.jsTree.jstree("get_children_dom",root);
  146. var lastNode = _menu.data.jsTree.jstree('get_node',children[children.length-1]);
  147. $("#menuForm [name='order']").val(lastNode.original.order+1);
  148. },
  149. refresh:function(){
  150. _menu.data.jsTree.jstree('refresh');
  151. $("#menuForm .control-group").removeClass('success')
  152. },
  153. delMenu:function(node){
  154. var children = _menu.data.jsTree.jstree("get_children_dom",node);
  155. if(children.length>0){
  156. $.Zebra_Dialog('该菜单下还有子菜单不能删除!', {
  157. 'type': 'error',
  158. 'title': '系统提示'
  159. });
  160. return;
  161. }
  162. var id = node.id;
  163. $.Zebra_Dialog('您确认要删除该菜单么?', {
  164. 'type': 'question',
  165. 'title': '系统提示',
  166. 'buttons': [
  167. {caption: '确定', callback: function() {
  168. $.post($.hr_contextUrl()+"menu/delMenu",{'id':id},function(msg){
  169. new $.Zebra_Dialog(msg, {
  170. 'buttons': false,
  171. 'modal': false,
  172. 'position': ['right - 20', 'bottom - 20'],
  173. 'auto_close': 2500,
  174. 'animation_speed_show':500,
  175. 'animation_speed_hide':500,
  176. 'onClose':function(){
  177. _menu.operation.refresh();
  178. }
  179. });
  180. },'json');
  181. }},
  182. {caption: '取消'},
  183. ]
  184. });
  185. }
  186. }
  187. };
  188. return {
  189. init:function(){
  190. _menu.initMenu();
  191. _menu.initEvent();
  192. _menu.initForm();
  193. }
  194. };
  195. })();

 
这个是做好的效果图,代码中对contextmenu的数量做了调整,当用户点击一级菜单时 

当用户点击二级菜单时 

其实在jstree中,它将菜单项保存在了settings.contextmenu.items这个数组中,所以在用户右键的时候动态设置items就可以做到菜单的动态改变。

如果想获取到从后台传递的不属于jstree配置属性的值,可以查看节点的original属性,这个属性中存储的是这个节点所对应的所有数据。

比如:

  1. @Entity
  2. @Table(name = "t_menu")
  3. public class Menu {
  4. private String id;
  5. private String text;
  6. private String url;
  7. private Menu pMenu;
  8. private String pid;
  9. private String icon;
  10. private State state;
  11. private Integer order;
  12. private String descr;
  13. private Set<Menu> children = new HashSet<Menu>();
  14. /**省略setter和getter*/
  15. }

如果后台程序中与jstree的对应属性为 上面的类,实际上在前台通过jstree的get_node方法获取到这个节点, 
节点的original属性中就会有url,order,descr等值。

jstree的基本使用例子的更多相关文章

  1. jstree API

    https://www.jstree.com/ drag & drop support(拖放)  keyboard navigation(键盘导航)  inline edit, create ...

  2. jstree中文github文档

    jstree Bala...bala...这段就不翻译了. jstree就是个基于JQUERY的树形控件. 1 2 jsTree is jquery plugin, that provides int ...

  3. JsTree实现简单的CRUD

    现在需要将省市县区域这块搞成树状图的形状,由于项目使用的AngularJS+ABP+WebAPI各个模块之间数据传输形式是json格式,那么对于JsTree来说就方便很多了,只需要将json数据搞成我 ...

  4. 基于Metronic的Bootstrap开发框架经验总结(2)--列表分页处理和插件JSTree的使用

    在上篇<基于Metronic的Bootstrap开发框架经验总结(1)-框架总览及菜单模块的处理>介绍了Bootstrap开发框架的一些基础性概括,包括总体界面效果,以及布局.菜单等内容, ...

  5. jstree 插件的使用笔记(一)

    官方:http://www.jstree.com/  一.节点的描述 官方资料:http://www.jstree.com/docs/json/ 格式一 { id : "string&quo ...

  6. jstree无限级菜单ajax按需动态加载子节点

    业余时间研究了一下jstree,更新非常快已经是3.0了,首先看一下效果截图: 1.页面引入样式和脚本(注意路径根据实际情况) <link href="~/Scripts/vakata ...

  7. jstree中json data 的生成

       jstree中json data 的生成 jstree官网上给出的json数据格式是这样的: <span style="font-size:14px;">// A ...

  8. (转)基于Metronic的Bootstrap开发框架经验总结(2)--列表分页处理和插件JSTree的使用

    http://www.cnblogs.com/wuhuacong/p/4759564.html 在上篇<基于Metronic的Bootstrap开发框架经验总结(1)-框架总览及菜单模块的处理& ...

  9. jsTree树插件

    前言 关于树的数据展示,前后用过两个插件,一是zTree,二是jsTree,无论是提供的例子(可下载),还是提供的API在查找时的便捷程度,zTree比jsTree强多了,也很容易上手,所以这里只讲下 ...

随机推荐

  1. ie 代理设置中地址和端口置灰的解决办法

    @echo offecho 代理设置reg add "HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings&quo ...

  2. 1062. Talent and Virtue (25)【排序】——PAT (Advanced Level) Practise

    题目信息 1062. Talent and Virtue (25) 时间限制200 ms 内存限制65536 kB 代码长度限制16000 B About 900 years ago, a Chine ...

  3. react-color 颜色选择器组件

    demo链接:github demo 安装: npm install react-color --save 有一下几种类型组件 <AlphaPicker /> <BlockPicke ...

  4. HDU4267 树状数组 不连续区间修改(三维)

    A Simple Problem with Integers                                  Problem Description Let A1, A2, ... ...

  5. Groonga开源搜索引擎——列存储做聚合,没有内建分布式,分片和副本是随mysql或者postgreSQL作为存储引擎由MySQL自身来做分片和副本的

    1. Characteristics of Groonga ppt:http://mroonga.org/publication/presentation/groonga-mysqluc2011.pd ...

  6. idea mac 控制台中文乱码

    参考:https://blog.csdn.net/lheangus/article/details/48915357 修改内容 -Dfile.encoding=UTF-8

  7. 洛谷 P1084 疫情控制 —— 二分+码力

    题目:https://www.luogu.org/problemnew/show/P1084 5个月前曾经写过一次,某个上学日的深夜,精疲力竭后只有区区10分,从此没管... #include< ...

  8. bzoj2060

    树形dp dp[x][0]表示x点父亲没选,dp[x][1]表示x点父亲选了,然后dp[x][0]=max(sigma(dp[c[x]][0]),sigma(dp[c[x]][1])) dp[x][1 ...

  9. C++ 值初始化和默认初始化

    对于初始化的问题,我之前一直傻傻分不清.有关初始化以及赋值的区别也是一问题,这次回过头来看,配合<<CSAPP>>的内容,对初始化有了一些新的认识. 声明: 在环境/上下文中指 ...

  10. 【转载】HTTP协议详解

    [本文转自]http://www.cnblogs.com/EricaMIN1987_IT/p/3837436.html 一.概念 协议是指计算机通信网络中两台计算机之间进行通信所必须共同遵守的规定或规 ...