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,一经查实,立即删除!

相关文章

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

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

Telnet初试(本地测试)

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

您是否真的要加快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;…

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

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

css浮动(float)及清除浮动的几种实用方法

CSS浮动是现在网页布局中使用最频繁的效果之一,而浮动可以帮我们解决很多问题,那么就让我们一起来看一看如何使用浮动. 一.css浮动(float) (1)html文档流 自窗体自上而下分成一行一行&#xff0c;并在每行中按从左到右的顺序排放元素。 (2)网页中大部分对象默认是占用文档流…

一台电脑同时添加git和bitbucket两个网站的ssh key

添加第一个ssh key 就不多说了&#xff0c;不懂的可以自己查资料 ssh-keygen -t rsa -C email_1email.com 然后一路enter就好了 假设已经添加好了git的ssh key 。现在要添加bitbucket的ssh key 首先 ssh-keygen -t rsa -C email_2email.com //同一个邮箱也可以 然后指定公钥的…

属性提取器:获取ListView即时更新其元素的最佳方法

这篇文章是关于如何处理JavaFX ListViews和TableViews的&#xff0c;以及这些控件如何得知所包含元素的更改内容。 我想知道为什么在相关书籍中没有找到关于以下模式的任何信息&#xff0c;因为这是一个非常关键的机制。 那里的许多帖子建议通过调用以下命令来强制触发ChangeEv…

MVC详解

模型&#xff0d;视图&#xff0d;控制器&#xff08;Modal View Controler&#xff0c;MVC&#xff09;是Xerox PARC在八十年代为编程语言Smalltalk&#xff0d;80发明的一种软件设计模式&#xff0c;至今已被广泛使用。最近几年被推荐为Sun公司J2EE平台的设计模式&#xff0c…

ES6之命令妙用

很多人都听说过ES6&#xff08;也就是ECMAScript的新一代标准&#xff09;并且对她充满了向往&#xff0c;下面通过一个ES6中小知识点——let命令&#xff0c;来解开她的神秘面纱&#xff0c;让大家初步认识一下ES6的语法规范。let命令属于ES6中的一个基本语法&#xff0c;与原…

VUE-搜索过滤器

先看看效果 首先引入 <script src"https://cdn.jsdelivr.net/npm/vue"></script> HTML部分 <div id"app"><input v-modelsearch /><ul v-if"searchData.length > 0"><li v-for"item in searchData&quo…

使用spring-session外部化Spring-boot应用程序的会话状态

Spring-session是一个非常酷的新项目&#xff0c;旨在提供一种更简单的方法来管理基于Java的Web应用程序中的会话。 我最近在spring-session中探索的功能之一是它支持外部化会话状态的方式&#xff0c;而无需费心诸如Tomcat或Jetty之类的特定Web容器的内部。 为了测试spring-s…

使用纯HTML和OmniFaces构建动态响应的多级菜单

最近&#xff0c;我不得不使用JSF 2.2创建一个响应式多级菜单。 要求&#xff1a;菜单应&#xff1a; 从后端使用动态结构创建 反应灵敏&#xff0c;例如对桌面和移动设备友好 有带有导航链接的子菜单项 支持触摸事件 支持键盘辅助功能 PrimeFaces的菜单不是一个选择。 实…

Membership学习(三)Membership Providers介绍[xgluxv]

本来想在第三篇文章里介绍一下 Membership的类的&#xff0c;不过现在中文msdn也出来了&#xff0c;所以就不写了&#xff0c;&#xff0c;直接到介绍Membership Providers。 Membership Providers提供了Membership数据源和服务之间的所有接口&#xff0c;在Asp.net2.0中…

Servlet技术

----Servlet是用Java语言编写的应用到Web服务器端的扩展技术&#xff0c;它先于jsp产生&#xff0c;可以方便地对Web应用中的HTTP请求进行处理。在Java Web程序开发中&#xff0c;Servlet主要用于处理各种业务逻辑&#xff0c;他比jsp更具有业务逻辑层的意义。 一。Servlet基础…

文件指针创建失败!File *fp失败

问题记录&#xff1a;项目是在所里边的vs2010上创建的&#xff0c;正常&#xff01;在自己的笔记本上使用vs13和19都一直报错&#xff01;指针一直为空&#xff01; 网上查了好久&#xff0c;试了很多方法都没有用&#xff01;最后发现是权限的问题&#xff0c;c盘下边创建不了…

前端开发:小程序--第一步

当我在接到小程序的项目的时候&#xff0c;几乎可以说是一脸懵因为对小程序的概念说实话是不太理解的&#xff0c;或者说理解的不太透彻&#xff0c;但是领导给项目说要完成&#xff0c;那没办法&#xff0c;还是要继续呀。 首先&#xff0c;我就想着先注册一个看看&#xff0…