使用jstree创建无限分级的树(ajax动态创建子节点)

首先来看一下效果

页面加载之初

image

节点全部展开后

image

首先数据库的表结构如下

image

其中Id为主键,PId为关联到自身的外键

两个字段均为GUID形式

层级关系主要靠这两个字段维护

其次需要有一个类型

    public class MenuType{public Guid Id { get; set; }public Guid PId { get; set; }public string MenuName { get; set; }public string Url { get; set; }public int OrderNum { get; set; }public int SonCount { get; set; }}

此类型比数据库表增加了一个属性

SonCount

这个属性用来记录当前节点的子节点的个数

注意:也可以把此属性放在数据库中,性能上会提升一些,但需要增加额外的代码来维护此字段

接下来看一下取数据的方式

        protected void Page_Load(object sender, EventArgs e){if (Request["Action"] == "AJAX"){var result = GetMenu(Request["pid"]);JavaScriptSerializer serializer = new JavaScriptSerializer();string sRet = serializer.Serialize(result);Response.Write(sRet);Response.End();}}

页面加载之初判断是否需要获取菜单数据

其中请求参数pid为客户端需要获取的节点ID

如果请求顶级节点,则此参数的值为00000000-0000-0000-0000-000000000000

GetMenu函数获取需要请求的节点数据

        private List<MenuType> GetMenu(string pid){var result = new List<MenuType>();SqlConnection conn = new SqlConnection("Data Source=.;Initial Catalog=SHU;User ID=sa;Password=allen;");conn.Open();SqlCommand cmd = new SqlCommand();cmd.Connection = conn;cmd.CommandText = "select a.*,b.cout as count from Menu a left join (select COUNT(*) as cout,Menu.PId from Menu group by Menu.PId) as b on a.Id = b.PId  where a.PId = '" + pid + "' order by OrderNum";SqlDataReader dr = cmd.ExecuteReader(CommandBehavior.CloseConnection);while (dr.Read()){var obj = new MenuType();obj.Id =Guid.Parse(dr["Id"].ToString());obj.MenuName = dr["MenuName"].ToString();obj.OrderNum = Convert.ToInt32(dr["OrderNum"]);obj.PId = dr["PId"] == DBNull.Value ? Guid.Empty : Guid.Parse(dr["PId"].ToString());obj.Url = dr["Url"].ToString();obj.SonCount = dr["count"] == DBNull.Value ? 0 : Convert.ToInt32(dr["count"]);result.Add(obj);}return result;}

在本DEMO中使用JavaScriptSerializer来序列化菜单数组

前台的代码如下

<asp:Content ID="HeaderContent" runat="server" ContentPlaceHolderID="HeadContent"><link href="Scripts/themes/default/style.css" rel="stylesheet" type="text/css" /><script src="Scripts/jquery.js" type="text/javascript"></script><script src="Scripts/jquery.jstree.js" type="text/javascript"></script><script>$(function () {$.getJSON("/default.aspx?ACTION=AJAX&pid=00000000-0000-0000-0000-000000000000", function (result) {$.each(result, function (i, item) {var typeN = item.SonCount > 0 ? "jstree-closed" : "jstree-leaf";$("#tree").append("<li id='phtml_" + item.Id + "' class='" + typeN + "'><a href='#'>" + item.MenuName + "</a></li>");});$("#demo2").jstree({"plugins": ["themes", "html_data", 'types', "ui", "checkbox"],'core': { 'animation': 0 },"types": { "types":{"person": { "icon": { "image": "/Scripts/themes/default/person.png"} },"depar2": { "icon": { "image": "/Scripts/themes/default/depar2.png"} },"default": { "icon": { "image": "/Scripts/themes/default/depar1.png"} }}}}).bind("open_node.jstree", function (e, data) {var id = data.rslt.obj[0].id;if ($("#" + id + " li").length > 0) { return; }$.getJSON("/default.aspx?ACTION=AJAX&pid=" + id.replace("phtml_", ""), function (result) {var str = "<ul>"$.each(result, function (i, item) {var typeN = item.SonCount > 0 ? "jstree-closed" : "jstree-leaf";var icon = item.SonCount > 0 ? "depar2" : "person";str += "<li rel = '" + icon + "' id='phtml_" + item.Id + "' class='" + typeN + "'><a  href='#'> " + item.MenuName + "</a></li>";});str += "</ul>";$("#" + id).append(str);var tree = jQuery.jstree._reference("#" + id);tree.refresh();$("ins[class='jstree-checkbox jstree-icon']").removeClass("jstree-icon");$(".jstree-checkbox").attr("style", "");});});});});</script>
</asp:Content>
<asp:Content ID="BodyContent" runat="server" ContentPlaceHolderID="MainContent"><div id="demo2"><ul id="tree"></ul></div>
</asp:Content>

  

页面加载之初,先请求顶级节点

如果顶级节点的SonCount属性大于0

则使节点为闭合状态(样式为jstree-closed)

如果节点无子节点

则该节点的样式为jstree-leaf

当用户点击闭合状态的节点时,客户端发起请求

并把点击节点的ID传给后端,后端获取到点击节点的子节点后

通过append添加到点击节点下

至此,无限分级的树创建完成

其中不包含数据库

 

---------------------------------------------------------------------------

喜欢本文的,请点支持,有问题请在本文下评论,我会及时回复的

谢谢大家

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

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

相关文章

oracle长连接超时设置

方法一、在sqlnet.ora中设置参数 如需要设置客户端空闲10分钟即被中断&#xff0c;则在sqlnet.ora的末尾添加SQLNET.EXPIRE_TIME10注&#xff1a;sqlnet.ora文件的路径在$ORACLE_HOME/network/admin下。 方法二、Oracle Profile中设置 生产库上执行如下操作&#xff1a; SQL>…

linux syslog 笔记

原文地址 Linux日记系统由系统日志监控程序syslogd和内核日志监控程序klogd组成。从它们的命名可以看到&#xff0c;这两个监控程序都是守护程序&#xff08;daemon&#xff09;&#xff0c;且都注册成了系统服务。换句话说&#xff0c;我们可以在目录/etc/init.d/下找到它们对…

Jenkins构建Spring+Nodejs项目

构建node.js环境1.安装 node.js 2.项目目录下执行 npm i -production 安装依赖的包install时会在项目目录下生成node_modules目录&#xff0c;使用-production只会下载依赖相关的包&#xff0c;否则会下所有的包&#xff08;太大了&#xff09;。因为编译主机不能联网&#xff…

解析Hibernate的结构

在学习Hibernate的时候&#xff0c;首先要了解Hibernate的大体结构&#xff0c;这样才能更好的理解其中的知识&#xff0c;下面就开始分析Hibernate的体系结构 1.HIbernate简要的体系结构如下图所示&#xff1a; 通过上图能够发现HIbernate需要一个hibernate.properties文件&am…

Java反梯形图案_梯形法求定积分(一)设计梯形法求积分的类模板,梯形法

/*设计梯形法求积分的类模板&#xff0c;梯形法求积分的函数被定义为成员函数&#xff0c;可以求任意函数的定积分&#xff0c;用积分类的模板参数T引入被积函数*/#include#include#includeusing namespace std;class Mysin{public:double fun(double x){return (sin(x));}};cl…

排序算法杂谈(三) —— 归并排序的非递归实现

1. 递归 在众多排序算法中&#xff0c;归并排序&#xff08;Merge Sort&#xff09;和快速排序&#xff08;Quick Sort&#xff09;都是时间复杂度为 O(nlog2n) 的高效排序。 这两种排序有一种共性&#xff0c;就是运用到了递归的思想。 在程序设计中&#xff0c;递归是一个很有…

apache+php32位平台安装

一、 系统配置 1、 禁用IPV6 修改/etc/modprobe.conf文件&#xff0c;加入以下两行: alias net-pf-10 off alias ipv6 off 2、 启用以下服务 其它服务关闭 acpid 提供高级电源管理 cpuspeed 可以提高系统运行效率 apmd 高级电源管理 crond 执行例行性程序 也就是window…

mysql 函数修改无效_MySQL:组函数的使用无效

MySQL&#xff1a;组函数的使用无效我正在使用MySQL。 这是我的模式&#xff1a;供应商( sid&#xff1a;整数 &#xff0c;sname&#xff1a;string&#xff0c;地址string)部件( pid&#xff1a;整数 &#xff0c;pname&#xff1a;string&#xff0c;颜色&#xff1a;string…

webpack简单笔记

本文简单记录学习webpack3.0的笔记&#xff0c;已备日后查阅。节省查阅文档时间 安装 可以使用npm安装 //全局安装 npm install -g webpack //安装到项目目录 npm install --save-dev webpack npm init会创建package.json文件。配置该文件可以简化我们之后的一些操作&#xff0…

ASP.NET性能优化小结(ASP.NETC#)(转)

原文转自&#xff1a;http://www.jb51.net/article/25937.htm 一、返回多个数据集   检查你的访问数据库的代码&#xff0c;看是否存在着要返回多次的请求。每次往返降低了你的应用程序的每秒能够响应请求的次数。通过在单个数据库请求中返回多个结果集&#xff0c;可以减少与…

【Canal源码分析】Sink及Store工作过程

一、序列图 二、源码分析 2.1 Sink Sink阶段所做的事情&#xff0c;就是根据一定的规则&#xff0c;对binlog数据进行一定的过滤。我们之前跟踪过parser过程的代码&#xff0c;发现在parser完成后&#xff0c;会把数据放到一个环形队列TransactionBuffer中&#xff0c;也就是这…

传Facebook将推出应用中心挑战谷歌搜索地位

网易科技讯 6月8日消息&#xff0c;据TechCrunch报道&#xff0c;Facebook将在今天或不久后推出App Center(应用中心)产品。应用中心可在手机上或浏览器中使用&#xff0c;外观和功能非常像苹果的应用店App Store&#xff0c;除了不能下载iPhone或iPad应用外。 Facebook的应用中…

java中or和and的优先级_x86处理器汇编语言AND和OR运算符优先级

Irvine的书使用MASM作为参考汇编程序 .作者正在谈论MASM operators 1 - 这些运营商仅为了我们人类的利益而受到支持 .它们让我们对立即数和常量执行算术&#xff0c;但它们使用的表达式必须最终在汇编时解析为一个值 .aConstant EQU 35mov edx, NOT 1 ;Same as mov edx, 0fffff…

博客园修改页面显示样式css

博客园修改页面显示样式css 一、总结 二、 博客园修改页面显示样式css 1、点管理 2、点设置 3、在页面定制css代码中加入你想要改变样式的css代码即可 不会写css的下面有代码示例&#xff0c;直接复制粘贴放到页面定制css代码位置即可 三、代码 1 #cnblogs_post_body h3 {2 …

基准测试 ApacheBench ab学习

2019独角兽企业重金招聘Python工程师标准>>> ab的全称是ApacheBench&#xff0c;是 Apache 附带的一个小工具&#xff0c;专门用于 HTTP Server 的benchmark testing&#xff0c;可以同时模拟多个并发请求。前段时间看到公司的开发人员也在用它作一些测试&#xff0…

java虚拟机类加载机制浅谈_浅谈Java虚拟机(三)之类加载机制

在《浅谈Java虚拟机》这篇文章中&#xff0c;我们提到了JVM从操作系统方面来说&#xff0c;可以将其看做是一个进程&#xff0c;分别有类加载器子系统&#xff0c;执行引擎子系统和垃圾收集子系统。这一篇文章就简单的来谈一下类加载器子系统中的类加载机制。第一&#xff1a;什…

如何把两个查询语句合成一条 语句

我给你写个例子&#xff1a;假设 第一条sql 是 select a.a1,a.a2,a.a3 from A a where ... 第二条sql是 select b.b1,b.b2,b.b3 from B b where ... 第三条sql 是 select c.c1,c.c2 from C c where ...那么合成一句的sql 是select x.x1,x.x2…

fedora 16 面部显示

为什么80%的码农都做不了架构师&#xff1f;>>> 显示日期&#xff1a; gsettings set org.gnome.shell.clock show-date true 显示秒数&#xff1a; gsettings set org.gnome.shell.clock show-seconds true 显示天气&#xff1a; 1.在这里 https://github.com/sim…

c#入门笔记

c#入门初探 零. 写在前面 0.1 解决方案、项目、程序集、命名空间 0.1.1项目 一个项目可以就是你开发的一个软件。在.Net下&#xff0c;一个项目可以表现为多种类型&#xff0c;如控制台应用程序&#xff0c;Windows应用程序&#xff0c;类库&#xff08;Class Library&#xff…

python 日常小技巧

python 访问win32程序和指定地址程序 1 import subprocess 2 psubprocess.Popen("calc.exe",0,None,None,None,None) 3 p.wait() 4 psubprocess.Popen("D:\Program Files\Tencent\QQ\Bin\QQ.exe",0,None,None,None,None) 5 p.wait() 6 7 import os 8 os.…