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(-1);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('\\')   1);string dir_path = root_path  "/"   dir_name;if (strResult.Length > 0){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('\\')   1);if (strResult.Length > 0){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属性来获取xmldataType: "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顶级nodevar 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顶级nodevar 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 {//直接匹配根节点的textunSelectNode(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,点击查询

 

 


更多专业前端知识,请上 【猿2048】www.mk2048.com

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/361553.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在Twitter上使用Apache Mesos和Apache Aurora进行资源调度和任务启动

播客的第23集是与Bill Farner的谈话 Bill解释了Twitter如何使用Apache Mesos和Apache Aurora在硬件上获得更多收益&#xff0c;并通过在整个基础架构中利用细粒度的资源调度来节省工程时间&#xff08;开发和运营&#xff09;。 Bill谈到了他在Borg上与Google一起在Google上所…

fatal error C1083: 无法打开预编译头文件:“Debug\a.pch”:No such file or directory

一、解决方法 右键点击你创建的项目&#xff0c;选择“属性标签”点击属性&#xff0c;弹出“项目属性页”&#xff0c;在左侧找到以下位置 配置属性 --> C/C --> 预编译头&#xff0c;并选择它&#xff1a;在右边的菜单中选择 “创建/使用预编译头”中的“不使用预编…

ubunt 下 配置samba 服务器

一. samba的安装: sudo apt-get insall sambasudo apt-get install smbfs 二。修改/etc/samba/smb.conf sudo gedit /etc/samba/smb.conf 在smb.conf最后添加 [myShare]comment Shared Folder with username and passwordpath /home/wangywriteable yesbrowseable yesguest…

Telnet初试(本地测试)

win7下开启Telnet功能&#xff1a; 控制面板-程序和功能- 开启服务 然后回车 这样即可完成一次请求 更多专业前端知识&#xff0c;请上 【猿2048】www.mk2048.com

织梦dede 5.7系统基本参数无法修改保存,提示Token mismatch!

织梦dede 5.7系统基本参数无法修改保存&#xff0c;总是提示Token mismatch! 最开始以为是文件权限问题&#xff0c;反复给权限无法解决。 百度了下&#xff0c;也没有好用的方法 最后还是要自己动手 在dede/sys_info.php 54行找到对应的内容 根据代码判断是 $token变量问题 打…

您是否真的要加快Maven的编译/打包速度? 那么takari生命周期插件就是答案。

像你们中的许多人一样&#xff0c;我正在使用多模块Maven项目 。 与现有的许多系统相比&#xff0c;这不是一个很大的数目&#xff0c;它具有15个模块&#xff0c;3种不同的耳朵部署&#xff0c;带有属性文件的大量参数化以及大约10万行Java代码。 在开发高峰期&#xff0c;由于…

手机MMI体系结构及其实现

摘自&#xff1a;http://blog.csdn.net/zc2007/article/details/2340436 1引言 MMI&#xff08;ManMachineInter-face&#xff09;&#xff0c;即人机界面&#xff0c;它负责和用户的交互&#xff0c;在必要的时候调用其它模块的功能。MMI模块在整个系统中处于最 高层&#x…

Aspose.Words简单生成word文档

Aspose.Words简单生成word文档 Aspose.Words.Document doc new Aspose.Words.Document(); Aspose.Words.DocumentBuilder builder new Aspose.W…

ubuntu下安装JDK和netbeans

我在ubuntu下安装netbeans十分简单&#xff0c;我下载了jdk-7u1-nb-7_0_1-linux-ml.sh&#xff0c;直接在终端输入 sh jdk-7u1-nb-7_0_1-linux-ml.sh安装的向导就会启动&#xff0c;你只要选择JDK和netbeans安装的目录&#xff0c;向导就自动替你安装jdk和netbeans&#xff0c;…

在带有组合框的值列表的下拉列表中显示显示属性的子集

组合框值列表&#xff08;inputComboboxListOfValues&#xff09;应该是使用LOV的非常流行的ADF Faces组件。 坦白说&#xff0c;这是我最喜欢的值列表方法。 在这篇简短的文章中&#xff0c;我将重点介绍ADF开发人员经常忽略的一项功能。 如果默认情况下定义了LOV&#xff0c;…

Cause: com.ibatis.common.xml.NodeletException: Error parsing XML. Cause: jav

报错&#xff1a;Cause: com.ibatis.common.xml.NodeletException: Error parsing XML. Cause: jav 原因&#xff1a;1、在对应的xml文件里面 #A#,只写了一个# 2、xml文件里面有多余的字符&#xff0c;如空格等 转载于:https://www.cnblogs.com/zzw3014/p/11316031.html

摆脱困境:在每种测试方法之前重置自动增量列

当我们为将信息保存到数据库的功能编写集成测试时&#xff0c;我们必须验证是否将正确的信息保存到数据库。 如果我们的应用程序使用Spring Framework&#xff0c;则可以为此目的使用Spring Test DbUnit和DbUnit 。 但是&#xff0c;很难验证是否在主键列中插入了正确的值&am…

仅坚持了9天:京东今日宣布暂停火车票代购业务

仅仅只坚持了9天&#xff0c;对于京东商城销售火车票的讨论一直进行着。不论是否具有销售资质&#xff0c;还是变相的收费。到今天下午为止京东商城发表声明暂停火车票代购业务。以下是京东公告全文&#xff1a;尊敬的京东网友&#xff1a;鉴于京东商城火车票代购业务测试期间出…

path.join 与 path.resolve 的区别

1. 对于以/开始的路径片段&#xff0c;path.join只是简单的将该路径片段进行拼接&#xff0c;而path.resolve将以/开始的路径片段作为根目录&#xff0c;在此之前的路径将会被丢弃&#xff0c;就像是在terminal中使用cd命令一样。 path.join(/a, /b) // a/bpath.resolve(/a, /b…

Android IPC系列(一):AIDL使用详解

概述 AIDL可以实现进程间的通信&#xff0c;由于每个进程都是运行在独立的空间&#xff0c;不同的进程想要交互需要借助一些特殊的方式&#xff0c;AIDL就是其中的一种&#xff0c;AIDL是一种模板&#xff0c;因为实际交互过程中&#xff0c;并不是AIDL起的作用&#xff0c;具体…

如何使用单例EJB,Ehcache和MBean构建和清除参考数据缓存

在本文中&#xff0c;我将介绍如何使用单例EJB和Ehcache在Java EE中构建简单的参考数据缓存。 高速缓存将在给定的时间段后重置自身&#xff0c;并且可以通过调用REST端点或MBean方法“手动”清除。 这篇文章实际上是在以前的文章的基础上建立的 。 唯一的区别是&#xff0c;我…

深入浅出React Native 1: 环境配置

该教程主要介绍如何用react native来开发iOS&#xff0c;所以首先&#xff0c;你需要有一台mac&#xff0c;当然黑苹果也是可以的~ 创建一个react native的项目只需要安装以下五个组件~~&#xff08;但....坑爹的是&#xff0c;不FQ的话安装慢成狗呀&#xff09; 1. 安装 xco…

C#排序算法大全

C#排序算法大全 土人 2004-7-21 一、冒泡排序(Bubble) using System; namespace BubbleSorter { public class BubbleSorter { public void Sort(int[] list) { int i,j,temp; bool donefalse; j1; while((j<list.Length)&&(!done)) { donetrue; for…

Spring实战(前言:Spring容器)

Spring容器&#xff0c;顾名思义是用来容纳东西的&#xff0c;装的就是Bean。Spring容器负责创建、配置、管理Bean。spring容器有两个核心接口&#xff1a;BeanFactory和ApplicationContext接口&#xff0c;后者是前者的子接口。在基于spring的Java EE程序中&#xff0c;所有的…

具有WildFly,Arquillian,Jenkins和OpenShift的Java EE 7部署管道

技术提示&#xff03;54展示了如何Arquillianate&#xff08;Arquillianize&#xff1f;&#xff09;一个现有的Java EE项目并在WildFly在已知主机和端口上运行的远程模式下运行这些测试。 技术提示&#xff03;55展示了当WildFly在OpenShift中运行时如何运行这些测试。 这两个…