jstree组件的使用详细教程,部分案例( PHP / fastAdmin )

news2024/12/23 6:59:32

jstree 组件的使用。

简介:JsTree是一个jquery的插件,它提交一个非常友好并且强大的交互性的树,并且是完全免费或开源的(MIT 许可)。Jstree技持Html 或 json格式的的数据, 或者是ajax方式的动态请求加载数据。

在这里插入图片描述

1、引用

我这里使用的是 php 的 fastadmin 框架 ,需要在js页面的最上方define添加 ’ jstree ',否则会无法使用jstree插件,代码如下

define(['jquery', 'bootstrap', 'backend', 'table', 'form','jstree'], 
		function ($, undefined, Backend, Table, Form) {

如果没用这个框架,则需要从官网下载js包进行引用。在引用前需先引用Jquery.

<script src="jquery.min.js"></script>
<script src="dist/jstree.min.js"></script>

2、使用

首先需要在前端的html页,加入

 <div id="jstree"></div>

在js页面中首先添加 ready ()函数,之后的jstree代码我都会写在这里面。


 $(document).ready(function () {
 	
 });

3、加载树节点

 $('#jstree').jstree({
                    'core': {},// 请求后端数据接口
                    'plugins': [],  // 启用右键菜单和拖拽/放置功能
                    'check_callback': function () { },
                    'contextmenu': { },//定义右键菜单
                    'themes': {
                        'icons': false  // 关闭jstree默认图标
                    },
                    'types': {} //图标类型
                });

core

core 是用来请求后端接口,加载树节点用

'core': {
       'data': {
        'url': 'machine/state_list/ajax_get',
        'data': function (node) {
        return { 
        		'id': node.id ,//传递给后端的节点ID
                'capacity_id': $("#c-capa_id").val() //后端需要接收的数据
                //如果还有别的要传递后端可在这继续添加
              };
           }
       },
       'check_callback' : true, // 允许对节点进行动态操作
},
plugins

这个是树节点的功能 、形态、右键菜单等,
checkbox:多选框,每个节点前都会有一个多选
dnd :拖拽功能,可拖拽节点到别的节点上
contextmenu:右键菜单功能
html_data:节点样式、icon等都需要添加这个
当然还有别的 ,需去官网进行查阅

 // 'plugins': ['contextmenu', 'dnd','html_data','themes', 'types',"checkbox","contextmenu"],  // 启用右键菜单和拖拽/放置功能
//dnd 可拖拽
'plugins': ['contextmenu', 'html_data','themes', 'types',"contextmenu"],  // 启用右键菜单和拖拽/放置功能
contextmenu

右键菜单栏,我这里仅展示 添加修改和编辑的,如有别的需求可自行添加。

添加
add 原理,添加一个节点的同时,给他选择进行编辑节点。

添加和编辑的 回调函数需要用rename_node.jstree 进行监听。所以没在这里。


 'contextmenu': {  // 定义右键菜单
			'items': function( node ) {
					var items = {
                                "add":{
                                    "label":"添加",
                                    "icon" : "glyphicon glyphicon-plus",
                                    "action":function(data){
                                        var inst = $.jstree.reference(data.reference),
                                        obj = inst.get_node(data.reference);
                                        inst.create_node(obj, {}, "last", function (new_node) {
                                            try {
                                                new_node.text="输入名称";
                                                //回调函数在下方的 'rename_node.jstree' 监听编辑完时候触发实现。
                                                inst.edit(obj);
                                            } catch (ex) {
                                                setTimeout(function () { inst.edit(new_node); },0);
                                            }
                                        });
                                    }
                                },
                                "update":{
                                //代码在下面展示
                                }
		}

},

修改
update

"update":{
          "label":"修改",
          "icon":"glyphicon glyphicon-leaf",
          "action":function (data){
          		//根据自己的判断条件判断是否允许修改,没有可以吧判断去掉。
               if(node.id=="t_1"){
                   layer.msg(node.text+"不能修改",{time:'1000'});
               }else{
                 var inst = $.jstree.reference(data.reference),
                 obj = inst.get_node(data.reference);
                 inst.edit(obj);
               }
         }
},

删除
del
删除的回调函数在这里进行调用后端接口。当后端删除成功,返回时才能删除节点,否则不给予删除。

id:node.id 表示传入当前节点的ID。
注:response.success 中的 success 是后端传回来的字段。我这里返回是true或者false。

"del":{
     "separator_before": false,
     "icon": false,
     "separator_after": false,
     "_disabled": false, //(this.check("delete_node", data.reference, this.get_parent(data.reference), "")),
     "label": "删除",
     "icon":"glyphicon glyphicon-remove",
     "action": function (data) {
			$.get("machine/state_list/ajax_del",{id:node.id},function (response){
            // console.log(response.msg);
            //删除成功才进行删除节点
            if(response.success){
            	layer.msg(response.msg,{time:'1000'});
            	//删除节点
            	var inst = $.jstree.reference(data.reference),
            		obj = inst.get_node(data.reference);
            	if(inst.is_selected(obj)) {
               	 	inst.delete_node(inst.get_selected());
            	}else {
                	inst.delete_node(obj);
            	}
            }else{
               layer.msg(response.msg,{time:'1000'});
                // console.log('删除失败');
             }
            })

    }
}

types

这个是节点图标的类型。

其中的parent 、 child、grandchild 需要在后端传回的数据中进行定义。

'types': {
           'default': {
                  		    'icon': 'glyphicon glyphicon-star'  // 设置默认节点图标(这里使用了Bootstrap的glyphicon图标)
                       },
           'parent' : {
                            'icon' : 'fa fa-folder-open'  // 父节点图标
                        },
             'child' : {
                            'icon' : 'glyphicon glyphicon-file'  // 子节点图标
                        },
        'grandchild' : {
                            'icon' : 'glyphicon glyphicon-leaf'  // 第三级节点图标
                        }
                        //如还有节点可继续添加
 }

节点加载的就到这。

4、监听,节点编辑完成时触发

这里补充 右键菜单 的添加和编辑功能。

//监听,节点编辑完成时候触发
$('#jstree').on('rename_node.jstree', function (e, data) {
	console.log('节点ID:',data.node.id);
	console.log('节点名称:', data.node.text);
	var capaid=$("#c-capa_id").val();//需要传递后端的数据
	if(data.node.text!="输入名称"&&data.node.text!=""){
		$.get("machine/state_list/ajax_addChildNode",{nodeId:data.node.id,Text:data.node.text,capacityid:capacityid},function (response){
			if(response.success){
				//执行成功后处理逻辑
			}else{
			}
		}
	}else{
		layer.msg("请输入有效名称!",{time:'1000'});
		// 删除节点
        $('#jstree').jstree().delete_node(data.node.id);
	}
});

5、加载完树节点后的回调函数

//监听 加载完树节点后的回调函数
$('#jstree').on('ready.jstree', function (e, data){
     $("#toggleButton").css('display','block');
});

6、选择节点时,更新下拉框的值

选择一个节点时触发

$('#jstree').on("select_node.jstree", function (e, data){
	 var node = data.node;
	 alert(node.text+' '+node.id);
	 //处理函数,也可以请求后端接口。
	 $.ajax({
		 method: 'post',
		 url: '',
	 	 data: { id: node.id },
		 success: function (response) {
		 },
		 error: function (error) {
	 	}
	 })
}

7、全选和展开

需要在HTML 中添加两个多选框 。


//全选
$(document).on("click", "#checkall", function () {
       $("#jstree").jstree($(this).prop("checked") ? "check_all" : "uncheck_all");
});
//展开
$(document).on("click", "#expandall", function () {
       $("#jstree").jstree($(this).prop("checked") ? "open_all" : "close_all");
});

8、加载完成后回调函数

//监听加载完成后的回调函数
$('#jstree').on('loaded.jstree',function (){
 		var node = data.node;
     //选中节点
     $('#jstree').jstree('select_node',node.id);
     //其他处理
     //......
})

9、加载树的后端代码。

思来想去,还是贴一点后端代码吧。我这里用的是php。

$id, $capacity_id 是用来接收前端传过来的参数。

其中 dren 是别的函数,主要加载子节点的逻辑。
‘children’ => $ch1 表示加载子节点。
‘children’ => false 表示该节点下面不存在子节点

‘type’=>‘parent’ 这里代表的是前面提到的 icon,节点图标。他的名称就是在这里设置的。

‘state’ => [ ‘opened’ => true ] 为true表示加载完成是处于展开状态。

    public function ajax_get($id, $capacity_id)
    {
        //查找子节点
        $ch1=$this->dren($capacity_id,1);
        $ch2=$this->dren($capacity_id,2);

        $data = [
            ['id' => 't_1','text' => '调试','state' => [ 'opened' => true ],'type'=>'parent','children' => $ch1],
            ['id' => 't_2','text' => '测试','state' => [ 'opened' => true ],'type'=>'parent','children' => $ch2],
            ['id' => 't_3','text' => '展示','state' => [ 'opened' => true ],'type'=>'parent','children' => false],
            ['id' => 't_4','text' => '异常','state' => [ 'opened' => true ],'type'=>'parent','children' => true]
        ];

        return json($data);
    }

别的接口的 返回参数
例如:删除的

public function ajax_del($id){
	$success=[];
	//.....删除的逻辑代码
	$success=['msg'=>'删除成功',"success"=>true];
	//.....别的删除逻辑代码
	
	return $success;
}

jstree 教程到此结束,对你有帮助的希望点个赞。

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

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

相关文章

基于ssm的汽车服务商城系统设计与实现论文

摘 要 本课题是根据用户的需要以及网络的优势建立的一个基于Vue的汽车服务商城系统&#xff0c;来更好的为用户提供服务。 本基于Vue的汽车服务商城系统应用Java技术&#xff0c;MYSQL数据库存储数据&#xff0c;基于SSMVue框架开发。在网站的整个开发过程中&#xff0c;首先对…

关于响应式布局,你需要了解的知识点

什么是响应式布局&#xff1f; 响应式布局&#xff0c;就是根据不同设备展示不同的布局&#xff0c;以免更方便用户浏览页面。 举个很简单的例子&#xff0c;我们在电脑上浏览网页&#xff0c;屏幕非常大&#xff0c;这时候可能采用的是如下图所示的布局方式。这种布局方式很宽…

[陇剑杯 2021]日志分析

[陇剑杯 2021]日志分析 题目做法及思路解析&#xff08;个人分享&#xff09; 问一&#xff1a;单位某应用程序被攻击&#xff0c;请分析日志&#xff0c;进行作答&#xff1a; 网络存在源码泄漏&#xff0c;源码文件名是_____________。(请提交带有文件后缀的文件名&…

vue项目debugger调试看不到源码

vue项目debugger调试看不到源码 引用地址&#xff1a;vue项目debugger调试看不到源码_hua_ban_yu的博客-CSDN博客_vue项目网页源代码查看不了 在开发vue项目时&#xff0c;不知为啥进行debug但是查看不到页面源代码&#xff0c;尝试过很多方法&#xff0c;最后在看到大神相关…

WSL的安装与使用 (超详细图文版安装教程)

安装与使用 Windows Subsystem for Linux - WSL 安装&#xff08;两种方式均可实现WSL的安装&#xff09;图文版安装文字版安装步骤1&#xff1a;启用 WSL 功能步骤2&#xff1a;选择并安装 Linux 发行版步骤3&#xff1a;配置和使用 WSL步骤4&#xff1a;与 Windows 的互操作性…

探索高级AJAX技术:深入研究异步请求和响应处理

大家有关于JavaScript知识点不知道可以去 &#x1f389;博客主页&#xff1a;阿猫的故乡 &#x1f389;系列专栏&#xff1a;JavaScript专题栏 &#x1f389;ajax专栏&#xff1a;ajax知识点 &#x1f389;欢迎关注&#xff1a;&#x1f44d;点赞&#x1f64c;收藏✍️留言 目录…

Docker-consul容器服务自动发现与注册

什么叫微服务或者注册与发现&#xff1f; 是一种分布式管理系统&#xff0c;定位服务的方法。 在传统的架构中&#xff0c;应用程序之间直连到已知的服务。 已知的服务&#xff1a;设备提供的网络、IP地址、基于tcp/ip端口 基于现微服务部署&#xff0c;服务的动态性&#…

在MDK开发调试过程中,发现程序正常运行,但是打断点无法进入。

在MDK开发调试过程中&#xff0c;发现程序正常运行&#xff0c;但是打断点无法进入。 打断点无法进入&#xff1a; 程序无法进行&#xff1a; 查找问题&#xff1a;这些都已经配置 上面都已经配置&#xff0c;最终发现: 勾选后进入断点成功。

以csv为源 flink 创建paimon 临时表相关 join 操作

目录 概述配置关键配置测试启动 kyuubi执行配置中的命令 bug解决bug01bug02 结束 概述 目标&#xff1a;生产中有需要外部源数据做paimon的数据源&#xff0c;生成临时表&#xff0c;以使用与现有正式表做相关统计及 join 操作。 环境&#xff1a;各组件版本如下 kyuubi 1.8…

Redis 过期删除策略、内存回收策略、单线程理解

不知从何开始Redis的内存淘汰策略也开始被人问及&#xff0c;卷&#xff01;真的是太卷了。难不成要我们去阅读Redis源码吗&#xff0c;其实问题的答案&#xff0c;在Redis中的配置文件中全有&#xff0c;不需要你阅读源码、这个东西就是个老八股&#xff0c;估计问这个东西是想…

微信小程序识别小程序码并传参

一、场景 连续看到几个类似关于小程序生成二维码场景的问题&#xff0c;分销的场景和单商品购买的页面居多 二、思路 #mermaid-svg-8CjFXSzutuF1OvO8 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-8CjFXSzutuF1…

中小企业业财融合策略(2):财务赋能,如何支持业务经营?

上一文《中小企业业财融合(1):把财务从琐碎的凭证处理、核算中解放出来!》&#xff0c;我们提出了财务升级的背景以及必要性&#xff0c;本篇我们就财务赋能&#xff0c;如何支持业务经营&#xff1f;提出一些简要的看法&#xff0c;希望对大家有所帮助。 一、财务赋能&#x…

com.sun.org.apache.xerces.internal.impl.dv.util.Base64

com.sun.org.apache.xerces.internal.impl.dv.util.Base64 Access restriction: The type Base64 is not API (restriction on required library D:\Java\jdk1.8.0_341\jre\lib\rt.jar) Maven Update Project 虽然没错误了&#xff0c;但是有警告&#xff0c;好奇&#xff1f;…

TCL实业,在智能时代风中起舞

从惠州的一个磁带厂起步&#xff0c;成长为智能终端、半导体显示、新能源光伏三大业务齐头并进的制造业大鳄&#xff0c;TCL是中国制造业穿越周期的一面旗帜。而作为国内电视品牌中唯一拥有上游供应链自主权的企业&#xff0c;C端用户往往更熟悉那个总是在电视终端领域拿出好产…

RT-DETR优化:ASF-YOLO提取多尺度特征 | 2023年12月最新成果

🚀🚀🚀本文改进: ASF-YOLO一种新的特征融合网络架构,该网络由两个主要的组件网络组成,可以为小目标分割提供互补的信息:(1)SSFF模块,它结合了来自u;(2)TFE模块,它可以捕获小目标的局部精细细节等 🚀🚀🚀YOLOv8改进专栏:http://t.csdnimg.cn/hGhVK 学姐带你学…

网络协议 - TCP 协议详解

网络协议 - TCP 协议详解 简述TCP头格式TCP的状态机数据传输中的Sequence NumberTCP重传机制超时重传机制快速重传机制SACK 方法Duplicate SACK – 重复收到数据的问题示例一&#xff1a;ACK丢包示例二&#xff0c;网络延误 TCP的RTT算法经典算法Karn / Partridge 算法Jacobson…

记录 | Microsoft Remote Desktop for mac安装

Microsoft Remote Desktop for mac安装 网上一些教程的下载安装老是跳转来跳转去&#xff0c;而且下载了的也不一定适用于 mac&#xff0c; 这里直接提供 Microsoft Remote Desktop for mac 的安装包的下载地址&#xff1a; microsoft-remote-desktop-for-mac

f盘隐藏的文件夹怎么找出来?介绍几种有效方法

在计算机中&#xff0c;我们经常会遇到隐藏的文件或文件夹&#xff0c;在F盘中隐藏的文件夹也不例外。隐藏的文件夹可能是由系统生成的&#xff0c;或者是用户自行设定的隐私文件夹。无论是因为误操作还是出于其他原因&#xff0c;如果你想找出F盘中的隐藏文件夹&#xff0c;本…

用EXCEL计算NTC、BS、电压等AD参数

前言 之前计算NTC的AD值算得很麻烦&#xff0c;因为51内核的单片机不支持除法运算&#xff0c;更别说浮点运算了。 EXCEL自动算出参数就显得很方便了。 有纰漏请指出&#xff0c;转载请说明。 学习交流请发邮件 1280253714qq.com 理论基础 参考这篇文章NTC热敏电阻温度采集…

数据常见的提取和筛选方法

平时对于一些不标准的数据&#xff0c;需要提取或者筛选其中的部分数据。本文主要分享一些常用的办法&#xff0c;同时也作为一个笔记的备份。 1. 正则表达式 正则表达式比较适合提取有明确类型的数据&#xff0c;比如字母&#xff0c;数字&#xff0c;汉字&#xff0c;日期等…