树形下拉框,结合ztree

news2025/1/20 5:52:51

1、首先引入jq 以及ztree.js 测试版本的jq是2.1.4

jauery 在线链接
https://cdn.bootcdn.net/ajax/libs/jquery/2.1.4/jquery.min.js

以下代码为ztree-select.js

/**
 * 下拉树
 * 务必先引入 jQuery 和 zTree
 */
(function($) {

    function TreeSelect() {
        var ts = new Object();
        ts.key = "xxx";
        ts.$input = null;
        ts.$selDiv = null;
        ts.$selUl = null;
        ts.$zTree = null;

        /**
         * 初始化下拉树
         * @param key
         * @param data
         */
        ts.initialize = function(key, data) {
            ts.key = key;
            ts.initInput();
            ts.initTree(data);

            ts.$input.bind("keyup", function() {
                ts.changeInput();
            });

            $("body").bind("click", ts.bodyClick);
        };

        /**
         * 初始化输入框
         */
        ts.initInput = function() {
            ts.$input = $("#" + ts.key);
            var input_w = ts.$input.width();
            var input_h = ts.$input.height();

            ts.$input.parent().css({
                "position": "relative",
                "display": "inline-block",
                "min-width": input_w,
                "min-height": input_h,
                "margin": "auto",
                "vertical-align": "middle"
            });
            ts.$input.css({
                "position": "absolute",
                "margin-left": "2px"
            });

            ts.$input.bind("focus", function() {
                ts.openTree();
            });

        };

        /**
         * 初始化树结构
         * @param data
         */
        ts.initTree = function(data) {
            var window_h = $(window).height();

            var input_x = ts.$input.offset().left;
            var input_y = ts.$input.offset().top;
            var input_w = ts.$input.outerWidth();
            var input_h = ts.$input.outerHeight();
            var div_w = input_w;
            var div_max_h = (window_h - input_y - input_h) * 0.8;

            var html = '<div id="sel_div_' + ts.key + '">' +
                '<ul id="sel_ul_' + ts.key + '" class="ztree"></ul>' +
                '</div>';
            ts.$input.after(html);

            ts.$selDiv = $("#sel_div_" + ts.key);
            ts.$selDiv.offset({
                "left": input_x,
                "top": input_y + input_h + 1 //1px的缝隙
            });
            ts.$selDiv.css({
                "position": "absolute",
                "width": div_w,
                "max-width": div_w,
                "max-height": div_max_h,
                "overflow-x": "auto",
                "overflow-y": "auto",
                "background-color": "#F7F7F7",
                "z-index": 2147483647
            });

            ts.$selUl = $("#sel_ul_" + ts.key);
            ts.$selUl.css({
                "margin": 0,
                "padding": 0
            });

            $.fn.zTree.init(ts.$selUl, {
                callback: {
                    onClick: ts.clickTree
                },
                view: {
                    showLine: true,
                    showTitle: true,
                    selectedMulti: false,
                    expandSpeed: "fast"
                },
                data: {
                    key: {
                        name: "name"
                    },
                    simpleData: {
                        enable: true,
                        idKey: "id",
                        pIdKey: "pid"
                    }
                }
            }, data);

            ts.$zTree = $.fn.zTree.getZTreeObj("sel_ul_" + ts.key);
        };

        /**
         * 改变输入值
         */
        ts.changeInput = function() {
            // var input_val = ts.$input.val();
            // input_val = input_val.trim().toLowerCase();
            // if ("" == input_val) {
            //     ts.$zTree.expandAll(false);
            //     return;
            // }

            var findNode = ts.$zTree.getNodesByFilter(function(node) {
                if (node && node["name"].toLowerCase().indexOf(input_val) > -1) {
                    ts.$zTree.selectNode(node, false); //单一选中
                    return true;
                }
                return false;
            }, true); //只找第一个

            if (findNode && !findNode.isParent) {
                var parentNode = findNode.getParentNode();
                var expands = new Set();
                do { //展开符合的节点及其父、祖节点
                    expands.add(parentNode["id"]);
                    ts.$zTree.expandNode(parentNode, true, false, true);
                    parentNode = parentNode.getParentNode();
                } while (parentNode);

                var openNodes = ts.$zTree.getNodesByFilter(function(node) {
                    if (node && node.isParent && node.open && !expands.has(node["id"])) {
                        return true;
                    }
                    return false;
                }, false); //找一群
                if (openNodes && openNodes.length > 0) {
                    for (var i = 0; i < openNodes.length; i++) {
                        //关闭不符合的其他父节点
                        ts.$zTree.expandNode(openNodes[i], false, true, false);
                    }
                }
            } else {
                ts.$zTree.expandAll(false);
            }
        };

        /**
         * 点击树节点
         */
        ts.clickTree = function(event, treeId, treeNode) {
            if (treeNode && treeNode.isParent) { 可选父级
                ts.$input.val(treeNode["name"]);
                ts.$input.attr("id",treeNode["id"]); //可拿到相应的数据放置在input中
                ts.closeTree();
            }
            if (treeNode && !treeNode.isParent) { //只能选择最后一个层级
                ts.$input.val(treeNode["name"]);
                ts.$input.attr("id",treeNode["id"]);
                ts.closeTree();
            }
        };

        /**
         * 点击输入框和树结构之外的部分
         * @param event
         */
        ts.bodyClick = function(event) {
            var x1 = ts.$input.offset().left;
            var y1 = ts.$input.offset().top;
            var width = ts.$input.outerWidth();
            var height = ts.$input.outerHeight() + ts.$selDiv.outerHeight() + 1; //1px的缝隙
            var x2 = x1 + width;
            var y2 = y1 + height;

            var x = event.clientX;
            var y = event.clientY;
            if (x < x1 || x2 < x || y < y1 || y2 < y) {
                ts.closeTree();
            }
        };

        /**
         * 关闭树结构
         */
        ts.closeTree = function() {
            ts.$selDiv.hide();
        };

        /**
         * 展开数节点
         * @param key
         * @param options
         */
        ts.openTree = function() {
            ts.$selDiv.show();
        };

        /**
         * 树结构位置微调
         */
        ts.treeOffset = function() {
            //TODO
        };

        return ts;
    }

    /**
     * 主调方法
     * @param data
     * @returns {TreeSelect}
     */
    $.fn.treeSelect = function(data) {
        var key = this.attr("id");

        var ts = new TreeSelect();
        ts.initialize(key, data);
        ts.closeTree();

        return ts;
    }

})(jQuery);

2、新建html页面 引入上述三个文件后,手动写一个json此处以省市来展示

function getData() {
        // ajax get data
        var data = [{
            "name": "江苏",
            "pid": 0,
            "id": -1,
            "icon": "images/js.png"
        }, {
            "name": "浙江",
            "pid": 0,
            "id": -2,
            "icon": "images/zj.png"
        }, {
            "name": "上海",
            "pid": 0,
            "id": -3,
            "icon": "images/sh.png"
        }, {
            "name": "苏州",
            "pid": -1,
            "id": 1,
            "icon": "images/sz.png"
        }, {
            "name": "无锡",
            "pid": -1,
            "id": 2,
            "icon": "images/wx.png"
        }, {
            "name": "常州",
            "pid": -1,
            "id": 3,
            "icon": "images/cz.png"
        }, {
            "name": "杭州",
            "pid": -2,
            "id": 4,
            "icon": "images/hz.png"
        }, {
            "name": "宁波",
            "pid": -2,
            "id": 5,
            "icon": "images/nb.png"
        }];
        return data;
    }

3、在页面中调用该定义

<body>
    <div>
        <input id="ts_input">
    </div>
</body>
$(function() {
         var data = getData();
        // 一句话搞定
        $("#ts_input").treeSelect(data);
});

4、同时引入两个图片,文件夹需要跟js同级,文件名称为img

4、展示效果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/951259.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SQL Server 2019导入txt数据

1、选择导入数据 2、选择Flat file Source 选择文件&#xff0c;如果第一行不是列名&#xff0c;就不勾选。 3、下一步 可以看看数据是否是对的 4、下一步 选择SQL server Native Client 11&#xff0c;数据库选择导入进的库 输入连接数据库的名字和要导入的数据库 下一…

YOLOV8改进:更换为MPDIOU,实现有效涨点

1.该文章属于YOLOV5/YOLOV7/YOLOV8改进专栏,包含大量的改进方式,主要以2023年的最新文章和2022年的文章提出改进方式。 2.提供更加详细的改进方法,如将注意力机制添加到网络的不同位置,便于做实验,也可以当做论文的创新点。 2.涨点效果:更换为MPDIOU,实现有效涨点! 目录…

联合办公空间适合的人群类型

联合办公空间适合以下几类群体租赁&#xff1a; 创业公司和初创企业&#xff1a;联合办公为创业公司和初创企业提供了一个低成本、低风险的办公场所&#xff0c;这些公司通常不需要承担长期租赁办公室的高成本和风险。自由职业者和个体工作者&#xff1a;联合办公提供了一个具…

分布式锁的三种实现方式是什么?

分布式锁三种实现方式&#xff1a; 基于数据库实现分布式锁&#xff1b;基于缓存&#xff08;Redis等&#xff09;实现分布式锁&#xff1b;基于Zookeeper实现分布式锁&#xff1b; 一&#xff0c; 基于数据库实现分布式锁 悲观锁 利用select … where … for update 排他锁…

云表新技术+新模式,无代码平台为企业数字化转型开辟新出路

8月22日&#xff0c;一场令人耳目一新的公益培训在重庆市渝北区举行。这是一场关于企业管理赋能和数字化转型的免费培训&#xff0c;云表平台为企业带来了颠覆式的新技术和新模式&#xff0c;同时也为企业数字化转型开启了新出路&#xff0c;来自重庆各区县和周边省市的30余家企…

让AI数字人具有不一样的“灵魂”,未来数字人主战场在垂直场景中

从网页到App&#xff0c;再到数字人。人类一直在视图模仿和复制真实的人类的沟通交流方式。但是由于技术、时代的局限&#xff0c;数字人离想象中的形象还有点差距。如今&#xff0c;随着AI技术的发展&#xff0c;数字人正逐步成为我们生活的存在。 在谈到数字人的过去时&#…

MPI之MPI_Sendrecv接口以及空进程概念介绍

MPI_Sendrecv函数原型 int MPI_Sendrecv(const void *sendbuf, int sendcount, MPI_Datatype sendtype, int dest, int sendtag,void *recvbuf, int recvcount, MPI_Datatype recvtype, int source, int recvtag, MPI_Comm comm, MPI_Status *status);其中各个参数的含义如下&…

Java 8的重要知识点

一、Lambda 表达式 Lambda 表达式的初衷是&#xff0c;进一步简化匿名类的语法&#xff08;不过实现上&#xff0c;Lambda 表达式并不是匿名类的语法糖&#xff09; 1、使用 Stream 简化集合操作&#xff1b; map 方法传入的是一个 Function&#xff0c;可以实现对象转换&…

螺旋矩阵Java

54. 螺旋矩阵 给你一个 m 行 n 列的矩阵 matrix &#xff0c;请按照 顺时针螺旋顺序 &#xff0c;返回矩阵中的所有元素。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,2,3],[4,5,6],[7,8,9]] 输出&#xff1a;[1,2,3,6,9,8,7,4,5 示例 2&#xff1a; 输入&#xff1a;ma…

【Jenkins打包服务,Dockerfile报错:manifest for java : 8 not fourd】

1、问题描述 Jenkins打包服务运行dockerfile里的FROM java:8报错manifest for java : 8 not fourd Caused by: com.spotify. docker.client.exceptions.DockerException: manifest for java:8 not found2、解决方法 在网上查找许多方法后得出这是由于Docker官方已经弃用java…

电脑每次开机杀毒软件报iusb3mon.exe病毒已清除,电脑中病毒iusbmon杀毒办法,工具杀毒

不知道什么时候开始&#xff0c;我电脑C盘的系统数据存储文件夹programdata 不知不觉就没了&#xff0c;找不到了 programdata文件夹为存储系统数据文件的&#xff0c;这个文件不见了&#xff0c;而且我打开了显示隐藏文件和文件夹还是没有显示 然后我重启电脑&#xff0c;杀毒…

Ansible-palybook学习

目录 一.playbook介绍二.playbook格式1.书写格式 一.playbook介绍 playbook 是 ansible 用于配置&#xff0c;部署&#xff0c;和管理被控节点的剧本。通过 playbook 的详细描述&#xff0c;执行其中的一系列 tasks &#xff0c;可以让远端主机达到预期的状态。playbook 就像 …

多项式乘法(FFT)

https://www.luogu.com.cn/problem/P3803 傅里叶变换(FFT)笔记存档FFT代码上的实现细节 主函数 把长度设为2的整数次幂块 初始进行翻转&#xff08;二进制翻转&#xff09; 对A&#xff0c;B先化为点值&#xff08;DFT&#xff09; 相乘 IDFT FFT函数 进行初始翻转&a…

openGauss学习笔记-55 openGauss 高级特性-全密态数据库

文章目录 openGauss学习笔记-55 openGauss 高级特性-全密态数据库55.1 连接全密态数据库55.2 创建用户密钥55.3 创建加密表55.4 向加密表插入数据并进行查询 openGauss学习笔记-55 openGauss 高级特性-全密态数据库 全密态数据库意在解决数据全生命周期的隐私保护问题&#xf…

Maven - 依赖三大原则

文章目录 概述最短路径优先原则POM 文件中声明顺序优先原则覆盖优先原则 MAVEN 依赖冲突常见报错Maven 依赖加载流程 概述 Maven 是一个流行的构建工具&#xff0c;用于管理和构建Java项目。它遵循一些核心原则&#xff0c;以确保项目的构建和依赖管理能够高效、一致地进行。以…

在CMD脚本中生成空心字

背景 程序启动时&#xff0c;需要通过串口向外打印信息&#xff0c;想在信息最前面打印一个log&#xff0c;如下图所示&#xff1a; win自带的CMD安装pyfiglet 使用pip安装pyfiglet&#xff0c;如下&#xff1a; pip install pyfiglet安装成功后如下图&#xff1a; 运行以…

(数字图像处理MATLAB+Python)第十一章图像描述与分析-第一节、二节:图像描述概述和特征点

文章目录 一&#xff1a;图像描述概述&#xff08;1&#xff09;图像描述&#xff08;2&#xff09;描述子 二&#xff1a;特征点&#xff08;1&#xff09;Moravec角点检测A&#xff1a;原理B&#xff1a;程序 &#xff08;2&#xff09;Harris角点检测A&#xff1a;原理B&…

YII项目在Docker中运行缓慢

缓慢问题分析 请求YII的api时间请求原生查询时间win10 上运行docker上的php api异常慢ubuntu 中拉代码git报错 请求YII的api时间 请求原生查询时间 win10 上运行docker上的php api异常慢 链接阿里数据的 入口直接返回的 网上有说是docker的dns解析慢&#xff1b; 也有说是…

方面级别情感分析之四元组预测

情感四元组预测现有方法 阅读本文之前我们默认你对情感分析有基本的认识。 如果没有请阅读文章(https://tech.tcl.com/post/646efb5b4ba0e7a6a2da6476) 情感分析四元组预测涉及四个情感元素: 方面术语a&#xff0c;意见术语(也叫观点术语)o&#xff0c; 方面类别ac&#xff0c…

使用python对光谱数据进行lorentz峰值拟合

1、lorentz峰值拟合 发光光谱是一种用于表征二维半导体材料光学性质的重要技术&#xff0c;它可以反映出材料中的载流子密度、缺陷态、激子束缚能等信息。 由于二维半导体材料的厚度极其薄&#xff0c;其发光信号往往很弱&#xff0c;且受到基底、环境和测量设备等因素的干扰…