JQuery 常用积累(六)ZTree

Web 项目或多或少都会有涉及到什么人员职称树,菜单树,组织机构树......

历手三四个项目有大有小,采用的树前端都是 Ztree。

有些优秀的J2EE 框架将这些常用的组件都封装起来,作为模块化的组件提供给前端,这样固然是好,开发效率会提升几倍。

客户需求是什么,组件化往上一套,几分钟就能搭建起来。

但这样咱程序员真的就是搬砖的了,纯纯的重复性工作。

1. Ztree 主要的特点

  • ZTree v3.0 将核心代码按照功能进行了分割,不需要的代码可以不用加载
  • 采用了 延迟加载 技术,上万节点轻松加载,即使在 IE6 下也能基本做到秒杀
  • 兼容 IE、FireFox、Chrome、Opera、Safari 等浏览器
  • 支持 JSON 数据
  • 支持静态 和 Ajax 异步加载节点数据
  • 支持任意更换皮肤 / 自定义图标(依靠css)
  • 支持极其灵活的 checkbox 或 radio 选择功能
  • 提供多种事件响应回调
  • 灵活的编辑(增/删/改/查)功能,可随意拖拽节点,还可以多节点拖拽哟
  • 在一个页面内可同时生成多个 Tree 实例
  • 简单的参数配置实现 灵活多变的功能

详细的介绍请移步到Ztree官网:
     http://www.ztree.me/v3/main.php#_zTreeInfo

2. Web 前端

具体使用框架不同,前端通信请求写法可能会有差距,但无论经历怎样的封装与变化,个人认为前端到后端通信方式大致为 Ajax/Websocket。

首先页面需要引入JS,ZTree 依赖与 JQuery,所以 JQuery 写到前面位置。

<script type="text/javascript" src=‘/style/js/jquery.js‘></script>
<script type="text/javascript" src=‘/style/js/jquery.ztree.core-3.5.js‘></script>

其次按照项目需求不同可以进行具体配置。 zTree 配置属性和初始化方法参照:http://www.ztree.me/v3/api.php

var setting = {
        view : {
            showLine : true,
            selectedMulti : false,
            dblClickExpand : false
        },
        data : {
            simpleData : {
                enable : true
            }
        },
        callback : {
            onNodeCreated : this.onNodeCreated,
            onClick : this.onClick
        }
    };

    $.ajax({
        url : ‘service/Menu/getMenutree‘,
        dataType : ‘json‘,
        contenttype : "application/x-www-form-urlencoded;charset=utf-8",
        type : ‘POST‘,
        success : function(data) {
            if (data.success) {
                $.fn.zTree.init($("#treeDemo"), setting, data.returnvalue);
            } else {
                alert("加载菜单树出错1!");
            }
        },
        error : function(data) {
            alert("加载菜单树出错2");
        }
    });

最后将后端组织好的 Json 数据初始化入ZTree 即可,具体的 ZTree 使用,比如显示的样式,拖拽,点击事件的响应........都是支持的,看具体需求来实现。

3. Web 后端

前端的各种样式事件响应需要一颗细腻的心,如果你们公司前后端是严格分工开发的,你完全可以交给前端MM了,专注后端设计。

下面都为个人理解设计,如看客老爷有更好方式,请斧正。

首先你得需要一个像 Ztree 树节点属性类似的数据结构 POJO(setter,getter 方法已省略)。

其中只对几个常用的属性进行了定义,方便其他人使用,降低业务代码之间的耦合性。

public class ZTreeNode{
    private static final long serialVersionUID = 8732537724623459243L;
    private Long id;
    private Long pId;
    private String name;
    private Boolean open;
    private Boolean checked;
    private Boolean nocheck;
    private boolean cancheck;

    @Override
    public int compareTo(TreeStuffBean o) {
        // TODO Auto-generated method stub
        return 0;
    }
}

其次你需要一张具有上下级关系的数据表,下面这是俺自己的测试脚本。

SQL 无国界,尽管拿去练手吧。

--菜单目录结构表
create table tb_menu(
 id number(10) not null, --主键id
 title varchar2(50), --标题
 parent number(10) --parent id
);
commit;
--父菜单
insert into tb_menu(id, title, parent) values(1, ‘父菜单1‘,-1);
insert into tb_menu(id, title, parent) values(2, ‘父菜单2‘,-1);
insert into tb_menu(id, title, parent) values(3, ‘父菜单3‘,-1);
insert into tb_menu(id, title, parent) values(4, ‘父菜单4‘,-1);
insert into tb_menu(id, title, parent) values(5, ‘父菜单5‘,-1);
--一级菜单
insert into tb_menu(id, title, parent) values(6, ‘一级菜单6‘,1);
insert into tb_menu(id, title, parent) values(7, ‘一级菜单7‘,1);
insert into tb_menu(id, title, parent) values(8, ‘一级菜单8‘,1);
insert into tb_menu(id, title, parent) values(9, ‘一级菜单9‘,2);
insert into tb_menu(id, title, parent) values(10, ‘一级菜单10‘,2);
insert into tb_menu(id, title, parent) values(11, ‘一级菜单11‘,2);
insert into tb_menu(id, title, parent) values(12, ‘一级菜单12‘,3);
insert into tb_menu(id, title, parent) values(13, ‘一级菜单13‘,3);
insert into tb_menu(id, title, parent) values(14, ‘一级菜单14‘,3);
insert into tb_menu(id, title, parent) values(15, ‘一级菜单15‘,4);
insert into tb_menu(id, title, parent) values(16, ‘一级菜单16‘,4);
insert into tb_menu(id, title, parent) values(17, ‘一级菜单17‘,4);
insert into tb_menu(id, title, parent) values(18, ‘一级菜单18‘,5);
insert into tb_menu(id, title, parent) values(19, ‘一级菜单19‘,5);
insert into tb_menu(id, title, parent) values(20, ‘一级菜单20‘,5);
--二级菜单
insert into tb_menu(id, title, parent) values(21, ‘二级菜单21‘,6);
insert into tb_menu(id, title, parent) values(22, ‘二级菜单22‘,6);
insert into tb_menu(id, title, parent) values(23, ‘二级菜单23‘,7);
insert into tb_menu(id, title, parent) values(24, ‘二级菜单24‘,7);
insert into tb_menu(id, title, parent) values(25, ‘二级菜单25‘,8);
insert into tb_menu(id, title, parent) values(26, ‘二级菜单26‘,9);
insert into tb_menu(id, title, parent) values(27, ‘二级菜单27‘,10);
insert into tb_menu(id, title, parent) values(28, ‘二级菜单28‘,11);
insert into tb_menu(id, title, parent) values(29, ‘二级菜单29‘,12);
insert into tb_menu(id, title, parent) values(30, ‘二级菜单30‘,13);
insert into tb_menu(id, title, parent) values(31, ‘二级菜单31‘,14);
insert into tb_menu(id, title, parent) values(32, ‘二级菜单32‘,15);
insert into tb_menu(id, title, parent) values(33, ‘二级菜单33‘,16);
insert into tb_menu(id, title, parent) values(34, ‘二级菜单34‘,17);
insert into tb_menu(id, title, parent) values(35, ‘二级菜单35‘,18);
insert into tb_menu(id, title, parent) values(36, ‘二级菜单36‘,19);
insert into tb_menu(id, title, parent) values(37, ‘二级菜单37‘,20);
--三级菜单
insert into tb_menu(id, title, parent) values(38, ‘三级菜单38‘,21);
insert into tb_menu(id, title, parent) values(39, ‘三级菜单39‘,22);
insert into tb_menu(id, title, parent) values(40, ‘三级菜单40‘,23);
insert into tb_menu(id, title, parent) values(41, ‘三级菜单41‘,24);
insert into tb_menu(id, title, parent) values(42, ‘三级菜单42‘,25);
insert into tb_menu(id, title, parent) values(43, ‘三级菜单43‘,26);
insert into tb_menu(id, title, parent) values(44, ‘三级菜单44‘,27);
insert into tb_menu(id, title, parent) values(45, ‘三级菜单45‘,28);
insert into tb_menu(id, title, parent) values(46, ‘三级菜单46‘,28);
insert into tb_menu(id, title, parent) values(47, ‘三级菜单47‘,29);
insert into tb_menu(id, title, parent) values(48, ‘三级菜单48‘,30);
insert into tb_menu(id, title, parent) values(49, ‘三级菜单49‘,31);
insert into tb_menu(id, title, parent) values(50, ‘三级菜单50‘,31);
commit;

TB_MENU

当然对于业务 POJO 的数据结构封装比不可少,主流的持久层框架都能将表映射为 POJO对象,有自动生成业务接口,服务层的。

不用那些看起来难懂的书面话, 个人理解 POJO 的作用,将现实业务抽象到程序表现层。

public class TbMenu {
    private Long id;
    private String title;
    private Long parent;
}

TbMenu

最后是核心的业务处理逻辑,通过持久层获取想要遍历的数据,进行处理封装。

    Map<String, Object> returnvalue = new HashMap<>();
    List<TbMenu> menuList = dataDao.find(TbMenu.class);
    List<ZTreeNode> ZTreeNodeList = new ArrayList<>();
    ZTreeNode treeNode;
    for (TbMenu tbMenu : menuList) {
        treeNode = new ZTreeNode();
        treeNode.setId(tbMenu.getId());
        treeNode.setpId(tbMenu.getParent());
        treeNode.setName(tbMenu.getTitle());
        ZTreeNodeList.add(treeNode);
    }
    treeNode = new ZTreeNode();
    treeNode.setId(-1L);
    treeNode.setpId(0L);
    treeNode.setName("菜单树");
    treeNode.setOpen(true);
    ZTreeNodeList.add(0, treeNode);

    TreeComparator treeComparator = new TreeComparator();
    Collections.sort(ZTreeNodeList, treeComparator);

需要注意的地方是最后在 ZTreeNodeList 头部添加的 treeNode 为树组件的头部,这里需要将数据表中的一级菜单的 parentid 设置为 -1。

最终界面展示

时间: 2024-08-24 16:27:11

JQuery 常用积累(六)ZTree的相关文章

JQuery 常用积累(二)Pagination 分页组件

官方Demo网址:http://mricle.com/JqueryPagination 分页组件几乎是一般网站都会涉及到的组件,网上有很多这样的插件,自己挑来跳去选择了这一款,功能强大,可扩展性比较强,而且幕后的工程师一直在完善这个插件,不废话了,上干货. (模拟场景:商店网站,俺要根据用户选择的查询条件,来查询数据库,并展示到前台) 1.JSP页面: 如果你的web项目前台是基于bootstrap,js只需要引入2个js: <r:script path="/style/js/Jquery

JQuery 常用积累(三)Select 下拉框

<select id="hello"></select> 1.jQuery获取Select选择的Text和Value: 语法解释: $("#select_id").change(function(){//code...}); //为Select添加事件,当选择其中一项时触发 var checkIndex=$("#select_id ").get(0).selectedIndex; //获取Select选择的索引值 var

JQuery 常用积累(五)Datetimepicker和Lodop

web项目中日期选择器和打印这两个功能是非常常见,将项目中使用的日期选择器和打印控件,在这里总结归纳,为方便后面使用. 1.Datetimepicker a.官方API:http://www.bootcss.com/p/bootstrap-datetimepicker/ 里面有详细的Datetimepicker介绍,包括支持的方法.设置的选项.事件..... b.项目集成Datetimepicker实例:    这是一款依赖与bootsrap样式的控件,所以你项目中需要引入的js如下: <scr

jquery常用函数与方法汇总

1.delay(duration,[queueName]) 设置一个延时来推迟执行队列中之后的项目. jQuery1.4新增.用于将队列中的函数延时执行.他既可以推迟动画队列的执行,也可以用于自定义队列. duration:延时时间,单位:毫秒 queueName:队列名词,默认是Fx,动画队列. 例: 头部与底部延迟加载动画效果 $(document).ready(function() { $('#header') .css({ 'top':-50 }) .delay(1000).animat

jQuery常用函数-思维导图

百度脑图jQuery常用函数 百度脑图jQuery常用函数

基于jQuery 常用WEB控件收集

Horizontal accordion: jQuery 基于jQuery开发,非常简单的水平方向折叠控件. Horizontal accordion: jQuery jQuery-Horizontal Accordion 具有XBOX360 blade界面风格的水平方向Accordion. jQuery-Horizontal Accordion AutoComplete-JQuery jQuery插件易于集成到现在的表单中(Form). AutoComplete-JQuery Facebook

jquery常用技巧及常用方法列表集合

jquery常用技巧及常用方法列表集合 jquery常用技巧及常用方法列表集合,学习jquery的朋友可以收藏下.方便查找学习. 1.关于页面元素的引用  通过jquery的$()引用元素包括通过id.class.元素名以及元素的层级关系及dom或者xpath条件等方法,且返回的对象为jquery对象(集合对象),不能直接调用dom定义的方法. 2.jQuery对象与dom对象的转换  只有jquery对象才能使用jquery定义的方法.注意dom对象和jquery对象是有区别的,调用方法时要注

Jquery常用选择器

Jquery常用选择器<p id="test">这是段落中的<b>粗体</b>文本.</p>text() - 设置或返回所选元素的文本内容html() - 设置或返回所选元素的内容(包括 HTML 标记)$("#test").text():这是段落中的粗体文本.$("#test").html():这是段落中的<b>粗体</b>文本. append() - 在被选元素的结尾插入

Jquery常用的选择器有哪些?

jquery 选择器. css3 选择器各种各样的选择器,作为非常灵活的 jquery 选择器到底如何使用呢?本文和大家分享的就是jquery 常用选择器种类及其原理相关内容,希望对大家 学习jquery有所帮助. 一.对于jQuery 选择器基本用法 在CSS3 选择器标淮草案定义的选择器语法中, jQuery 支持相当完整的一套子集,同时还添加了一些非标准但很有用的伪类.注意 : 本节讲述的是  jQuery 选择器.其中有不少选择器 ( 但不是全部 ) 可以在 CSS 样式表中使用.选择器