老生常谈combobox和combotree模糊查询


Posted in Javascript onApril 17, 2017

First

/** 
 * combobox和combotree模糊查询
 * combotree 结果显示两级父节点(手动设置数量)
 * 键盘上下键选择叶子节点
 * 键盘回车键设置文本的值
 */
(function(){
 //combobox可编辑,自定义模糊查询 
 $.fn.combobox.defaults.editable = true; 
 $.fn.combobox.defaults.filter = function(q, row){ 
 var opts = $(this).combobox('options'); 
 return row[opts.textField].indexOf(q) >= 0; 
 }; 
 //combotree可编辑,自定义模糊查询 
 $.fn.combotree.defaults.editable = true;
 //选中行索引
 var leafBlockIndex=0;
 //当前选中行索引
 var nowLeafBlockIndex=-1;
 //combotree 组件
 var comboTree=null;
 //叶子节点DOM Array
 var leafBlocks=null;;
 //将所有的结果叶子节点放入 DOM Array中
 function getDOMArray(data){
 comboTree = $(data).combotree('tree');
 leafBlocks=new Array();
 var leafs = comboTree.tree('getChildren');
 for (var i = 0; i < leafs.length; i++) {
  var leaf = leafs[i];
  var dis =$(leaf.target).css('display')+'';
  if('block' == dis){
  if(comboTree.tree('isLeaf',leaf.target)){
   leafBlocks.push(leaf.target);
  }
  }
 }; 
 };
 //-------------------------------------
 $.extend($.fn.combotree.defaults.keyHandler,{ 
 up:function(e){
  leafBlockIndex=nowLeafBlockIndex;
  leafBlockIndex--;
  getDOMArray(this);
  if(leafBlockIndex <0){
  leafBlockIndex=leafBlocks.length-1;
  }
  comboTree.tree('select',leafBlocks[leafBlockIndex]);
//  easyui 1.3.4版开始可用
//  comboTree.tree('scrollTo',leafBlocks[leafBlockIndex]);
  nowLeafBlockIndex=leafBlockIndex;
 },
 down:function(e){
  leafBlockIndex=nowLeafBlockIndex;
  leafBlockIndex++;
  getDOMArray(this);
  if(leafBlockIndex >= leafBlocks.length){
  leafBlockIndex=0;
  }
  comboTree.tree('select',leafBlocks[leafBlockIndex]);
//  easyui 1.3.4版开始可用
//  comboTree.tree('scrollTo',leafBlocks[leafBlockIndex]);
  nowLeafBlockIndex=leafBlockIndex;
 },
 left: function(e){
  console.log('left');
//  var val = $(this).combo('getText');
//  $(this).combo('setText',val+' ');
 },
 right: function(e){
  console.log('right');
//  var val = $(this).combo('getText');
//  console.log(val);
//  $(this).combo('setText',val+' ');
 },
 enter:function(e){
  var leaf =$(leafBlocks[nowLeafBlockIndex]);
  var value =leaf.children('span').last().text();
  $(this).combo('setText',value);
  $(this).combo('hidePanel')
 }, 
 query:function(q){
  var t = $(this).combotree('tree'); 
  var nodes = t.tree('getChildren'); 
  for(var i=0; i<nodes.length; i++){ 
  var node = nodes[i]; 
  if (node.text.indexOf(q) >= 0){ 
   $(node.target).show();
   var parent=t.tree('getParent',node.target);
   if(parent){
   $(parent.target).show();
   if(parent){
    parent=t.tree('getParent',parent.target);
    $(parent.target).show();
   }
   }
  } else { 
   $(node.target).hide(); 
  } 
  } 
  var opts = $(this).combotree('options'); 
  if (!opts.hasSetEvents){
  opts.hasSetEvents = true; 
  var onShowPanel = opts.onShowPanel; 
  opts.onShowPanel = function(){ 
   var nodes = t.tree('getChildren'); 
   for(var i=0; i<nodes.length; i++){ 
   $(nodes[i].target).show(); 
   } 
   onShowPanel.call(this); 
  }; 
  $(this).combo('options').onShowPanel = opts.onShowPanel; 
  }
 }
 });
})(jQuery);

Second

(function ($) {
 //combotree可编辑,自定义模糊查询 
 $.fn.combotree.defaults.editable = true;
 $.extend($.fn.combotree.defaults.keyHandler, {
 query: function (q) {
  var t = $(this).combotree('tree');
  t.tree("search", q);
 }
 });
 $.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节点的父节点。 
 * argetNode: 将要滚动到的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);

以上这篇老生常谈combobox和combotree模糊查询就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
jQuery阻止冒泡和HTML默认操作
Nov 17 Javascript
基于jquery的拖动布局插件
Nov 25 Javascript
简易js代码实现计算器操作
Apr 15 Javascript
一个JavaScript的求爱小特效
May 09 Javascript
我的Node.js学习之路(二)NPM模块管理
Jul 06 Javascript
修复bash漏洞的shell脚本分享
Dec 31 Javascript
JavaScript事件学习小结(三)js事件对象
Jun 09 Javascript
jQuery实现的无限级下拉菜单功能示例
Sep 12 Javascript
angular route中使用resolve在uglify压缩后问题解决
Sep 21 Javascript
BootStrap 下拉菜单点击之后不会出现下拉菜单(下拉菜单不弹出)的解决方案
Dec 14 Javascript
Vue 2.0中生命周期与钩子函数的一些理解
May 09 Javascript
使用travis-ci如何持续部署node.js应用详解
Jul 30 Javascript
vue实现简单表格组件实例详解
Apr 16 #Javascript
JavaScript实现网页头部进度条刷新
Apr 16 #Javascript
利用JavaScript在网页实现八数码启发式A*算法动画效果
Apr 16 #Javascript
JavaScript 函数的定义-调用、注意事项
Apr 16 #Javascript
AngularJS双向绑定和依赖反转实例详解
Apr 15 #Javascript
JavaScript简单计算人的年龄示例
Apr 15 #Javascript
微信小程序 ES6Promise.all批量上传文件实现代码
Apr 14 #Javascript
You might like
PHP实现的下载远程图片自定义函数分享
2015/01/28 PHP
php实现的微信红包算法分析(非官方)
2015/09/25 PHP
PHP使用Memcache时模拟命名空间及缓存失效问题的解决
2016/02/27 PHP
php使用Jpgraph创建折线图效果示例
2017/02/15 PHP
TP5框架安全机制实例分析
2020/04/05 PHP
PHP 命名空间和自动加载原理与用法实例分析
2020/04/29 PHP
js自带函数备忘 数组
2006/12/29 Javascript
jQuery对象和DOM对象相互转化
2009/04/24 Javascript
JS setCapture 区域外事件捕捉
2010/03/18 Javascript
JS获取html对象的几种方式介绍
2013/12/05 Javascript
一款基jquery超炫的动画导航菜单可响应单击事件
2014/11/02 Javascript
js实现当复选框选择匿名登录时隐藏登录框效果
2015/08/14 Javascript
javascript生成img标签的3种实现方法(对象、方法、html)
2015/12/25 Javascript
js实现网页图片延时加载 提升网页打开速度
2016/01/26 Javascript
原生JavaScript制作微博发布面板效果
2016/03/11 Javascript
jQuery过滤选择器经典应用
2016/08/18 Javascript
ES6 javascript中Class类继承用法实例详解
2017/10/30 Javascript
对Vue beforeRouteEnter 的next执行时机详解
2018/08/25 Javascript
vue mounted 调用两次的完美解决办法
2018/10/29 Javascript
Node.js Buffer模块功能及常用方法实例分析
2019/01/05 Javascript
js删除数组中某几项的方法总结
2019/01/16 Javascript
JavaScript undefined及null区别实例解析
2020/07/21 Javascript
[01:06:39]DOTA2上海特级锦标赛主赛事日 - 1 胜者组第一轮#1Liquid VS Alliance第三局
2016/03/02 DOTA
Python面向对象编程之继承与多态详解
2018/01/16 Python
Django使用Celery异步任务队列的使用
2018/03/13 Python
Python进阶:生成器 懒人版本的迭代器详解
2019/06/29 Python
HTML5+lufylegend实现游戏中的卷轴
2016/02/29 HTML / CSS
SCDKey德国:全球领先的数字游戏市场
2019/04/09 全球购物
采购主管的岗位职责
2013/12/17 职场文书
高中军训感想800字
2014/02/23 职场文书
婚假请假条格式及范文
2014/04/10 职场文书
建筑工地标语
2014/06/18 职场文书
实验心得体会
2014/09/05 职场文书
天河观后感
2015/06/11 职场文书
社区服务理念口号
2015/12/25 职场文书
笔记本自带的win11如何跳过联网激活?
2022/04/20 数码科技