扩展jquery easyui tree的搜索树节点方法(推荐)


Posted in Javascript onOctober 28, 2016

如下所示:

/**
 * 1)扩展jquery easyui tree的节点检索方法。使用方法如下:
 * $("#treeId").tree("search", searchText);	 
 * 其中,treeId为easyui tree的根UL元素的ID,searchText为检索的文本。
 * 如果searchText为空或"",将恢复展示所有节点为正常状态
 */
(function($) {	
	
	$.extend($.fn.tree.methods, {
		/**
		 * 扩展easyui tree的搜索方法
		 * @param tree easyui tree的根DOM节点(UL节点)的jQuery对象
		 * @param searchText 检索的文本
		 * @param this-context easyui tree的tree对象
		 */
		search: function(jqTree, searchText) {
			//easyui tree的tree对象。可以通过tree.methodName(jqTree)方式调用easyui tree的方法
			var tree = this;
			
			//获取所有的树节点
			var nodeList = getAllNodes(jqTree, tree);
			
	 		//如果没有搜索条件,则展示所有树节点
			searchText = $.trim(searchText);
	 		if (searchText == "") {
	 			for (var i=0; i<nodeList.length; i++) {
	 				$(".tree-node-targeted", nodeList[i].target).removeClass("tree-node-targeted");
	 	 			$(nodeList[i].target).show();
	 	 		}
	 			//展开已选择的节点(如果之前选择了)
	 			var selectedNode = tree.getSelected(jqTree);
	 			if (selectedNode) {
	 				tree.expandTo(jqTree, selectedNode.target);
	 			}
	 			return;
	 		}
	 		
	 		//搜索匹配的节点并高亮显示
	 		var matchedNodeList = [];
	 		if (nodeList && nodeList.length>0) {
	 			var node = null;
	 			for (var i=0; i<nodeList.length; i++) {
	 				node = nodeList[i];
	 				if (isMatch(searchText, node.text)) {
	 					matchedNodeList.push(node);
	 				}
	 			}
	 			
	 			//隐藏所有节点
	 	 		for (var i=0; i<nodeList.length; i++) {
	 	 			$(".tree-node-targeted", nodeList[i].target).removeClass("tree-node-targeted");
	 	 			$(nodeList[i].target).hide();
	 	 		} 			
	 			
	 			//折叠所有节点
	 	 		tree.collapseAll(jqTree);
	 			
	 			//展示所有匹配的节点以及父节点 			
	 			for (var i=0; i<matchedNodeList.length; i++) {
	 				showMatchedNode(jqTree, tree, matchedNodeList[i]);
	 			}
	 		} 	 
		},
		
		/**
		 * 展示节点的子节点(子节点有可能在搜索的过程中被隐藏了)
		 * @param node easyui tree节点
		 */
		showChildren: function(jqTree, node) {
			//easyui tree的tree对象。可以通过tree.methodName(jqTree)方式调用easyui tree的方法
			var tree = this;
			
			//展示子节点
			if (!tree.isLeaf(jqTree, node.target)) {
				var children = tree.getChildren(jqTree, node.target);
				if (children && children.length>0) {
					for (var i=0; i<children.length; i++) {
						if ($(children[i].target).is(":hidden")) {
							$(children[i].target).show();
						}
					}
				}
			} 	
		},
		
		/**
		 * 将滚动条滚动到指定的节点位置,使该节点可见(如果有滚动条才滚动,没有滚动条就不滚动)
		 * @param param {
		 * 	 treeContainer: easyui tree的容器(即存在滚动条的树容器)。如果为null,则取easyui tree的根UL节点的父节点。
		 *  targetNode: 将要滚动到的easyui tree节点。如果targetNode为空,则默认滚动到当前已选中的节点,如果没有选中的节点,则不滚动
		 * } 
		 */
		scrollTo: function(jqTree, param) {
			//easyui tree的tree对象。可以通过tree.methodName(jqTree)方式调用easyui tree的方法
			var tree = this;
			
			//如果node为空,则获取当前选中的node
			var targetNode = param && param.targetNode ? param.targetNode : tree.getSelected(jqTree);
			
			if (targetNode != null) {
				//判断节点是否在可视区域				
				var root = tree.getRoot(jqTree);
				var $targetNode = $(targetNode.target);
				var container = param && param.treeContainer ? param.treeContainer : jqTree.parent();
				var containerH = container.height();
				var nodeOffsetHeight = $targetNode.offset().top - container.offset().top;
				if (nodeOffsetHeight > (containerH - 30)) {
					var scrollHeight = container.scrollTop() + nodeOffsetHeight - containerH + 30;
					container.scrollTop(scrollHeight);
				}							
			}
		}
	});
	
	
	
	
	/**
	 * 展示搜索匹配的节点
	 */
	function showMatchedNode(jqTree, tree, node) {
 		//展示所有父节点
 		$(node.target).show();
 		$(".tree-title", node.target).addClass("tree-node-targeted");
 		var pNode = node;
 		while ((pNode = tree.getParent(jqTree, pNode.target))) {
 			$(pNode.target).show(); 			
 		}
 		//展开到该节点
 		tree.expandTo(jqTree, node.target);
 		//如果是非叶子节点,需折叠该节点的所有子节点
 		if (!tree.isLeaf(jqTree, node.target)) {
 			tree.collapse(jqTree, node.target);
 		}
 	} 	 
	
	/**
	 * 判断searchText是否与targetText匹配
	 * @param searchText 检索的文本
	 * @param targetText 目标文本
	 * @return true-检索的文本与目标文本匹配;否则为false.
	 */
	function isMatch(searchText, targetText) {
 		return $.trim(targetText)!="" && targetText.indexOf(searchText)!=-1;
 	}
	
	/**
	 * 获取easyui tree的所有node节点
	 */
	function getAllNodes(jqTree, tree) {
		var allNodeList = jqTree.data("allNodeList");
		if (!allNodeList) {
			var roots = tree.getRoots(jqTree);
 			allNodeList = getChildNodeList(jqTree, tree, roots);
 			jqTree.data("allNodeList", allNodeList);
		}
 		return allNodeList;
 	}
 	
	/**
	 * 定义获取easyui tree的子节点的递归算法
	 */
 	function getChildNodeList(jqTree, tree, nodes) {
 		var childNodeList = [];
 		if (nodes && nodes.length>0) { 			
 			var node = null;
 			for (var i=0; i<nodes.length; i++) {
 				node = nodes[i];
 				childNodeList.push(node);
 				if (!tree.isLeaf(jqTree, node.target)) {
 					var children = tree.getChildren(jqTree, node.target);
 					childNodeList = childNodeList.concat(getChildNodeList(jqTree, tree, children));
 				}
 			}
 		}
 		return childNodeList;
 	}
})(jQuery);

因为jquery easyui tree原生的搜索只支持ID搜索,所以扩展了jquery easyui tree搜索树节点的方法,使其支持节点名称的模糊匹配,并将不匹配的节点隐藏。

以上就是小编为大家带来的扩展jquery easyui tree的搜索树节点方法(推荐)全部内容了,希望大家多多支持三水点靠木~

Javascript 相关文章推荐
JavaScript 核心参考教程 内置对象
Oct 13 Javascript
基于jQuery的图片左右无缝滚动插件
May 23 Javascript
jquery实现鼠标拖动图片效果示例代码
Jan 09 Javascript
利用Keydown事件阻止用户输入实现代码
Mar 11 Javascript
JQuery 控制内容长度超出规定长度显示省略号
May 23 Javascript
JQuery实现table行折叠效果以JSON做数据源
May 26 Javascript
使用AngularJS中的SCE来防止XSS攻击的方法
Jun 18 Javascript
Bootstrap CSS组件之分页(pagination)和翻页(pager)
Dec 17 Javascript
ES6学习之变量的解构赋值
Feb 12 Javascript
js实现截图保存图片功能的代码示例
Feb 16 Javascript
javascript function(函数类型)使用与注意事项小结
Jun 10 Javascript
js中值引用和地址引用实例分析
Jun 21 Javascript
浅谈jQuery中的eq()与DOM中element.[]的区别
Oct 28 #Javascript
js基础之DOM中document对象的常用属性方法详解
Oct 28 #Javascript
Javascript+CSS3实现进度条效果
Oct 28 #Javascript
js基础之DOM中元素对象的属性方法详解
Oct 28 #Javascript
JavaScript中访问id对象 属性的方式访问属性(实例代码)
Oct 28 #Javascript
JavaScript 轮播图和自定义滚动条配合鼠标滚轮分享代码贴
Oct 28 #Javascript
微信小程序 loading(加载中提示框)实例
Oct 28 #Javascript
You might like
PHP 开发环境配置(Zend Studio)
2010/04/28 PHP
PHP中round()函数对浮点数进行四舍五入的方法
2014/11/19 PHP
Laravel中注册Facades的步骤详解
2016/03/16 PHP
golang 调用 php7详解及实例
2017/01/04 PHP
PHP实现的多进程控制demo示例
2019/07/22 PHP
[原创]网络复制内容时常用的正则+editplus
2006/11/30 Javascript
List Information About the Binary Files Used by an Application
2007/06/11 Javascript
iframe的onload在Chrome/Opera中执行两次Bug的解决方法
2011/03/17 Javascript
深入理解Javascript动态方法调用与参数修改的问题
2013/12/10 Javascript
jQuery表格插件datatables用法总结
2014/09/05 Javascript
JavaScript创建对象的方式小结(4种方式)
2015/12/17 Javascript
Angularjs分页查询的实现
2017/02/24 Javascript
JS实现自动轮播图效果(自适应屏幕宽度+手机触屏滑动)
2017/06/19 Javascript
js编写简单的计时器功能
2017/07/15 Javascript
js设置随机切换背景图片的简单实例
2017/11/12 Javascript
Js中使用正则表达式验证输入是否有特殊字符
2018/09/07 Javascript
前端防止用户重复提交js实现代码示例
2018/09/07 Javascript
JQuery搜索框自动补全(模糊匹配)功能实现示例
2019/01/08 jQuery
微信小程序 轮播图实现原理及优化详解
2019/09/29 Javascript
[03:09]2014DOTA2国际邀请赛 Mushi前队友送上祝福
2014/07/12 DOTA
Python2.5/2.6实用教程 入门基础篇
2009/11/29 Python
Python遍历目录的4种方法实例介绍
2015/04/13 Python
Windows下Python使用Pandas模块操作Excel文件的教程
2016/05/31 Python
Python中super函数的用法
2017/11/17 Python
python遍历一个目录,输出所有的文件名的实例
2018/04/23 Python
Python爬虫实现的根据分类爬取豆瓣电影信息功能示例
2019/09/15 Python
Python unittest工作原理和使用过程解析
2020/02/24 Python
Python模块相关知识点小结
2020/03/09 Python
python爬取代理ip的示例
2020/12/18 Python
纯CSS3制作页面切换效果的实例代码
2019/05/30 HTML / CSS
顶级宝石首饰网络零售商:Angara
2016/10/25 全球购物
人事档案接收函
2014/01/12 职场文书
税务干部群众路线教育实践活动自我剖析材料
2014/09/21 职场文书
教师四风自我剖析材料
2014/09/30 职场文书
2014年人民警察入党思想汇报
2014/10/12 职场文书
python 学习GCN图卷积神经网络
2022/05/11 Python