这是一个树形菜单的展示。其功能及其强大,几乎可以提供你对树结构的各种要求。下面,对其简述。

   首先,感谢 Ivan Bozhanov利用JQuery对该组件的开发。同时还要感谢我的技术总监Mr. Lu和网友“漂流瓶”的帮助。
   组件目前更新至 v0.9.8 版本,当然,版本还会继续升级,作者试图将它变得更加强大和完美,Ivan Bozhanov在博客中说:“I just thought it would be nice if I posted all my ideas for the upcoming 0.9.9 and see which ones you like, or do not like.”
    使用JSTree,需要在文件头写类似如下内容的代码,也就是说,它基于JQuery技术,自然需要jquery.js文件支持,同时还有css.js和tree_component.js这2个文件做支持以及tree_comopnent.css文件的渲染。
Js代码:
<script src="<%=request.getContextPath() %>/js/jquery-0.9.6.js" type="text/javascript"></script>
<script src="<%=request.getContextPath() %>/js/css.js" type="text/javascript"></script>
<script type="text/javascript" src="<%=request.getContextPath() %>/js/tree_component.js"></script>
<link rel="stylesheet" href="<%=request.getContextPath() %>/css/tree_component.css" />
这个树,我们需要给它提供一个容器,如div。
    容器内不需要给出内容,<div id="divForTree"></div>即可。内容会在JSTree被Init的时候来渲染。
 PART A.
来看一个普通的树:
Java代码:
$(function () {
    $.ajaxSetup({cache:false});//这个是为了树的准确性做的一个缓存区清理的工作
   $("#divForTree").tree({//从这里开始初始化JSTree
    data  : {
        type  : "json",//支持如xml等多种类型,这里是获取JSON格式数据源
        url   : src,//每次获得数据从这个链接
        async : true,//动态加载数据
        async_data : function (NODE) {//请求数据时带的参数列表,可通过getParameter获得。
                                        return { parent_Id : $(NODE).attr("id") || 0}
                                     }
      },
      lang:{
           loading:"目录加载中……"  //在用户等待数据渲染的时候给出的提示内容,默认为loading
            },
       ui:{//在这个option中设置context来控制JSTree的右键操作,如果在context的visible函数内始终返回false则表示在任何节点的右键都无效。
           context:{visible : function (NODE, TREE_OBJ) {
                    return false;
                }}
           },
   callback : {//响应函数,如节点被选中的onselect,还有onopen,onload,beforeopen等很多可定义内容。
        onselect: function(node) {
            //自定义操作
         
        }
    }
 
});
});
再看一下JSON的数据吧,可以在后台JAVA程序段获得一个根据实际情况如当前打开节点的ID作为parent_id获取它的子节点List。然后在一个JSP中迭代这个List(这里的迭代利用了Struts2的标签):
Java代码:
<%@ page contentType="text/html; charset=utf-8" %>
<%@ taglib prefix="s" uri="/struts-tags" %>
[
<s:iterator  value="noteslist"  >
{
    attributes: { id : ${id} },
    data: "${name}" ,state: "closed"
}
,
</s:iterator>
]
PART B.
  现在看一个带有右键操作的树形菜单
Java代码:
$(document).ready(function(){
    $.ajaxSetup({cache:false});
    $("#browser").tree({
    data  : {
        type  : "json",
        url   : src,
        async : true,
        async_data : function (NODE) {
                                        return { parent_Id : $(NODE).attr("id") || 0}
                                     }
      },
      lang:{
           loading:"目录加载中……"
            },
      rules:
      {
      draggable   : "all"   //这个设置可以使得节点进行拖动操作
      },
      ui:{
           context     : [ //自定义右键操作的可操作内容
            {
                id      : "create",
                label   : "添加下级目录", //右键弹出菜单的此项操作屏显字样
                visible : function (NODE, TREE_OBJ) { if(NODE.length != 1) return false; return TREE_OBJ.check("creatable", NODE); }, //允许节点被右击时出现操作菜单
                icon    : "<%=request.getContextPath() %>/css/themes/default/create.png",//右键弹出菜单的此项操作图标
                action  : function (NODE, TREE_OBJ) {
                                                //进行此项操作,将有这个函数事件被响应
                                                     }
            },
            "separator"//这个是在两个操作之间画一条分隔线
           ,
            {
                id      : "edit",
                label   : "编辑目录信息",
                visible : function (NODE, TREE_OBJ) { if(NODE.length != 1) return false; return TREE_OBJ.check("creatable", NODE); },
                icon    : "<%=request.getContextPath() %>/image/reg2.gif",
                action  : function (NODE, TREE_OBJ) {
                                                    openWindow('myurl','','',function(){treeRefresh($(NODE).attr("id"));});
                                                    }
            },
            "separator"
            ,
            {
                id      : "privilege",
                label   : "设置目录权限",
                visible : function (NODE, TREE_OBJ) { if(NODE.length != 1) return false; return TREE_OBJ.check("creatable", NODE); },
                icon    : "<%=request.getContextPath() %>/css/themes/default/rename.png",
                action  : function (NODE, TREE_OBJ) {
                                                    openWindow('myurl','','',function(){treeRefresh($(NODE).attr("id"));});
                                                    }
            },
            "separator",
            {
                id      : "delete",
                label   : "删除",
                visible : function (NODE, TREE_OBJ) { if(NODE.length != 1) return false; return TREE_OBJ.check("creatable", NODE); },
                icon    : "<%=request.getContextPath() %>/css/themes/default/remove.png",
                action  : function (NODE, TREE_OBJ) {
                                                    var tree=$.tree_reference("browser");
                                                    openWindow('myurl','','',function(){
                                               //下边的.parent()和.refresh()均为v0.9.8版本提供,如果你使用的是其他版本如v0.9.6等,这些将不被支持。
                                                    NODE=$(tree.parent(NODE));
                                                    if($(NODE).attr("id")==undefined){
                                                        tree.refresh();
                                                    }else{
                                                        TreeRefresh();
                                                    }
                                                    });
                                                    }
            },
            "separator",
            {
                id      : "others",
                label   : "其他操作",
                visible : function (NODE, TREE_OBJ) { if(NODE.length != 1) return false; return TREE_OBJ.check("creatable", NODE); },
                icon    : "<%=request.getContextPath() %>/css/images/cut.png",
                action  : function (NODE, TREE_OBJ) {
                                                    alert("暂无可提供操作。");
                                                    }
            }
            ]
      },
   callback : {
         onselect: function(node) {
            //(a);
          
        }
    }
 
});
function treeRefresh(nodeid){
                     var rid=nodeid;
                    var tree=$.tree_reference("browser");
                    var par_node=tree.parent($("#"+rid));
                    tree.refresh(par_node);
}
});
PART C.
最后,再介绍一种带有checkbox功能效果的JSTree
Java代码:
 $.ajaxSetup({cache:false});
    $("#checktreeToshow").tree({
    data  : {
        //内容同上,略过。
      },
       ui : {
        //作者提供了checkbox效果的主题包,引入项目并指明包的位置
       theme_path  : "<%=request.getContextPath() %>/css/themes/",
        //指出主题包的名字,如checkbox,或者是apple(苹果操作平台下的效果主题)
       theme_name : "checkbox",
       //理论上指定了主题包的位置和主题包的名字就可以使用带有checkbox功能的JSTree了,但我却并没有得到我想要的效果,所有的节点被点击时无法被勾选。似乎主题包内的change.js没有响应。因此我临时做了个比较糟糕的实现,就是写一个function checkChange(NODE, TREE_OBJ)函数,函数内容为checkbox主题包中change.js文件提供的onchange函数内容。自定义的checkChange函数即将你所操作的NODE节点的checkbox的勾选状态取反。因为我的onchange没有勾选效果,所以手工的添加了checkChange函数来实现。同理,我想要在节点的子节点加载进来后根据父节点是否被勾选来决定加载进来的子节点的勾选状态,于是onopen函数也做了调整,不过这里的调整并不完善,有许多细节的瑕疵,如果你是JSTree的高手,欢迎交流经验。
        context:{visible : function (NODE, TREE_OBJ) {
                    return false;
                }}
  },
      lang:{
           loading:"目录加载中……"
   },
   callback:
   {
   onchange : function (NODE, TREE_OBJ) {
                                          checkChange(NODE, TREE_OBJ);
                                          },
   onopen:function(NODE, TREE_OBJ){
                                       var $this = $(NODE).is("li") ? $(NODE) : $(NODE).parent();
                                       var status=($this.children("a").attr("class").substring(0,7));
                                       var tree=$.tree_reference("checktreeToshow");
                                       if($(NODE).attr("where")=="0")
                                       {
                                           if(status=="checked")
                                           {  
                                               checkChange(NODE, TREE_OBJ);
                                               checkChange(NODE, TREE_OBJ);
                                           }
                                       }
                                       else
                                       {
                                           if(status=="checked")
                                           {  
                                               //NODE=$(tree.parent(NODE));
                                               $this = $(NODE).is("li") ? $(NODE) : $(NODE).parent();
                                               status=($this.children("a").attr("class")).substring(0,7);
                                               if(status=="checked")
                                               {
                                               checkChange(NODE, TREE_OBJ);
                                               checkChange(NODE, TREE_OBJ);
                                               }
                                           }
                                       }
                                     }                                                       
   }    
 
});
}
下面是我自定义的checkChange函数,函数体为主题中change.js文件提供的函数内容:
Java代码:
function checkChange(NODE, TREE_OBJ)
{
 var $this = $(NODE).is("li") ? $(NODE) : $(NODE).parent();
 if($this.children("a.unchecked").size() == 0) {
   TREE_OBJ.container.find("a").addClass("unchecked");
 }
 $this.children("a").removeClass("clicked");
 if($this.children("a").hasClass("checked")) {
  $this.find("li").andSelf().children("a").removeClass("checked").removeClass("undetermined").addClass("unchecked");
   var state = 0;
 }
 else {
  $this.find("li").andSelf().children("a").removeClass("unchecked").removeClass("undetermined").addClass("checked");
   var state = 1;
 }
 $this.parents("li").each(function () {
   if(state == 1) {
     if($(this).find("a.unchecked, a.undetermined").size() - 1 > 0) {
      $(this).parents("li").andSelf().children("a").removeClass("unchecked").removeClass("checked").addClass("undetermined");
       return false;
     }
     else $(this).children("a").removeClass("unchecked").removeClass("undetermined").addClass("checked");
   }
   else {
     if($(this).find("a.checked, a.undetermined").size() - 1 > 0) {
      $(this).parents("li").andSelf().children("a").removeClass("unchecked").removeClass("checked").addClass("undetermined");
       return false;
     }
     else $(this).children("a").removeClass("checked").removeClass("undetermined").addClass("unchecked");
   }
 });
}
 以上为个人的一点小总结,可以给我作为备忘以便以后再使用。如果你也在使用JQuery的JSTree,希望能对你有些许帮助,同时它更多的内容我也在不断尝试中。

   最后再说一下,JSTree下载后下载包中会自带JQuery的jquery.js文件,使用这个肯定没问题,但如果你的项目已经存在了jquery.js文件,有可能会出现$("#" + this.container.attr("id") + " li").live is not a function     tree_component.js (第 1028 行)  【注:该异常捕获于FF浏览器,使用的JSTree为v0.9.6】,因为JSTree对JQuery的版本还是有依赖性的,作者对此异常的解释为:“It is the jQuery version that is used. You need to use the supplied jQuery (or the latest from http://jquery.com) . Version 1.2.6 does not support live events (they are introduced in 1.3).”

JQuery的JSTree使用的更多相关文章

  1. 基于jQuery 常用WEB控件收集

    Horizontal accordion: jQuery 基于jQuery开发,非常简单的水平方向折叠控件. Horizontal accordion: jQuery jQuery-Horizonta ...

  2. jstree的简单用法

    一般我们用jstree主要实现树的形成,并且夹杂的邮件增删重命名刷新的功能 下面是我在项目中的运用,采用的是异步加载 $('#sensor_ul').data('jstree', false).emp ...

  3. jstree使用新的

    1.首先准备jstree树的dom元素 <p id="flowList_ul" class="flowList_ul"></p> 2.初 ...

  4. jstree API

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

  5. jstree中文github文档

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

  6. tsort - 拓扑排序

    tsort - 拓扑排序 本文链接:http://codingstandards.iteye.com/blog/834572   (转载请注明出处) 用途说明 tsort命令通常用于解决一种逻辑问题, ...

  7. js-jsTree

    依赖:jquery.jsjstree.js//cdnjs.cloudflare.com/ajax/libs/jstree/3.3.3/themes/default/style.min.css 备注:绑 ...

  8. JQuery 目录树jsTree插件用法

    PHP循环构造目录树结构 <ul> <php> function digui($fid,$level){ $class=M("wangpan_class") ...

  9. jquery jstree 插件的使用

    最近一个项目 需要用到jstree 这个jQuery插件,就研究了下,做目录树 菜单还是很强大的,下面对经常会用到几个用法做下说明. 1. 首先页面 引用 jquery.jstree 2. html ...

随机推荐

  1. jQuery给table中的负数标红色

    <table class="tb_list"></table> $(function(){ $(".tb_list td").each( ...

  2. Centos6.5中 一键安装LNMP 安装Yii2.0 手工配置

    1.一键安装LNMP cd /usr wget -c http://soft.vpser.net/lnmp/lnmp1.2-full.tar.gz tar zxf lnmp1.-full.tar.gz ...

  3. hdu 4630 No Pain No Game 线段树离线处理

    题目链接 求出一个区间内任意两个数的gcd的最大值. 先将询问读进来然后按r值排序. 将每一个数因数分解, 对每一个因子x, 如果pre[x]!=-1, 那么就更新update(pre[x], x, ...

  4. poj 3252 Round Numbers 数位dp

    题目链接 找一个范围内二进制中0的个数大于等于1的个数的数的数量.基础的数位dp #include<bits/stdc++.h> using namespace std; #define ...

  5. 【LeetCode题意分析&解答】38. Count and Say

    The count-and-say sequence is the sequence of integers beginning as follows:1, 11, 21, 1211, 111221, ...

  6. android studio 实现代码混淆

    =======本文章属于转载==========原文章地址:http://my.oschina.net/aibenben/blog/370985 这篇文章等是跟大家分享一在Android studio ...

  7. android下tcpdump抓包

    tcpdump是最快捷方便的抓包方式,还可以加深对网络协议的理解.android下可以通过如下方式抓包: 1 Android上启动tcpdump Android设备可以把tcpdump的可执行文件上传 ...

  8. HDU 1512 Monkey King(左偏树+并查集)

    [题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=1512 [题目大意] 现在有 一群互不认识的猴子,每个猴子有一个能力值,每次选择两个猴子,挑出他们所 ...

  9. SDOI(队列)

    SDOI Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) Total Sub ...

  10. C标准中一些预定义的宏

    C标准中指定了一些预定义的宏,对于编程经常会用到.下面这个表中就是一些常常用到的预定义宏. 宏(双下滑线) 意义 __DATE__ 进行预处理的日期(“Mmm dd yyyy”形式的字符串文字) __ ...