easyui树形菜单实现


需求:读取路径配置中的相对路径获取对应的子文件夹及其子文件并形成树形结构,加载xml文件,输入搜索关键字匹配xml里面的value节点的值对应的contact值的集合并进行搜索
例如:输入b,找到xml里面的文本节点等于b的value节点,并找到对应的contact节点获取对应的文本节点值,结果是3,4,最后匹配的就是文件名包含b或3或4的所有文件并高亮显示
1、页面布局
<div>
<a href="javascript:;" class="easyui-linkbutton">路径配置</a><input type="text" value="/Images" id="root_path" />
<a id="btn_loadxml" href="javascript:;" class="easyui-linkbutton">加载xml</a><input type="text" value="/FilesHelpManager/keyword_config.xml" id="xml_path" />
<a id="btn_search" href="javascript:;" class="easyui-linkbutton">搜索</a><input type="text" value="" id="txt_search" />
</div>
<div>
<ul id="path_tree" checkbox="true"></ul>
</div>
<%--右键下载按钮--%>
<div id="right_download" class="easyui-menu" style="width: 120px;">
<div onclick="Download();">
Download
</div>
</div>
2、初始化并加载路径配置下的所有文件夹及其子文件并形成树形目录
var $path_tree;
$(function () {
$path_tree = $('#path_tree');
//加载指定文件夹形成树形目录
loadTreeDirectorys();
//点击搜索
$("#btn_search").on("click", tree_search);
//点击加载xml
$("#btn_loadxml").on("click", LoadXml);
});
//加载指定文件夹形成树形目录
function loadTreeDirectorys() {
//页面初始化时加载页面的树形菜单
$.post("/Handler/FilesHelpManager/FilesHelpHandler.ashx",
{
"action": "GetFileTree",
"root_path": $("#root_path").val()//根目录位置
},
function (json) {
$("#path_tree").tree({
data: json,
onContextMenu: function (e, node) {
e.preventDefault();
$(this).tree('select', node.target);
//console.log(node.target);
$('#right_download').menu('show', {
left: e.pageX,
top: e.pageY
});
}
});
}, "json");
}
3、后台读取子文件夹及其子文件
HttpRequest request;
HttpResponse response;
public void ProcessRequest(HttpContext context)
{
request = context.Request;
response = context.Response;
context.Response.Buffer = true;
context.Response.ExpiresAbsolute = DateTime.Now.AddDays(-);
context.Response.AddHeader("pragma", "no-cache");
context.Response.AddHeader("cache-control", "");
context.Response.CacheControl = "no-cache";
context.Response.ContentType = "text/plain"; string action = context.Request["action"];
System.Reflection.MethodInfo methodinfo = this.GetType().GetMethod(action);
methodinfo.Invoke(this, null);
} public void GetFileTree()
{
StringBuilder strResult = new StringBuilder(); string root_path = request.Params["root_path"]; string root_path_absolute = HttpContext.Current.Server.MapPath(root_path); strResult.Append("["+GetFilesTree(root_path_absolute,root_path) +"]");
response.Write(strResult.ToString());
} /// <summary>
/// 获取指定文件夹里的子文件夹和子文件(包括嵌套的)
/// </summary>
/// <param name="root_path_absolute">绝对路径</param>
/// <param name="root_path">相对于网站根目录路径</param>
/// <returns></returns>
private string GetFilesTree(string root_path_absolute,string root_path)
{
StringBuilder strResult = new StringBuilder(); string[] dirs = Directory.GetDirectories(root_path_absolute);
dirs.ToList().ForEach(dir =>
{
string dir_name = dir.Substring(dir.LastIndexOf('\\') + );
string dir_path = root_path+ "/" + dir_name;
if (strResult.Length > )
{
strResult.Append(",");
}
string strDirs = "{\"text\":\"" + dir_name + "\",\"state\":\"closed\",\"attributes\":{\"dir_src\":\"" + dir_path + "\"},\"children\":[" + GetFilesTree(dir, dir_path) + "]}"; strResult.Append(strDirs);
}); string[] files = Directory.GetFiles(root_path_absolute);
files.ToList().ForEach(file =>
{
string filename = file.Substring(file.LastIndexOf('\\') + );
if (strResult.Length > )
{
strResult.Append(",");
}
string strFiles = "{\"text\":\"" + filename + "\",\"attributes\":{\"file_src\":\"" + root_path+"/"+ filename + "\"}}";
strResult.Append(strFiles);
}); return strResult.ToString();
}
后台读取子文件夹及其子文件
4、点击加载xml文件(jQuery加载)
定义全局变量用来接收读取的xml文件内容的值
//循环树形菜单text然后匹配下面数组 判断是否包含
var target_obj = [{ keyword: "a", contact_arr: ["1", "2"] }];
//加载xml
function LoadXml() {
$.ajax({
type: "get",
url: $("#xml_path").val(),//这里通过设置url属性来获取xml
dataType: "xml",
timeout: 1000, //设定超时
cache: false, //禁用缓存
success: function (xml) {//这里是解析xml
//清空数组对象
target_obj = [];
$(xml).find("keyword").each(function (i, item) {
var $this = $(this);
var $value = $this.children("value"); //获取value节点
var $contacts = $this.children("contact"); //获取contact节点 //console.log($value); console.log($contacts);// return;
//要准备压入target_obj数组中的对象
var arr_obj = {};
arr_obj.keyword = $value.text().trim();
arr_obj.contact_arr = new Array();
//循环contact节点
$.each($contacts, function (j, contact) {
arr_obj.contact_arr.push($(contact).text().trim());
});
target_obj.push(arr_obj);
}); //console.log(target_obj);
}
});
}
jQuery加载xml文件
5、输入搜索字符串并点击搜索
//树形菜单查找
function tree_search() {
//清空之前的所有选项并收缩
clearAllSelect();
var search_text = $("#txt_search").val().trim();
if (search_text.length <= 0) return;//输入空字符串不执行任何操作 //要循环的匹配数组
var target_arr = [];
target_arr.push(search_text);
$.each(target_obj, function (index,item) {
if (item.keyword == search_text) {
$.each(item.contact_arr, function (index1, item1) {
if (item1.length > 0) target_arr.push(item1)
});
}
}); //console.log(target_arr.join(",")); var parentNodes = $path_tree.tree('getRoots'); //得到tree顶级node
var childrens;//子节点
//循环根节点
$.each(parentNodes, function (index, parentNode) {
childrens = $path_tree.tree('getChildren', parentNode.target);//获取顶级node下所有子节点
if (childrens.length>0) {//如果有子节点
//循环所有子节点
$.each(childrens, function (child_index, child) {
//循环匹配数组
$.each(target_arr, function (arr_index, arr_item) {
if (child.text.indexOf(arr_item) >= 0) {
selectNode(child);//选中当前节点
expandParent(child);//打开所有父节点
return;//跳出第一层循环
}
})
});
} else {//直接匹配根节点的text
//循环匹配数组
$.each(target_arr, function (arr_index, arr_item) {
if (parentNode.text.indexOf(arr_item) >= 0) {
selectNode(parentNode);//选中当前节点
expandParent(parentNode);//打开所有父节点
return;//跳出第一层循环
}
})
}
});
} de节点
function selectNode(node) {
//console.log(node.target);//.tree-node-selected
$(node.target).addClass("tree-node-selected");
$path_tree.tree('check', node.target);//check select
}
//取消选中node节点
function unSelectNode(node) {
$(node.target).removeClass("tree-node-selected");
$path_tree.tree('uncheck', node.target);//check select
}
//展开子节点对应的所有父节点
function expandParent(node) {
var parent = node;
var t = true;
do {
parent = $path_tree.tree('getParent', parent.target); //获取此节点父节点
if (parent) { //如果存在
t = true;
$path_tree.tree('expand', parent.target);
} else {
t = false;
}
} while (t);
}
//清空所有选择项 收缩所有节点
function clearAllSelect() {
var parentNodes = $path_tree.tree('getRoots'); //得到tree顶级node
var childrens;//子节点
//循环根节点
$.each(parentNodes, function (index, parentNode) {
childrens = $path_tree.tree('getChildren', parentNode.target);//获取顶级node下所有子节点
if (childrens.length > 0) {//如果有子节点
//循环所有子节点
$.each(childrens, function (child_index, child) {
unSelectNode(child);//取消选中当前节点
});
} else {//直接匹配根节点的text
unSelectNode(parentNode);//取消选中当前节点
}
}); //收缩所有
$path_tree.tree('collapseAll');
}
搜索并高亮显示结果
6、右键下载文件
//右键点击下载
function Download() {
var node = $path_tree.tree('getSelected'); //console.log(node);
var url = node.attributes.file_src;
var el = document.createElement("a");
document.body.appendChild(el);
el.href = url; //url 是你得到的连接
el.target = '_self'; //指定在新窗口打开
el.setAttribute("download", "");//指示不解析 只下载 ie不兼容
el.click();
document.body.removeChild(el);
}
下载文件,构建a标签然后点击之后再移除
示例:输入a,点击查询

输入h,点击查询

easyui树形菜单实现的更多相关文章
- 雷林鹏分享:jQuery EasyUI 树形菜单 - 使用标记创建树形菜单
jQuery EasyUI 树形菜单 - 使用标记创建树形菜单 一个树形菜单(Tree)可以从标记创建.easyui 树形菜单(Tree)也可以定义在 元素中.无序列表的 元素提供一个基础的树(Tre ...
- 雷林鹏分享:jQuery EasyUI 树形菜单 - 树形菜单添加节点
jQuery EasyUI 树形菜单 - 树形菜单添加节点 本教程向您展示如何附加节点到树形菜单(Tree).我们将创建一个包含水果和蔬菜节点的食品树,然后添加一些其他水果到已存在的水果节点. 创建食 ...
- 雷林鹏分享:jQuery EasyUI 树形菜单 - 创建异步树形菜单
jQuery EasyUI 树形菜单 - 创建异步树形菜单 为了创建异步的树形菜单(Tree),每一个树节点必须要有一个 'id' 属性,这个将提交回服务器去检索子节点数据. 创建树形菜单(Tree) ...
- 雷林鹏分享:jQuery EasyUI 树形菜单 - 树形菜单拖放控制
jQuery EasyUI 树形菜单 - 树形菜单拖放控制 当在一个应用中使用树(Tree)插件,拖拽(drag)和放置(drop)功能要求允许用户改变节点位置.启用拖拽(drag)和放置(drop) ...
- 雷林鹏分享:jQuery EasyUI 树形菜单 - 创建带复选框的树形菜单
jQuery EasyUI 树形菜单 - 创建带复选框的树形菜单 easyui 的树(Tree)插件允许您创建一个复选框树.如果您点击一个节点的复选框,这个点击的节点信息将向上和向下继承.例如:点击 ...
- 雷林鹏分享:jQuery EasyUI 树形菜单 - 创建复杂树形网格
jQuery EasyUI 树形菜单 - 创建复杂树形网格 树形网格(TreeGrid)可以展示有限空间上带有多列和复杂数据电子表格.本教程将演示如何将表格数据排列在分割的网格和多行表头中,以便组织共 ...
- 雷林鹏分享:jQuery EasyUI 树形菜单 - 树形菜单加载父/子节点
jQuery EasyUI 树形菜单 - 树形菜单加载父/子节点 通常表示一个树节点的方式就是在每一个节点存储一个 parentid. 这个也被称为邻接列表模型. 直接加载这些数据到树形菜单(Tree ...
- 雷林鹏分享:jQuery EasyUI 树形菜单 - 创建基础树形网格
jQuery EasyUI 树形菜单 - 创建基础树形网格 树形网格(TreeGrid)组件从数据网格(DataGrid)继承,但是允许在行之间存在父/子节点关系.许多属性继承至数据网格(DataGr ...
- 雷林鹏分享:jQuery EasyUI 树形菜单 - 树形网格添加分页
jQuery EasyUI 树形菜单 - 树形网格添加分页 本教程展示如何向带有动态加载特性的树形网格(TreeGrid)添加分页. 创建树形网格(TreeGrid) 启用树形网格(TreeGrid) ...
- 雷林鹏分享:jQuery EasyUI 树形菜单 - 树形网格动态加载
jQuery EasyUI 树形菜单 - 树形网格动态加载 动态加载树形网格有助于从服务器上加载部分的行数据,避免加载大型数据的长时间等待.本教程将向您展示如何创建带有动态加载特性的树形网格(Tree ...
随机推荐
- 新人须知的网站文件和MySQL数据库备份流程思路
昨天老左再次遇到一个网友告知使用的一台服务器自己无意中点击主机商面板的导致服务器被重新安装系统(居然这也可以),问问是否可以恢复数据.这个同学和之前遇到好几次的网友真相似,从开始购买服务器,到自己网站 ...
- vue2.0用法技巧汇总
1.class拼接: 2.select下拉截取: <template> <!--vip班支付报名页面--> <div id="payRecordMain&quo ...
- [BZOJ 2894]世界线
传送门 \(\color{green}{solution}\) 在开这道题之前建议先看看3756:pty的字符串,然后你会发现这题就很zz了. 当然,作为一名合格的博主,我还是应该写点什么的 首先,我 ...
- 进阶篇:4.3)DFA设计指南:宽松公差及人性装配及其他
本章目的:设计需要为装配考虑,给他们提供各种优待,装配才能做出好产品. 1.前言 机械贴合现实而软件远离现实. 越是学习机械设计的原则,越是感觉他们和一些做人做事的道理相同的. 如,机械设计原则都是有 ...
- 初入Android Studio的我
最近由于工作上的需要,领导让我去学点Android 以前因为兴趣的原因也自己搞过一点点 所以就欣然领命了 那么在此之前 我们来了解一下什么是Android 这是链接 自己去看吧 哈哈哈 https ...
- dubbo服务引用与集群容错
服务引用无非就是做了两件事 将spring的schemas标签信息转换bean,然后通过这个bean的信息,连接.订阅zookeeper节点信息创建一个invoker 将invoker的信息创建一个动 ...
- [Xamarin.Android] 如何透過電子郵件部署Xamarin.Android App (转帖)
Android App在部署到實機的時候不像iOS的App限制你一定要使用向Apple申請的開發者憑證,在Apple不管是你要上架到Apple Store或者是企業內部署,你都必須向蘋果申請憑證. 而 ...
- eclipse常用快捷键实践积累
1. [Ctrl + D]:删除一整行 2. 给函数添加注释 [选中函数名]-[Alt + Shift + J].如果需要自定义注释内容可通过[项目]-[属性]-[Java代码样式]-[代码模板]-[ ...
- How can I set ccshared=-fPIC while executing ./configure?
解决方式如下: make clean ./configure CFLAGS=-fPIC CXXFLAGS=-fPIC
- Integer 与 int -- 自动装箱(autoboxing)与自动拆箱(unboxing)
转载于 http://www.ticmy.com/?p=110 jdk1.5引入了自动装箱(autoboxing)与自动拆箱(unboxing),这方便了集合类以及一些方法的调用,同时也使初学者对其感 ...