JsTree异步加载数据实现多级菜单
最近在搞一个项目的维护,有一个问题是把原来的树导航变成多级的,原来的那个导航是JsTree的,但我又不熟悉,遂头疼了好久。。。
终于,他还是出来了,下面就贴上主要代码和思路,因为我在搞这个东西的时候在园子里和网上没有找到适合的代码,或许我写的正好是你要找的呢也不一定啊。。。
1.此处是前台的代码:
<script type="text/javascript">
$(function () {
var id;
if ("$!id" != "") {
id = "$!id";
}
$("#MuLuHtml").tree({
data: {
async: false,
cache: false,
opts: {
url: "GetTree4Ajax.aspx?$!{dateTime.Now.toString('yyyyMMddHHmmssffff')}"
}
},
lang: { loading: '目录加载中...' },
selected: [id],
opened: ["muluRoot"],
ui: {
theme_name: "classic"
},
types: {
"Root": {
draggable: false,
deletable: false,
renameable: false,
icon: {
image: "/Theme/1/base/images/pi_diagona_pack.png"
}
},
"R1": {
draggable: false,
deletable: false,
renameable: false,
icon: {
image: "/Theme/1/base/images/pi_diagona_pack.png"
}
},
"R2": {
draggable: false,
deletable: false,
renameable: false,
icon: {
image: "/Theme/1/base/images/pi_diagona_pack.png"
}
},
"R3": {
draggable: false,
deletable: false,
renameable: false,
icon: {
image: "/Theme/1/base/images/pi_diagona_pack.png"
}
},
"R4": {
draggable: false,
deletable: false,
renameable: false,
icon: {
image: "/Theme/1/base/images/pi_diagona_pack.png"
}
}
},
callback: {
beforedata: function (NODE, TREE_OBJ) {
return {
id: $(NODE).attr("id") || 0,
JiBie: $(NODE).attr("JiBie") || -1,
ShangJiMuLuID: $(NODE).attr("zhujian") || 0,
Rel: $(NODE).attr("rel") || 0
}
},
oncreate: function (NODE, REF_NODE, TYPE, TREE_OBJ, RB) {
},
onrename: function (NODE, TREE_OBJ, RB) {
},
beforemove: function (NODE, REF_NODE, TYPE, TREE_OBJ) {
},
onmove: function (NODE, REF_NODE, TYPE, TREE_OBJ, RB) {
},
oncopy: function (NODE, REF_NODE, TYPE, TREE_OBJ, RB) {
},
beforedelete: function (NODE, TREE_OBJ) {
},
onselect: function (NODE, TREE_OBJ) {
var markName = $(NODE).attr("mark");
if (markName == "xiezuozu")//当节点是协作组的时候才在右边显示该协作组的列表
{
$("[name=contentFrame]").attr("src", "/System/GroupMem/List.aspx?ID=" + $(NODE).attr("zhujian") + "&rel=" + $(NODE).attr("rel"));
}
},
plugins: {},
onopen: function (NODE, tree_obj) {
var result = jQuery.ajax({
url: "GetChildTree.aspx?_=" + new Date().getTime(),
cache: false,
type: 'POST',
async: false,
data: { "higher_level": $(NODE).attr("zhujian"), "mark": $(NODE).attr("mark") },
dataType: "json",
sucess: function (data) {
return data;
}
});
var markName = $(NODE).attr("mark");
if (markName=="danwei") {
if (result.responseText != "" && $(NODE).find("ul").length == 1) {
$(NODE).append(result.responseText);
}
}
else {
if (result.responseText != "" && $(NODE).find("ul").length == 0) {
$(NODE).append(result.responseText);
}
}
}
}
});
document.oncontextmenu = new Function('event.returnValue=false;');
});
</script>
2.后台的:
public void GetTree4Ajax(int jiBie, int shangJiMuLuID, string rel, int flag)
{
CancelView();
try
{
string code = GlobalInfo.DepID;
string HightestUnitName = UnitInforHelper.GetUnitName(GlobalInfo.HighestUnitCode);
string strWhere = "";
if (code.Length == && code.Substring(, ) == "")
{
//省
strWhere = string.Format(" code like '{0}%'", code.Substring(, ));
}
else if (code.Length == && code.Substring(, ) == "")
{
//市
strWhere = string.Format(" code like '{0}%'", code.Substring(, ));
}
else if (code.Length == )
{
//区县
strWhere = string.Format(" code like '{0}%'", code);
}
else
{
//学校
strWhere = string.Format(" code = '{0}'", code);
}
StringBuilder sbMuLu = new StringBuilder("");
DataTable dt = HQLHelper.ExecuteDataTable(@"select * from dbo.view_unitInfor where " + strWhere+" order by name"); //查询单位(学校)
sbMuLu.Append("<ul>");
sbMuLu.Append("<li rel=\"Root\" id=\"" + code + "\" zhujian=\"all\" class=\"open\" mark=\"root\"><a href=\"#\"><ins> </ins>" + UnitInforHelper.GetUnitName(GlobalInfo.HighestUnitCode) + "</a>");
sbMuLu.Append("<ul>");
foreach (DataRow dr in dt.Rows)//学校单位
{
sbMuLu.Append("<li rel=\"R1\" id=\"" + dr["code"] + "\" zhujian=\"" + dr["code"] + "\" MingCheng=\"" + dr["name"] + "\" mark=\"danwei\"><a href=\"#\"><ins> </ins>" + dr["name"] + "</a>");
sbMuLu.Append("<ul>");
sbMuLu.Append("</ul></li>");
}
sbMuLu.Append("</ul>");
sbMuLu.Append("</li></ul>");
Session["sbMulu"] = sbMuLu.ToString();
Response.Write(sbMuLu.ToString());
}
catch (Exception ex)
{
LogHelper.WriteLogError(ex);
}
}
#region Added by DYK 2014-5-30
public void GetChildTree(string higher_level, string mark)
{
CancelView(); string Str = "";
try
{
DataTable dt = new DataTable();//学段表 if (mark == "root")//点击根展开单位
{
//
}
if (mark == "danwei")//点击单位展开学段
{
dt = GetChildTreeData(higher_level, mark);
Str = Open(dt, mark);
}
if (mark == "xueduan")//点击学段展开学科
{
dt = GetChildTreeData(higher_level, mark);
Session["c_p_id"] = higher_level;
Str = Open(dt, mark);
}
if (mark == "xueke")//点击学科加载年级
{
dt = GetChildTreeData(higher_level, mark);
Session["s_id"] = higher_level;
Str = Open(dt, mark);
}
if (mark == "nianji")//点击年级加载对应协作组
{
Session["g_id"] = higher_level;
dt = GetCoopGroupData(Session["g_id"].ToString(), Session["s_id"].ToString(), Session["c_p_id"].ToString());
Str = Closed(dt, "xiezuozu");//末级不能展开
}
Response.Write(Str);
}
catch (Exception ex)
{
LogHelper.WriteLogError(ex);
Response.Write("");
}
}
/// <summary>
/// 获取各个制定层级下面的协作组
/// </summary>
/// <param name="g_id"></param>
/// <param name="s_id"></param>
/// <param name="c_p_id"></param>
/// <returns></returns>
public DataTable GetCoopGroupData(string g_id, string s_id, string c_p_id)
{
CancelView();
DataTable dt = new DataTable();
try
{
//string cmdText = @"select groupid as code,groupname as name from dbo.base_cooperativeGroup where g_id ='" + g_id + "'and subjectId='" + s_id + "' and p_id='" + c_p_id + "'";
string cmdText = @"select groupid as code,groupname as name from dbo.base_cooperativeGroup where g_id ='" + g_id + "' and subjectId='" + s_id + "' and p_id=" + c_p_id;
dt = HQLHelper.ExecuteDataTable(cmdText);
}
catch (Exception)
{ throw;
}
return dt;
}
/// <summary>
/// 根据存储过程调用获取树的下一级(最后一级协作组除外)
/// </summary>
/// <param name="code"></param>
/// <param name="mark"></param>
/// <returns></returns>
public DataTable GetChildTreeData(string code, string mark)
{
CancelView();
DataTable dt = new DataTable();
try
{
SqlParameter[] ps = new SqlParameter[] {
new SqlParameter("@code",code),
new SqlParameter("@mark",mark)
};
dt = HQLHelper.ExecuteDataSet(CommandType.StoredProcedure, "GetChildTree", ps).Tables[];
}
catch (Exception)
{ throw;
}
return dt;
}
public string Open(DataTable dt, string mark)
{
string this_mark = "";
if (mark == "danwei")
{
this_mark = "xueduan";
}
if (mark == "xueduan")
{
this_mark = "xueke";
}
if (mark == "xueke")
{
this_mark = "nianji";
}
if (mark == "nianji")
{
this_mark = "xiezuozu";
}
StringBuilder SuperTreeML = new StringBuilder("");
if (dt.Rows.Count > )
{
SuperTreeML.Append("<ul>");
foreach (DataRow dr in dt.Rows)
{
SuperTreeML.Append("<li rel=\"R1\" id=\"" + dr["code"] + "\" zhujian=\"" + dr["code"] + "\" MingCheng=\"" + dr["name"] + "\" title=\"" + dr["name"] + "\" mark=\"" + this_mark + "\" class=\"closed\"><a href=\"javascript:void(0);\"><ins> </ins>" + dr["name"] + "</a></li>");
}
SuperTreeML.Append("</ul>");
} else
{
SuperTreeML.Append("");
}
return SuperTreeML.ToString();
}
/// <summary>
/// 功能:末级不能展开
/// </summary>
/// <param name="dt"></param>
/// <param name="mark"></param>
/// <returns></returns>
public string Closed(DataTable dt, string mark)
{
StringBuilder SuperTreeML = new StringBuilder("");
if (dt.Rows.Count > )
{
SuperTreeML.Append("<ul>");
foreach (DataRow dr in dt.Rows)
{
SuperTreeML.Append("<li rel=\"Root\" id=\"" + dr["code"] + "\" zhujian=\"" + dr["code"] + "\" MingCheng=\"" + dr["name"] + "\" title=\"" + dr["name"] + "\" mark=\"" + mark + "\" class=\"leaf\"><a href=\"javascript:void(0);\"><ins> </ins>" + dr["name"] + "</a></li>");
}
SuperTreeML.Append("</ul>");
}
else
{
SuperTreeML.Append("");
}
return SuperTreeML.ToString();
}
3.设计到一个存储过程,就是根据两个参数@code,@mark来执行相应的sql了,这里就不贴了。
4.最后附上效果图:

ok,大功告成,没白费我着急上火的。
JsTree异步加载数据实现多级菜单的更多相关文章
- winform异步加载数据到界面
做一个学习记录. 有两个需求: 1.点击按钮,异步加载数据,不卡顿UI. 2.把获取的数据加载到gridview上面. 对于需求1,2,代码如下: public delegate void ShowD ...
- 向上滚动或者向下滚动分页异步加载数据(Ajax + lazyload)[上拉加载组件]
/**** desc : 分页异步获取列表数据,页面向上滚动时候加载前面页码,向下滚动时加载后面页码 ajaxdata_url ajax异步的URL 如data.php page_val_name a ...
- 淘宝购物车页面 智能搜索框Ajax异步加载数据
如果有朋友对本篇文章的一些知识点不了解的话,可以先阅读此篇文章.在这篇文章中,我大概介绍了一下构建淘宝购物车页面需要的基础知识. 这篇文章主要探讨的是智能搜索框Ajax异步加载数据.jQuery的社区 ...
- Jquery zTree结合Asp.net实现异步加载数据
zTree结合Asp.net实现异步加载数据 实现简单操作 zTree 下载 api 访问 :http://www.ztree.me/v3/main.php 例子中用到json数据转化 newtons ...
- jquery easyui easyui-treegrid 使用异步加载数据
jquery easyui easyui-treegrid 使用异步加载数据 jquery easyui easyui-treegrid 异步请求 >>>>>>&g ...
- Highcharts 异步加载数据曲线图表
导入 data.js 文件 异步加载数据需要引入以下js 文件: <script src="http://code.highcharts.com/modules/data.js&quo ...
- [Ext.Net]TreePanel 异步加载数据
异步加载数据指的是页面加载的时候只显示根目录,点击根目录再去加载其子目录. 下面就来介绍下这种异步加载的树结构要怎么实现 现将例子的图 QQ图片20131225134353.jpg (12.1 KB, ...
- 新手教程:不写JS,在MIP页中实现异步加载数据
从需求谈起:在 MIP 页中异步加载数据 MIP(移动网页加速器) 的 加速原理 除了靠谱的 MIP-Cache CDN 加速外,最值得一提的就是组件系统.所有 JS 交互都需要使用 MIP 组件实现 ...
- iScroll.js 向上滑动异步加载数据回弹问题
iScroll是一款用于移动设备web开发的一款插件.像缩放.下拉刷新.滑动切换等移动应用上常见的一些效果都可以轻松实现. 现在最新版本是5.X,官网这里:http://iscrolljs.com/ ...
随机推荐
- UIView上添加了一个按钮和一个单击手势的事件相应,互相不影响的处理方法。。
tapGesture.delegate = self; - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shoul ...
- MyEclipse设置默认的目光格式
首先,选择菜单 windows-->preference Java-->Code Style-->Code Templates code-->new Java files 然后 ...
- android开发 Fragment嵌套调用常见错误
在activity中有时须要嵌套调用fragment,但嵌套调用往往带来视图的显示与预期的不一样或是fragment的切换有问题.在使用时要注意几点: 1.fragment中嵌套fragment,子f ...
- Linux下文件描述符
http://blog.csdn.net/kumu_linux/article/details/7877770 文件描述符是一个简单的整数,用以标明每一个被进程所打开的文件和socket.第一个打开的 ...
- careercup-中等难度 17.4
17.4 编写一个方法,找出两个数字中最大的那一个.不得使用if-else或其他比较运算符. 解法: 我们可以通过一步步的分析来将需要用到的if-else和比较操作符去掉: If a > b, ...
- 实例源码--Android简单团购应用源码
下载源码 技术要点: 1.HTTP通信技术 2.XML数据解析 3.控件的简单应用 4.源码带有非常详细的中文 注释 ...... 详细介绍: 1. HTTP通信技术 通 过HTTP通信技术, ...
- python列表删除重复元素的三种方法
给定一个列表,要求删除列表中重复元素. listA = ['python','语','言','是','一','门','动','态','语','言'] 方法1,对列表调用排序,从末尾依次比较相邻两个元素 ...
- Requirements
Requirements The framework requirements are limited. PHP 5.5 or greater. Apache Web Server or equiva ...
- 业界最有价值的 ASP.NET 博文汇总
ASP.NET凭借它丰富的控件,强大的适应性及良好的封装性,成为业界开发的一门巨匠,它大大缩短了网站开发的时间,降低开发成本.并且可以运行在Web应用软件开发者的全部平台上.本电子书汇集了业界最有价值 ...
- CENTOS install summary
1 centos6.5 before version : first :ultraISO write into u disk,second: copy source iso file into u d ...