ztree插件封装

这个是一个基于ztree插件封装的可以直接调用的插件,所用框架为:jquery、bootstrap,插件封装源码为:

;

$(function () {
    window.ZtreePanel = function () {
        var reg = new RegExp("\\[([^\\[\\]]*?)\\]", 'igm');
        // 参数配置
        var config = {
            depositNameArray: [],//记录选中节点的名称;
            depositIdArray: [] //记录选中节点的Id号;
        };
        // ztree复选的配置
        var settingCheckBox = {
            check: {enable: true, chkStyle: 'checkbox'},
            view: {dblClickExpand: true, showLine: true, txtSelectedEnable: false
            },
            data: {simpleData: {enable: true, idKey: "id", pIdKey: "pId", rootPId: ""}},
            // 回调事件
            callback: {
                beforeClick: function () {
                    return false;
                }
            }
        };
        // ztree单选配置
        var settingRadio = {
            check: {
                enable: false//不显示勾选框
            },
            view: {
                dblClickExpand: false,
                showLine: true,
                selectedMulti: false,     // 不支持 同时选中多个节点
                autoCancelSelected: false  //不支持 配合 Ctrl 或 Cmd 键进行取消节点选择的操作
            },
            data: {
                simpleData: {
                    enable: true,
                    idKey: "id",
                    pIdKey: "pId",
                    rootPId: ""
                }
            }
        };
        // jquery对象的面板代码
        var getHtml = function () {
            var Html;
            $.ajax({
                url: "ztreepanel.html",
                async: false,
                dataType: "html",
                cache: true,//使用缓存,从缓存中获取
                success: function (data) {
                    Html = data;
                }
            });
            return Html;
        };


        /**
         * 主要的树形结构
         * @param obj 传入的主调函数
         */
        var _showBoxSearch = function (obj) {
            /*默认的参数信息*/
            var defaultParams = {
                target: '',
                titleName: '部门列表',
                flag: 'checkbox',
                searchData: {},
                showUser: false, //只选择用户的条件
                caseReason: false, //案由选择叶子节点
                success: null ,
                initFilterData:{},
                expand: true //默认要展开全部,为false不展开
            };
            //将用户配置的参数和自己传入的参数进行交换
            var obj = $.extend(defaultParams, obj);
            //转换成jquery对象
            var treeHtml = $(getHtml());
            /*替换模板dom结构里面的内容*/
            var html = treeHtml.html().replace(reg, function (node, key) {
                return {Title: defaultParams.titleName}[key];
            });
            treeHtml.html(html);
            // 判断ztree复选的配置的对于父子节点的关联关系
            if (obj.flag === "checkbox") {
                settingCheckBox.check.chkboxType = {"Y":'', "N": ''}
            }
            // 数据加载的区域
            var searchTree = treeHtml.find("#zTree");
            //按钮注册事件
            setBtnMethod(searchTree, treeHtml, obj);
            var dataList = getDataInit(obj);
            if (obj.showUser) {
                changeUserIcon(dataList);
            }
            $.fn.zTree.init(searchTree, obj.flag == "checkbox" ? settingCheckBox : settingRadio, dataList);
            //将树形列表插入到body中
            $(document.body).append(treeHtml);
            //设置树形结构的初始化状态
            defaultSelect(obj);
            // 将生成的checkbox面板追加到页面中
            if ($("#modal-bg").attr("class") === "modal-bg modal-backdrop fade in") {
                $("#modal-bg").css({"z-index": "3100"});
            } else {
                $("#modal-bg").addClass("modal-backdrop fade in");// 模态
            }
            //下面控制勾选的状态, 防止回显数据乱勾选
            var treeObj = $.fn.zTree.getZTreeObj("zTree");
            var type = {"Y": obj.Y, "N": obj.N};
            if(obj.Y && obj.N){
            treeObj.setting.check.chkboxType = type;
            }
            // 初始化查询出来的数据,第一次加载进来
            if(obj.flag === "checkbox"){
            //事件委托
                checkSetting(treeObj, treeHtml);
            }else{
            treeHtml.find('[data-toggle="popover"]').remove();
            treeHtml.find('input[type=text]').css("width", "285px");
            }
        };
        
        var checkSetting = function(treeObj, treeHtml){
        var popHtml = $("<div class='row ztreePanelPop'>" +
            "<div class='col-xs-6'><label>勾选关联子集&nbsp;<input type='checkbox' value='1'/></label></div>" +
            "<div class='col-xs-6'><label>勾选关联父集&nbsp;<input type='checkbox' value='2'/></label></div>" +
"</div>");
        //提示弹框面板,用户设置勾选方式
            treeHtml.find("[data-toggle=popover]").popover({
            html: true,
            content: popHtml,
            title:'勾选设置',
            trigger:'click',
            placement:'left'
            });
        //使用事件代理
            $(".dialog-tree").delegate("input[type=checkbox]","click", function(){
            var Ys = '',Yp = '',Ns = '',Np = '',valType;
            var $val = $(".ztreePanelPop").find(":checkbox:checked");
            if($val.length === 0){
            valType = {"Y": '' ,"N": ''};
            }
            $.each($val, function(index, value){
            var val = $(this).val();
            switch (val) {
case "1": Ns = 's';Ys = 's'; break;
default: Yp = 'p'; Np = 'p'; break;
}
            //拼接设置
            valType = {"Y": Yp + Ys ,"N": Np + Ns};
            });
            treeObj.setting.check.chkboxType = valType;
            });
        };
        
        /**
         * 设置树形结构的初始化状态开始
         *
         * @param obj 显示的对象
         */
        var defaultSelect = function (obj) {
            var treeObj = $.fn.zTree.getZTreeObj("zTree");
            var nodes = $(obj.target).find(".searchKeyId").val();
            //初始化选中节点
            if (nodes) {
                var nodesArr = nodes.split(",");
                var selectNode;
                for (var i = 0; i < nodesArr.length; i++) {
                    selectNode = treeObj.getNodeByParam("id", nodesArr[i]);
                    if ("radio" === obj.flag) {
                        //treeObj.selectNode(selectNode);//单选框设置为选中文本;//单选框不设置选中,这样才可以清空文本框
                    } else {
                        treeObj.checkNode(selectNode, true, true);//复选框设置为选中勾选框;
                    }
                }
            }
            if(obj.expand){
            // 展开所有的节点
                treeObj.expandAll(true);
            }
        };


        /**
         * 注册按钮的事件
         *
         * @param searchTree 搜索关键节点
         * @param treedom 树形dom结构
         * @param obj 对象
         */
        var setBtnMethod = function (searchTree, treedom, obj) {
            // 注册搜索按钮的事件
            treedom.find(".info-search").on("click", function () {
                var keySearch = treedom.find("input[name=keySearch]").val();
                //对于默认的参数进行追加
                obj.searchData.name = keySearch;
                var searchKeyObject = $.extend(obj.searchData, obj.initFilterData);
                getListDataSearch(searchTree, obj.flag == "checkbox" ? settingCheckBox : settingRadio, obj.searchData, obj.url);
            });
            // 注册提交按钮的事件
            treedom.find(".btn-primary").on("click", function () {
                submitBtn(obj.target, this, obj);
            });
        };


        /**
         * 搜索框输入信息后进行树形菜单重新加载
         *
         * @param searchTree 数据加载的区域
         * @param setting 参数配置
         * @param keySearch 收缩关键字
         * @param url 搜索的url
         */
        var getListDataSearch = function (searchTree, setting, keySearch, url) {
            $.fn.zTree.init(searchTree, setting, getSearchListData(keySearch, url));
        };


        /**
         * 搜索数据的显示
         *
         * @param keySearch 搜索关键字
         * @param url 收缩的url地址
         * @returns 返回得到的json数据
         */
        var getSearchListData = function (keySearch, url) {
            var result;
            $.ajax({
                url: url,
                dataType: 'json',
                type: "POST",
                data: keySearch,
                async: false,
                cache: true,
                success: function (json) {
                    result = json['data']
                }
            });
            return result;
        };


        /**
         * 初始化数据
         * @param url 请求的url地址
         * @returns {*} 返回请求成功的数据
         */
        var getDataInit = function (obj) {
            var result;
            $.ajax({
                url: obj.url,
                dataType: 'json',
                type: "POST",
                data: obj.initFilterData ,
                cache: true,
                async: false,
                success: function (json) {
                    result = json['data']
                }
            });
            return result;
        };


        /**
         * 更改用户的图标
         * @param zNodes
         */
        var changeUserIcon = function (zNodes) {
            if (zNodes) {
                $.each(zNodes, function (index, value) {
                    var $person = value;
                    //更换图标
                    if ($person["type"] === 3) {
                        $person["iconSkin"] = "usericon";
                    }
                    $person.chkDisabled = false;
                });
            }
        };


        /**
         * 点击确定填充值
         */
        var printValue = function(obj){
        var tree = $.fn.zTree.getZTreeObj("zTree");
        var nodes =  (obj.flag === "checkbox") ? tree.getCheckedNodes(true) : tree.getSelectedNodes();
            //每次初始化选中的节点
            config.depositNameArray.length = 0;
            config.depositIdArray.length = 0;
            if ((null !== nodes) && (nodes.length > 0)) {
            if (obj.flag === "checkbox") {
            for (var i = 0; i < nodes.length; i++) {
                        inConditionSelect(obj, nodes[i]);
                    }
                } else {
                inConditionSelect(obj, nodes[nodes.length - 1]);
                }
            }
        };
        
        /**
         * 根据业务选择不同的节点
         * 可扩展
         */
        var inConditionSelect = function(obj, node){
        //用于用户绑定  选择用户
        if (obj.showUser) {
        if (!((!node.children) && (node.type === 3))) {
                    return false;
                }
        //案由选择  案件-案由-选择根节点
       } else if (obj.caseReason){
        if (!((!node.children) && (node.end === 0))) {
        return false;
                }
       }
        config.depositNameArray.push(node.name);
            config.depositIdArray.push(node.id);
        };
        


        /**
         * 提交按钮向表单填值
         *
         * @param target 关闭选择框
         * @param arr 上下文ID
         * @param flag 是复选框还是单选框
         * @param success 回调函数
         */
        var submitBtn = function (target, arr, obj) {
            //获取选中的节点信息
            printValue(obj);
            //填写数据信息
            $(target).find(".searchKeyName").val(config.depositNameArray.join(","));
            $(target).find(".searchKeyId").val(config.depositIdArray.join(","));
            //回调函数
            if (obj.success instanceof Function) {
                obj.success.apply(this, [config.depositNameArray, config.depositIdArray]);
            }
            //显示的样式处理
            if ($("#modal-bg").attr("style")) {
                $("#modal-bg").removeAttr("style");
                $(arr).parents(".panel").remove();
            } else {
                toolMethod.closePanel(arr, true, true);
            }
        };
        return {
            tree: _showBoxSearch
        }
    }();

});


ztreepanel.html:模板代码为(bootstrap框架)



调用方式为:

ZtreePanel.tree({
            target: target, //节点id或者class,如#content
            titleName: title, //展示的panel名称
            flag: flag, //单选还是多选框,'radio'或者'checkbox'
            url: url, //请求后台数据地址
            success : function(name, nodeId) { // name,id} //树形勾选节点成功后的回调函数
        });

其中,target这个节点是用于放置树形选择器选择完毕后勾选的值和隐藏id;参数target和url必选,其余参数选用。

html书写方式为:

<div id="content">
            <label>名称</label>
            <input type="text" class="searchKeyNam">  <-- 隐藏域  放置节点名称-->
            <input type="text" class=" hidden searchKeyId">  <-- 隐藏域  放置id-->
   <button class="btn btn-info" id="" type="button" οnclick="ZtreePanel.tree({'#searchCaseReason','案由列表', 'checkbox' ,url});">

</div>

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
ZTree是一个基于jQuery的树形结构插件,可以用于显示树形菜单、目录结构等。在Vue项目中使用ZTree,需要先安装ZTree插件,然后在Vue组件中引入和使用。 步骤如下: 1. 在Vue项目中安装ZTree插件: ``` npm install jquery ztree --save ``` 2. 在Vue组件中引入jQueryZTree插件: ```javascript import $ from 'jquery' import 'ztree/js/jquery.ztree.all.min.js' import 'ztree/css/metroStyle/metroStyle.css' ``` 其中,`jquery.ztree.all.min.js`是ZTree的核心文件,`metroStyle.css`是一款ZTree的皮肤。 3. 在Vue组件中定义一个div元素,用于显示ZTree: ```html <template> <div id="tree"></div> </template> ``` 4. 在Vue组件的`mounted`钩子函数中,初始化ZTree,并将数据渲染到树形菜单中: ```javascript mounted() { // 初始化ZTree let setting = { view: { selectedMulti: false }, data: { simpleData: { enable: true } }, callback: { onClick: this.onClick } } let zNodes = [ { id:1, pId:0, name:"父节点 1", open:true}, { id:11, pId:1, name:"子节点 1-1"}, { id:12, pId:1, name:"子节点 1-2"}, { id:13, pId:1, name:"子节点 1-3"}, { id:2, pId:0, name:"父节点 2", open:true}, { id:21, pId:2, name:"子节点 2-1"}, { id:22, pId:2, name:"子节点 2-2"}, { id:23, pId:2, name:"子节点 2-3"}, { id:3, pId:0, name:"父节点 3", open:true}, { id:31, pId:3, name:"子节点 3-1"}, { id:32, pId:3, name:"子节点 3-2"}, { id:33, pId:3, name:"子节点 3-3"} ] $.fn.zTree.init($("#tree"), setting, zNodes) }, methods: { // 点击节点事件 onClick(event, treeId, treeNode) { console.log(treeNode.name) } } ``` 其中,`zNodes`变量是一个数组,用于存储树形菜单的数据。`setting`变量是一个对象,用于配置ZTree的属性,例如是否允许多选、数据格式等。`$.fn.zTree.init`方法用于初始化ZTree,其中`$("#tree")`表示树形菜单的容器元素,`setting`表示ZTree的配置,`zNodes`表示树形菜单的数据。 5. 最终效果如下图所示: <img src="https://i.loli.net/2022/01/08/aJZ9zVX8q3WOhlY.png" alt="ztree-demo.png" style="zoom:50%;" />

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值