zoukankan      html  css  js  c++  java
  • ztree树形插件

    在开发项目中需要用到树插件,近期研究了几款树插件,好记性不如烂笔头 ,写下来  以后好查

    MzTreeView(梅花雪) 很经典的树形菜单脚本控件 菜单树展示加载速度快 支持1w条以上大数据

    缺点--不能动态修改 刷新 兼容性不好  官网没有再继续维护

    最近因开发需求在寻找开源树形插件 研究了一下ztree --jQuery 树插件,很不错的一款树形插件 关键是兼容性比较好

    网址:http://www.ztree.me/v3/main.php#_zTreeInfo

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

    后续继续更新自己研究的内容

     由于官网的Demo 异步都是用php代码编写,于是自己动手了写了几个简单的Demo

    1、只作树的展示(异步)使用的是简单树

    脚本:需要引用JQuery、jquery.ztree.core-3.5.js 类库

     1  function setting() {
     2             var setting = {
     3                 data: {
     4                     view: {
     5                         dblClickExpand: false
     6                     },
     7                     simpleData: {
     8                         enable: true
     9                     }
    10                 },
    11                 async: {
    12                     enable: true,
    13                     url: "GetTreeData.aspx",
    14                     autoParam: ["id", "name", "level"],
    15                     otherParam: { "otherParam": "zTreeAsyncTest", "Method": "GetTreeData", "casetype": $("input:radio:checked").val() },
    16                     dataFilter: filter
    17                 },
    18                 callback: {
    19                     beforeClick: beforeClick
    20 
    21                 }
    22             };
    23             return setting;
    24         }
    25 
    26 
    27         function filter(treeId, parentNode, childNodes) {
    28             if (!childNodes) return null;
    29             for (var i = 0, l = childNodes.length; i < l; i++) {
    30                 childNodes[i].name = childNodes[i].name.replace(/.n/g, '.');
    31             }
    32             return childNodes;
    33         }
    34 
    35         //单击进行刷新
    36         function beforeClick(treeId, treeNode) {
    37             var check = (treeNode && !treeNode.isParent);
    38             //如果是父节点单击打开子节点
    39 
    40             if (!check) {
    41                 var zTree = $.fn.zTree.getZTreeObj("tree");
    42                 //只展开本节点的第一级子节点
    43                 zTree.expandNode(treeNode, true, false, true);
    44 
    45                 //可通过单击进行刷新和展开
    46                 //                if (treeNode.zAsync) {
    47                 //                   //已经异步加载过的强制重新加载(刷新)
    48                 //                    zTree.reAsyncChildNodes(treeNode, "refresh", null);
    49                 //                }
    50                 //                else {
    51                 //单击展开
    52                 //                     zTree.expandNode(treeNode, true, true, true);
    53                 //                }
    54             }
    55             return true;
    56         }
    57 
    58         $(document).ready(function () {
    59             $.fn.zTree.init($("#tree"), setting());
    60 
    61             $("input:radio").change(function () {
    62                 $.fn.zTree.init($("#tree"), setting());
    63             });
    64 
    65             //刷新
    66             $("#btnrefresh").click(function () {
    67                 var zTree = $.fn.zTree.getZTreeObj("tree");
    68                 var selectednotes = zTree.getSelectedNodes();
    69                 //获取的是集合
    70                 //必须通过循环进行加载获取选中的子节点
    71                 for (var i = 0, l = selectednotes.length; i < l; i++) {
    72                     //                    alert(selectednotes[i].name);
    73                     zTree.reAsyncChildNodes(selectednotes[i], "refresh", null);
    74                 }
    75 
    76             });
    77 
    78         });

    前台页面:

    做一个可以切换的树

    <input type="radio" value="USECASE" name="ustype" id="usecase" checked="checked" />用例
        <input type="radio" value="CR" name="ustype" id="CR" />CR &nbsp;&nbsp;
        <img src="../../../Images/reload.png" id="btnrefresh" style="cursor: pointer" />
        <fieldset style="overflow: auto" style="height: 500px">
            <div class="zTreeDemoBackground left">
                <ul id="tree" class="ztree">
                </ul>
            </div>
        </fieldset>

     后台请求数据页面处理:

    GetTreeData.aspx

    //根据请求的数据拼接代码生成Json对象

     1  protected void Page_Load(object sender, EventArgs e)
     2     {
     3         if (!LTMS.BLL.PRM.UserInfo.CheckUserLogin(Page, out _LoginUser)) { return; }
     4 
     5         if (Request.Params["id"] != null)
     6         {
     7             ID = Request.Params["id"].ToString();
     8         }
     9         else
    10         {
    11             ID = "0";
    12         }
    13 
    14 
    15         if (Request.Params["level"] != null)
    16         {
    17             Level = Request.Params["level"].ToString();
    18         }
    19         else
    20         {
    21             Level = "-1";
    22         }
    23 
    24         if (Request.Params["Method"] != null)
    25         {
    26             Method = Request.Params["Method"].ToString();
    27         }
    28 
    29         if (Request.Params["casetype"] != null)
    30         {
    31             CaseType = Request.Params["casetype"].ToString();
    32         }
    33 
    34         //映射
    35         Type type = this.GetType();
    36         MethodInfo method = type.GetMethod(Method);
    37         if (method != null)
    38         {
    39             method.Invoke(this, null);
    40         }
    41     }
    42 
    43 
    44   /// <summary>
    45     /// 获取用例库
    46     /// </summary>
    47     /// <returns></returns>
    48     public void GetTreeData()
    49     {
    50         IList<SWT_UseCase_Module_Model> _infos;
    51         StringBuilder jsonstr = new StringBuilder();
    52 
    53         if (Level == "-1")
    54         {
    55             //用例库顶级大节点,需要经权限筛选
    56             _infos = UseCaseModule.GetListArray("UseCase", 1, _LoginUser, CaseType, "");
    57             //_infos = UseCaseModule.GetListArray("UseCase", _LoginUser);
    58         }
    59         else
    60         {
    61             //非用例库顶级大节点,无需权限筛选
    62             //_infos = UseCaseModule.GetTreeData(Convert.ToInt64(ID));
    63             _infos = UseCaseModule.GetListArray(new string[] { "MODULE_FATHERID=" + ID });
    64         }
    65 
    66         ///创建资讯树
    67         string url = "ModuleContent.aspx?id=";
    68 
    69         foreach (SWT_UseCase_Module_Model _mode in _infos)
    70         {
    71             //换行需要json转义
    72             jsonstr.AppendFormat("{{"id":{0},"name":"{1}","pId":{2},"url":"{3}","target":"{4}"", _mode.Module_ID, _mode.Module_Name.Replace("
    ", " ").Replace("
    ", " "), _mode.Module_FatherID, url + _mode.Module_ID + "&Type="+CaseType, "mid_frame");
    73             if (UseCaseModule.ExistsBywhere("MODULE_FATHERID=" + _mode.Module_ID))
    74             {
    75                 jsonstr.Append(",isParent:true");
    76             }
    77             jsonstr.Append("},"); 
    78         }
    79 
    80         //移除最后一个,
    81         if (jsonstr.ToString().EndsWith(","))
    82         {
    83             jsonstr = jsonstr.Remove(jsonstr.Length-1, 1);
    84         }
    85        
    86         _infos = null;
    87         Response.Write("["+jsonstr.ToString()+"]");
    88 
    89     }
    View Code

    2、用户搜索树控件
    难点:ztree 在demo中的搜索只将搜索结果加粗显示 跟预期结果显示查询的结果不一致 解决这个问题,我采用的方式是将树清空 重新加载查询结果

    主要是脚本页面

       function dblClickExpand(treeId, treeNode) {
                return treeNode.level > 0;
            }
    
            function filter(treeId, parentNode, childNodes) {
                if (!childNodes) return null;
                for (var i = 0, l = childNodes.length; i < l; i++) {
                    childNodes[i].name = childNodes[i].name.replace(/.n/g, '.');
                }
                return childNodes;
            }
    
            //查询
            function search() {
                //搜索框为空时,重新绑定
                if ($("#username").val() == "") { $.fn.zTree.init($("#tree"), setting()); return; }
                //异步加载
                $.ajax({
                    url: "../Control/GetNodes.aspx",
                    //             url:"../Control/GetNodes.ashx",
                    type: "post",
                    dataType: "text",
                    async: true,
                    data: { "command": "GetSearchNodes", "group": $("input:radio:checked").val(), "username": $("#username").val() },
                    beforeSend: function () { $("#search").attr("disabled", "disabled").val("搜索中..."); },
                    success: function (data) {
                        //eval将返回来的json字符串转换成json对象
                        var json = eval(data);
                        $.fn.zTree.init($("#tree"), setting(), json);
    
                    },
                    error: function (textStatus, errorThrown) {
                        //请求出错处理
                        alert("错误:" + textStatus + errorThrown.toString());
                    },
                    complete: function () {
                        $("#search").attr("disabled", "").val("搜索");
                    }
                });
            }
    
            //动态添加的元素不会有加载原来的脚本的事件 需要手动添加onclick事件
            function deleteNodes(btnDelete) {
                //parents过滤
                $(btnDelete).parents("li").remove();
            }
    
            function beforeClick(treeId, treeNode) {
                var check = (treeNode && !treeNode.isParent);
                //如果是父节点单击打开子节点
                if (!check) { var zTree = $.fn.zTree.getZTreeObj("tree"); zTree.expandNode(treeNode, null, true, true); }
                //            alert("只能选择人员..."); 
                return check;
            }
    
            function onClick(e, treeId, treeNode) {
                var zTree = $.fn.zTree.getZTreeObj("tree"),
                nodes = zTree.getSelectedNodes(),
                v = "";
                nodes.sort(function compare(a, b) { return a.id - b.id; });
                for (var i = 0, l = nodes.length; i < l; i++) {
                    //cursor:pointer; CSS 2.0 标准 google支持
                    v += "<li><span style='cursor:pointer;'><div class='selectednodes' onclick='deleteNodes(this)'>" + nodes[i].name + "<div></span></li>";
                }
                if (v.length > 0) v = v.substring(0, v.length - 1);
                var SelectedObj = $("#selected");
                SelectedObj.html(SelectedObj.html() + v);
            }
    
            //将设置转换成函数 --好处:设置参数里面有变量 ,可以定时获取最新的
            function setting() {
                var setting = {
                    data: {
                        view: {
                            dblClickExpand: false
                        },
                        simpleData: {
                            enable: true
                        }
    
                    },
                    async: {
                        enable: true,
                        //                url:"../Control/GetNodes.ashx",
                        url: "../Control/GetNodes.aspx",
                        autoParam: ["id", "name", "level"],
                        otherParam: { "otherParam": "zTreeAsyncTest", "command": "GetChildrenNodes", "group": $("input:radio:checked").val(), "username": $("#username").val() },
                        dataFilter: filter
                    },
                    callback: {
                        beforeClick: beforeClick,
                        onClick: onClick
    
    
                    }
    
                };
                return setting;
            }
    
    
            $(document).ready(function () {
                //过滤掉其他没用的enter
                //            document.onkeydown = function () {
                //                if (event.srcElement.type != 'button' &&
                //  event.srcElement.type != 'image' && event.srcElement.type != 'submit'
                //  && event.srcElement.type != 'textarea' && event.keyCode == 13)
                //                { event.keyCode = 9; }
    
                //            }
    
                $(document).keydown(function () {
                    if (event.srcElement.type != 'button' &&
                      event.srcElement.type != 'image' && event.srcElement.type != 'submit'
                      && event.srcElement.type != 'textarea' && event.keyCode == 13)
                    { event.keyCode = 9; }
                });
    
                //初始化
                $.fn.zTree.init($("#tree"), setting());
    
                //查询
                $("#search").click(function () {
                    search();
                    //                if ($("#username").val() == "") { $.fn.zTree.init($("#tree"), setting()); return; }
                    //                $.fn.zTree.init($("#tree"), setting());
                    //                var zTree = $.fn.zTree.getZTreeObj("tree");
                    //异步加载全部
                });
    
    
                $("#username").keydown(function () {
                    if (event.keyCode == 13) {
                        search();
                    }
                });
    
                $("#btnOK").click(function () {
                    $("#hidden").val($("#selected").text().replace(/.n/g, '').replace(" ", ','));
                    alert($("#selected").text().replace(/.n/g, '').replace(" ", ','));
                });
    
                $("input:radio").change(function () {
                    //重置成空
                    $("#username").val("");
                    $("#selected").html("");
                    //重新加载
                    $.fn.zTree.init($("#tree"), setting());
                });
    
            });
    View Code

     Html页面

    <fieldset style=" 700px">
            <div>
                <input id="MIDH" type="radio" name="group" value="1" />类别1
                <input id="SYS" type="radio" name="group" value="2" checked="checked" />类别2
                       </div>
            <div>
                <input type="text" style="float: left" id="username" />
                <input type="button" value="搜索" id="search" />
                <ul id="tree" class="ztree" style="float: left">
                </ul>
                <ul id="selected" class="ztree" style="float: left">
                </ul>
            </div>
        </fieldset>
        <br />
        <input type="button" id="btnOK" value="确定" />
        <input type="hidden" id="hidden" />
    View Code

      以上是我个人研究的一些东西写出来跟大家分享一下,有不合理的地方还望指正

       作者:雨的点滴

      出处:http://www.cnblogs.com/yudeyinji/articles/3488269.html

      欢迎转载,但须保留版权

     

  • 相关阅读:
    #20175120彭宇辰 java第五周学习总结
    结对学习创意照
    #20175120彭宇辰 java第四周总结
    《Java程序设计》第3周学习总结
    # 20175120 2018.3.10 《Java程序设计》第2周学习总结
    20175303柴轩达 信息安全系统设计基础第四周学习总结
    信息安全系统设计基础第三周学习总结
    20175303 《信息安全系统设计基础》第一周学习总结
    20175303柴轩达答辩项目代码链接整合
    团队作业(五):冲刺总结
  • 原文地址:https://www.cnblogs.com/yudeyinji/p/3488269.html
Copyright © 2011-2022 走看看