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/ ...
随机推荐
- 并查集类的c++封装,比較union_find algorithm四种实现方法之间的性能区别
问题描写叙述: 在计算机科学中,并查集是一种树型的数据结构,其保持着用于处理一些不相交集合(Disjoint Sets)的合并及查询问题.有一个联合-查找算法(union-find algorithm ...
- Android 多点手势识别详解
google 提供的API中,有个类,大家都很熟悉,GestureDetector.使用它,我们可以识别用户通常会用的手势.但是,这个类不支持多点触摸(可能 google认为没有人会在几个手指都在屏幕 ...
- VC6.0设置选项解读(转)
其实软件调试还是一个技术熟练过程,得慢慢自己总结,可以去搜索引擎查找一些相关的文章看看,下边是一篇关于VC6使用的小文章,贴出来大家看看: 大家可能一直在用VC开发软件,但是对于这个编译器却未必很了解 ...
- 从你的u盘启动:30天自制操作系统第四天u盘启动学习笔记
暑假学习小日本的那本书:30天自制操作系统 qq交流群:122358078 ,更多学习中的问题.资料,群里分享 developing environment:ubuntu 关于u盘启动自己做的操 ...
- Java基础知识强化之网络编程笔记15:Android网络通信之 Android异步任务处理(AsyncTask使用)
AsyncTask,是android提供的轻量级的异步类,可以直接继承AsyncTask,在类中实现异步操作,并提供接口反馈当前异步执行的程度(可以通过接口实现UI进度更新),最后反馈执行的 ...
- logstash-input-file 参数说明
参数 close_older close_older: # This has different implications depending on if a file is being tailed ...
- [转]ASP.NET MVC中你必须知道的13个扩展点
本文转自:http://www.cnblogs.com/ejiyuan/archive/2010/03/09/1681442.html ScottGu在其最新的博文中推荐了Simone Chiaret ...
- JVM优化
1.堆大小设置 JVM 中最大堆大小有三方面限制:相关操作系统的数据模型(32-bt还是64-bit)限制:系统的可用虚拟内存限制:系统的可用物理内存限制.32位系统下,一般限制在1.5G~2G:64 ...
- 【原】NGUI中的UIAnchor脚本功能
UIAnchor的功能是把对象锚定在屏幕的边缘(左上,左中,左下,上,中,下,右上,右中,右下),或缩放物体使其匹配屏幕的尺寸. 在1.90版本后,拉长(缩放)的功能被放到UIStretch中,UIA ...
- 问题:loadrunner录制event为0
loadrunner录制问题问题1:录制时出现event为0的状况 解决办法: 1.如果是IE浏览器,把启用第三方浏览器扩展*钩给去掉 2使用火狐浏览器,这个就比较好,在lr启动的时候就去勾选 ...