jstree创建无限分级树的方法【基于ajax动态创建子节点】


Posted in Javascript onOctober 25, 2016

本文实例讲述了jstree创建无限分级树的方法。分享给大家供大家参考,具体如下:

首先来看一下效果

页面加载之初

jstree创建无限分级树的方法【基于ajax动态创建子节点】

节点全部展开后

jstree创建无限分级树的方法【基于ajax动态创建子节点】

首先数据库的表结构如下

jstree创建无限分级树的方法【基于ajax动态创建子节点】

其中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添加到点击节点下

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

其中不包含数据库

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
二行代码解决全部网页木马
Mar 28 Javascript
html a标签-超链接中confirm方法使用介绍
Jan 04 Javascript
jQuery之折叠面板的深入解析
Jun 19 Javascript
js获取对象为null的解决方法
Nov 21 Javascript
Vue.js 和 MVVM 的注意事项
Nov 07 Javascript
easyui combogrid实现本地模糊搜索过滤多列
May 13 Javascript
vue 2.1.3 实时显示当前时间,每秒更新的方法
Sep 16 Javascript
如何在 JavaScript 中更好地利用数组
Sep 27 Javascript
解决layer 动态加载select 失效的问题
Sep 18 Javascript
微信小程序如何实现点击图片放大功能
Jan 21 Javascript
Vue中import from的来源及省略后缀与加载文件夹问题
Feb 09 Javascript
微信小程序使用GoEasy实现websocket实时通讯
May 19 Javascript
input file上传 图片预览功能实例代码
Oct 25 #Javascript
Node.js开启Https的实践详解
Oct 25 #Javascript
Json对象和字符串互相转换json数据拼接和JSON使用方式详细介绍(小结)
Oct 25 #Javascript
利用yarn实现一个webpack+react种子
Oct 25 #Javascript
Yarn的安装与使用详细介绍
Oct 25 #Javascript
jQuery通过ajax快速批量提交表单数据
Oct 25 #Javascript
jquery popupDialog 使用 加载jsp页面的方法
Oct 25 #Javascript
You might like
PHP使用CURL实现多线程抓取网页
2015/04/30 PHP
laravel 实现设置时区的简单方法
2019/10/10 PHP
Thinkphp5.0 框架Model模型简单用法分析
2019/10/11 PHP
用prototype实现的简单小巧的多级联动菜单
2007/03/24 Javascript
DOMAssitant最新版 DOMAssistant 2.5发布
2007/12/25 Javascript
javascript 添加和移除函数的通用方法
2009/10/20 Javascript
!DOCTYPE声明对JavaScript的影响分析
2010/04/12 Javascript
JavaScript 原型继承
2011/12/26 Javascript
javascript 在firebug调试时用console.log的方法
2012/05/10 Javascript
JavaScript获取路径设计源码
2014/05/22 Javascript
jQuery mobile在页面加载时添加加载中效果 document.ready 和window.onload执行顺序比较
2016/07/14 Javascript
AngularJS 过滤与排序详解及实例代码
2016/09/14 Javascript
JavaScript面向对象分层思维全面解析
2016/11/22 Javascript
js 函数式编程学习笔记
2017/03/25 Javascript
使用jQuery卸载全部事件的思路详解
2017/04/03 jQuery
nodejs用gulp管理前端文件方法
2018/06/24 NodeJs
AngularJS ui-router刷新子页面路由的方法
2018/07/23 Javascript
vue+openlayers绘制省市边界线
2020/12/24 Vue.js
Python入门教程之if语句的用法
2015/05/14 Python
Python中pygame的mouse鼠标事件用法实例
2015/11/11 Python
Python实战小程序利用matplotlib模块画图代码分享
2017/12/09 Python
详解Django中CBV(Class Base Views)模型源码分析
2019/02/25 Python
Python 分享10个PyCharm技巧
2019/07/13 Python
Python模块汇总(常用第三方库)
2019/10/07 Python
基于python实现计算且附带进度条代码实例
2020/03/31 Python
python 一维二维插值实例
2020/04/22 Python
纯css3制作煽动翅膀的蝴蝶的示例
2018/04/23 HTML / CSS
Anthropologie英国:美国家喻户晓的休闲服装和家居产品品牌
2018/12/05 全球购物
巴西Mr. Cat在线商店:购买包包和鞋子
2019/09/08 全球购物
什么是URL
2015/12/13 面试题
消防安全管理制度
2014/02/01 职场文书
12岁生日演讲稿
2014/05/14 职场文书
解除劳动合同证明书模板
2014/11/20 职场文书
考研经验交流会策划书
2015/11/02 职场文书
NodeJs内存占用过高的排查实战记录
2021/05/10 NodeJs
MySQL数据库之存储过程 procedure
2022/06/16 MySQL