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 相关文章推荐
html数组字符串拼接的最快方法
Sep 16 Javascript
jQuery中removeAttr()方法用法实例
Jan 05 Javascript
js实现的简洁网页滑动tab菜单效果代码
Aug 24 Javascript
JQuery控制图片由中心点逐渐放大效果
Jun 26 Javascript
jQuery监听文件上传实现进度条效果的方法
Oct 16 Javascript
详解Angular 4.x Injector
May 04 Javascript
详解EasyUi控件中的Datagrid
Aug 23 Javascript
JS实现常见的查找、排序、去重算法示例
May 21 Javascript
前端Electron新手入门教程详解
Jun 21 Javascript
JS实现的排列组合算法示例
Jul 16 Javascript
Vue+element-ui添加自定义右键菜单的方法示例
Dec 08 Vue.js
8个非常实用的Vue自定义指令
Dec 15 Vue.js
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获取mysql版本的几种方法小结
2008/03/25 PHP
php采用curl模仿登录人人网发布动态的方法
2014/11/07 PHP
php实现概率性随机抽奖代码
2016/01/02 PHP
Symfony2实现在controller中获取url的方法
2016/03/18 PHP
Javascript实例教程(19) 使用HoTMetal(1)
2006/12/23 Javascript
Javascript miscellanea -display data real time, using window.status
2007/01/09 Javascript
IE JS无提示关闭窗口不提示的方法
2010/04/29 Javascript
一个获取第n个元素节点的js函数
2014/09/02 Javascript
jQuery中$.each使用详解
2015/01/29 Javascript
js实现点击切换TAB标签实例
2015/08/21 Javascript
jQuery鼠标事件汇总
2015/08/30 Javascript
JS公共小方法之判断对象是否为domElement的实例
2016/11/25 Javascript
详解angularJs模块ui-router之状态嵌套和视图嵌套
2017/04/28 Javascript
element form 校验数组每一项实例代码
2019/10/10 Javascript
JavaScript onclick事件使用方法详解
2020/05/15 Javascript
jQuery实现简单评论区功能
2020/10/26 jQuery
Python实现登录人人网并抓取新鲜事的方法
2015/05/11 Python
python 根据正则表达式提取指定的内容实例详解
2016/12/04 Python
python中通过预先编译正则表达式提高效率
2017/09/25 Python
详谈python中冒号与逗号的区别
2018/04/18 Python
python中matplotlib条件背景颜色的实现
2019/09/02 Python
基于Django实现日志记录报错信息
2019/12/17 Python
Pytorch训练过程出现nan的解决方式
2020/01/02 Python
Pytorch在NLP中的简单应用详解
2020/01/08 Python
opencv python在视屏上截图功能的实现
2020/03/05 Python
django中的数据库迁移的实现
2020/03/16 Python
Python semaphore evevt生产者消费者模型原理解析
2020/03/18 Python
美国第二大团购网站:LivingSocial
2016/07/24 全球购物
英国屋顶用品和材料超市:Roofing Supplies UK
2019/08/24 全球购物
公关关系专员的自我评价分享
2013/11/20 职场文书
党员教师自我剖析材料
2014/09/29 职场文书
小学教师自我评价
2015/03/04 职场文书
应聘教师自荐信
2015/03/26 职场文书
教师节老师寄语
2015/05/28 职场文书
JS异步堆栈追踪之为什么await胜过Promise
2021/04/28 Javascript
详解Java七大阻塞队列之SynchronousQueue
2021/09/04 Java/Android