zTree插件下拉树使用入门教程


Posted in Javascript onApril 11, 2016

最近,因为工作需要一个树形下拉框的组件,经过查资料一般有两种的实现方法。其一,就是使用zTree实现;其二,就是使用easyUI实现。因为公司的前端不是使用easyUI设计的,故这里我选择了zTree来实现下拉树。

这里使用简单的数据格式(即简单的Json格式)类似如下Json:

var zNodes =[
      {id:1, pId:0, name:"北京"},
      {id:2, pId:0, name:"天津"},
      {id:3, pId:0, name:"上海"},
      {id:6, pId:0, name:"重庆"},
      {id:4, pId:0, name:"河北省", open:true, nocheck:true},
      {id:41, pId:4, name:"石家庄"},
      {id:42, pId:4, name:"保定"},
      {id:43, pId:4, name:"邯郸"},
      {id:44, pId:4, name:"承德"},
      {id:5, pId:0, name:"广东省", open:true, nocheck:true},
      {id:51, pId:5, name:"广州"},
      {id:52, pId:5, name:"深圳"},
      {id:53, pId:5, name:"东莞"},
      {id:54, pId:5, name:"佛山"},
      {id:6, pId:0, name:"福建省", open:true, nocheck:true},
      {id:61, pId:6, name:"福州"},
      {id:62, pId:6, name:"厦门"},
      {id:63, pId:6, name:"泉州"},
      {id:64, pId:6, name:"三明"}
     ];

这里首先需要一个实体bean,用来封装对应查出来的数据,如下:

public class ZtreeNode {

  // id
  private String id;
  // 父id
  private String pId;
  // 显示名称
  private String name;
  // 是否打开 (这里默认是不打开的,如果需要打开,设为true)
  // private boolean open ;
  // 能否选择 (设置节点是否能够选择,默认都能选择,设为true对应的节点不能选择)
  // private boolean nocheck ;
  
  /**getter and setter*/
}

 这里需要注意的是 pId 中的第二的字母是大写的,如果写成小写的就不能构造成树形结构,所有的都是根节点。

然后,将从数据库中查出来的数据,转换为对应的ztree需要的bean,再转换为相应的Json,代码如下:

// 获取商品分类树 返回json
  public String getGoodsCategoryTreeJson() {
    List<GoodsCategory> allGoodsCategoryList = goodsCategoryService.getGoodsCategoryTreeJson() ;
    List<ZtreeNode> ztreelist = new ArrayList<ZtreeNode>();
    for(GoodsCategory gcty : allGoodsCategoryList){
      ZtreeNode treenade = new ZtreeNode();
      treenade.setId(gcty.getId());
      treenade.setpId(gcty.getParent()==null?"":gcty.getParent().getId());
      treenade.setName(gcty.getName());
      ztreelist.add(treenade);
    }
    return ajax(ztreelist);
  }

 将list转换为对应的Json方法,如下:

用到的Json工具包:

import org.springframework.base.util.JsonUtil;

private static final String HEADER_ENCODING = "UTF-8";
private static final boolean HEADER_NO_CACHE = true;
private static final String HEADER_TEXT_CONTENT_TYPE = "text/plain";
private static final String HEADER_JSON_CONTENT_TYPE = "text/plain";

// AJAX输出
  protected String ajax(String content, String contentType) {
    try {
      HttpServletResponse response = initResponse(contentType);
      response.getWriter().write(content);
      response.getWriter().flush();
    } catch (IOException e) {
      e.printStackTrace();
    }
    return NONE;
  }

  // 根据文本内容输出AJAX
  protected String ajax(String text) {
    return ajax(text, HEADER_TEXT_CONTENT_TYPE);
  }
  
  // 根据操作状态输出AJAX
  protected String ajax(Status status) {
    HttpServletResponse response = initResponse(HEADER_JSON_CONTENT_TYPE);
    Map<String, String> jsonMap = new HashMap<String, String>();
    jsonMap.put(STATUS_PARAMETER_NAME, status.toString());
    JsonUtil.toJson(response, jsonMap);
    return NONE;
  }
  
  // 根据操作状态、消息内容输出AJAX
  protected String ajax(Status status, String message) {
    HttpServletResponse response = initResponse(HEADER_JSON_CONTENT_TYPE);
    Map<String, String> jsonMap = new HashMap<String, String>();
    jsonMap.put(STATUS_PARAMETER_NAME, status.toString());
    jsonMap.put(MESSAGE_PARAMETER_NAME, message);
    JsonUtil.toJson(response, jsonMap);
    return NONE;
  }
  
  // 根据Object输出AJAX
  protected String ajax(Object object) {
    HttpServletResponse response = initResponse(HEADER_JSON_CONTENT_TYPE);
    JsonUtil.toJson(response, object);
    return NONE;
  }
  
  // 根据boolean状态输出AJAX
  protected String ajax(boolean booleanStatus) {
    HttpServletResponse response = initResponse(HEADER_JSON_CONTENT_TYPE);
    Map<String, Object> jsonMap = new HashMap<String, Object>();
    jsonMap.put(STATUS_PARAMETER_NAME, booleanStatus);
    JsonUtil.toJson(response, jsonMap);
    return NONE;
  }

private HttpServletResponse initResponse(String contentType) {
    HttpServletResponse response = ServletActionContext.getResponse();
    response.setContentType(contentType + ";charset=" + HEADER_ENCODING);
    if (HEADER_NO_CACHE) {
      response.setDateHeader("Expires", 1L);
      response.addHeader("Pragma", "no-cache");
      response.setHeader("Cache-Control", "no-cache, no-store, max-age=0");
    }
    return response;
  }

这样前台所需要的数据,就从库里取出,并封装成了对应的Json。

接下来就是前台的实现了,前台需要导入的js和css如下:

<link rel="stylesheet" href="${base}/template/ztree/css/demo.css" type="text/css">
<link rel="stylesheet" href="${base}/template/ztree/css/zTreeStyle/zTreeStyle.css" type="text/css">
<script type="text/javascript" src="${base}/template/ztree/js/jquery.ztree.core.js"></script>

 这里只有demo.css是自己添加的,其他都是官方制定的,demo.css是将官方的demo用到的css修改的,如下(这里有冗余样式没有删除掉);

div.content_wrap {width: 400px;}
div.content_wrap div.left{float: left;}
div.content_wrap div.right{float: right;width: 340px;}
div.zTreeDemoBackground {text-align:left;}

ul.ztree {margin-top: 10px;border: 1px solid #617775;background: #fefefe;width:220px;height:360px;overflow-y:scroll;overflow-x:auto;}
ul.log {border: 1px solid #617775;background: #f0f6e4;width:300px;height:170px;overflow: hidden;}
ul.log.small {height:45px;}
ul.log li {color: #666666;list-style: none;padding-left: 10px;}
ul.log li.dark {background-color: #E3E3E3;}

/* ruler */
div.ruler {height:20px; width:220px; background-color:#f0f6e4;border: 1px solid #333; margin-bottom: 5px; cursor: pointer}
div.ruler div.cursor {height:20px; width:30px; background-color:#3C6E31; color:white; text-align: right; padding-right: 5px; cursor: pointer}

然后,就是对应的下拉框:

<div class="content_wrap">
  <div class="zTreeDemoBackground left">
     <input id="citySel" class="formText" type="text" onclick="showMenu(); return false;" readonly value="" style="width:150px;"/>
     <input id="treeids" type="hidden" name="goods.goodsCategory.id" >
     <input type="button" onclick="showMenu();" value="∨">
  </div>
</div>
 8<div id="menuContent" class="menuContent" style="display:none; position: absolute;">
  <ul id="treeDemo" class="ztree" style="margin-top:0;"></ul>
</div>

这里有一个隐藏的文本框用来存放下拉框选择内容对应的id。

对应的脚本如下:

<SCRIPT type="text/javascript">
    
    var setting = {
      view: {
        dblClickExpand: false
      },
      data: {
        simpleData: {
          enable: true
        }
      },
      callback: {
        onClick: onClick
      },
      view: {



  // 不显示对应的图标
        showIcon: false 
      }
    };

    function onClick(e, treeId, treeNode) {
      var zTree = $.fn.zTree.getZTreeObj("treeDemo"),
      nodes = zTree.getSelectedNodes(),
      v = "";
      ids = "";
      nodes.sort(function compare(a,b){return a.id-b.id;});
      for (var i=0, l=nodes.length; i<l; i++) {
        v += nodes[i].name + ",";
        ids += nodes[i].id + ",";
      }
      if (v.length > 0 ) v = v.substring(0, v.length-1);
      var cityObj = $("#citySel");
      cityObj.attr("value", v);
      // 将选中的id放到隐藏的文本域中
      if (ids.length > 0 ) ids = ids.substring(0, ids.length-1);
      var treeids = $("#treeids");
      treeids.attr("value", ids);
    }

    function showMenu() {
      var cityObj = $("#citySel");
      var cityOffset = $("#citySel").offset();
      $("#menuContent").css({left:cityOffset.left + "px", top:cityOffset.top + cityObj.outerHeight() + "px"}).slideDown("fast");

      $("body").bind("mousedown", onBodyDown);
    }
    function hideMenu() {
      $("#menuContent").fadeOut("fast");
      $("body").unbind("mousedown", onBodyDown);
    }
    function onBodyDown(event) {
      if (!(event.target.id == "menuBtn" || event.target.id == "menuContent" || $(event.target).parents("#menuContent").length>0)) {
        hideMenu();
      }
    }

    var zNodes ;
    $(document).ready(function(){
 


// 加载数据
      $.ajax({  
        async : false,  
        cache:false,  
        type: 'POST',  
        dataType : 'json',  
        url: '${base}/admin/goods!getGoodsCategoryTreeJson.action', 
        error: function () {
          alert('请求失败');  
        },  
        success:function(data){ 
          zNodes = data; 
        }  
      }); 

      $.fn.zTree.init($("#treeDemo"), setting, zNodes);
      
    });
    
</SCRIPT>

这样,一个下拉框就做完了。

如下图所示:

zTree插件下拉树使用入门教程

如果,需要在修改页面中回写相应的下拉列表数据,添加如下的脚本:

<script type="text/javascript">
$(document).ready(function(){
  if ("${goods.goodsCategory.id}"!="") {
    var treeObj = $.fn.zTree.getZTreeObj("treeDemo");
    var node = treeObj.getNodeByParam("id", "${goods.goodsCategory.id}" , null);
    treeObj.selectNode(node,false , false);
    onClick(event,"${goods.goodsCategory.id}",node,true);
    
  }
});
</script>

以上就是本文的全部内容,希望对大家学习zTree插件有所帮助。

Javascript 相关文章推荐
一个可以随意添加多个序列的tag函数
Jul 21 Javascript
基于dropdown.js实现的两款美观大气的二级导航菜单
Sep 02 Javascript
JS实现可展开折叠层的鼠标拖曳效果
Oct 09 Javascript
jqTransform美化表单
Oct 10 Javascript
全面了解JS中的匿名函数
Jun 29 Javascript
jq给页面添加覆盖层遮罩的实例
Feb 16 Javascript
JavaScript+H5实现微信摇一摇功能
May 23 Javascript
elementUI中Table表格问题的解决方法
Dec 04 Javascript
如何为vuex实现带参数的 getter和state.commit
Jan 04 Javascript
vue element 生成无线级左侧菜单的实现代码
Aug 21 Javascript
Weex开发之WEEX-EROS开发踩坑(小结)
Oct 16 Javascript
JS+HTML5本地存储Localstorage实现注册登录及验证功能示例
Feb 10 Javascript
对jquery的ajax进行二次封装以及ajax缓存代理组件:AjaxCache详解
Apr 11 #Javascript
js创建jsonArray传输至后台及后台全面解析
Apr 11 #Javascript
javascript HTML5 Canvas实现圆盘抽奖功能
Apr 11 #Javascript
详解JavaScript的另类写法
Apr 11 #Javascript
详解jQuery中的empty、remove和detach
Apr 11 #Javascript
JQuery导航菜单选择特效
Apr 11 #Javascript
JavaScript实现图片自动加载的瀑布流效果
Apr 11 #Javascript
You might like
DIY一个适配电脑声卡的动圈话筒放大器
2021/03/02 无线电
如何冲泡挂耳包咖啡?技巧是什么
2021/03/04 冲泡冲煮
PHP print类函数使用总结
2010/06/25 PHP
Zend Framework基本页面布局分析
2016/03/19 PHP
Zend Framework入门教程之Zend_View组件用法示例
2016/12/09 PHP
YII2框架中excel表格导出的方法详解
2017/07/21 PHP
laravel5表单唯一验证的实例代码
2019/09/30 PHP
javascript中onmouse事件在div中失效问题的解决方法
2012/01/09 Javascript
Js(JavaScript)中,弹出是或否的选择框示例(confirm用法的实例分析)
2013/07/09 Javascript
javascript移动设备Web开发中对touch事件的封装实例
2014/06/05 Javascript
JavaScript 变量、作用域及内存
2015/04/08 Javascript
jQuery使用deferreds串行多个ajax请求
2016/08/22 Javascript
jQuery双向列表选择器DIV模拟版
2016/11/01 Javascript
JS返回只包含数字类型的数组实例分析
2016/12/16 Javascript
js按条件生成随机json:randomjson实现方法
2017/04/07 Javascript
vue 项目地址去掉 #的方法
2018/10/20 Javascript
Ant Design Pro 之 ProTable使用操作
2020/10/31 Javascript
[03:33]TI9战队采访 - Infamous
2019/08/20 DOTA
初步认识Python中的列表与位运算符
2015/10/12 Python
python3.4.3下逐行读入txt文本并去重的方法
2018/04/29 Python
Python 实现文件打包、上传与校验的方法
2019/02/13 Python
Python中函数的基本定义与调用及内置函数详解
2019/05/13 Python
基于python3的socket聊天编程
2020/02/17 Python
python实现简单猜单词游戏
2020/12/24 Python
机关门卫的岗位职责
2014/04/29 职场文书
卫生系统先进事迹
2014/05/13 职场文书
物流专业求职信
2014/06/30 职场文书
学习朴航瑛老师爱岗敬业先进事迹思想汇报
2014/09/17 职场文书
2014年招生工作总结
2014/11/26 职场文书
2015年小学重阳节活动总结
2015/07/29 职场文书
小学生法制教育心得体会
2016/01/14 职场文书
深入解析NumPy中的Broadcasting广播机制
2021/05/30 Python
撤回我也能看到!教你用Python制作微信防撤回脚本
2021/06/11 Python
Go语言基础知识点介绍
2021/07/04 Golang
关于HTML编码导致的乱码问题
2021/09/04 HTML / CSS
Python 恐龙跑跑小游戏实现流程
2022/02/15 Python