老生常谈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 相关文章推荐
Apply an AutoFormat to an Excel Spreadsheet
Jun 12 Javascript
关于全局变量和局部变量的那些事
Jan 11 Javascript
jQuery.Validate验证库的使用介绍
Apr 26 Javascript
Jquery 过滤器(first,last,not,even,odd)的使用
Jan 22 Javascript
JS实现动态给图片添加边框的方法
Apr 01 Javascript
分享一个原生的JavaScript拖动方法
Sep 25 Javascript
HTML5实现微信拍摄上传照片功能
Apr 21 Javascript
js实现登录注册框手机号和验证码校验(前端部分)
Sep 28 Javascript
vue中简单弹框dialog的实现方法
Feb 26 Javascript
webpack4.x开发环境配置详解
Aug 04 Javascript
vue-cli安装使用流程步骤详解
Nov 08 Javascript
基于JS实现数字动态变化显示效果附源码
Jul 18 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 随机排序广告的实现代码
2011/05/09 PHP
PHP curl_setopt()函数实例代码与参数分析
2011/06/02 PHP
PHP中全局变量global和$GLOBALS[]的区别分析
2012/08/06 PHP
CodeIgniter配置之database.php用法实例分析
2016/01/20 PHP
php htmlentities()函数的定义和用法
2016/05/13 PHP
PHP date_default_timezone_set()设置时区操作实例分析
2020/05/16 PHP
获取DOM对象的几种扩展及简写
2006/10/09 Javascript
学习面向对象之面向对象的术语
2010/11/30 Javascript
js nextSibling属性和previousSibling属性概述及使用注意
2013/02/16 Javascript
js 设置缓存及获取设置的缓存
2014/05/08 Javascript
JQuery做的一个简单的点灯游戏分享
2014/07/16 Javascript
js改变Iframe中Src的方法
2015/05/05 Javascript
基于jQuery和CSS3制作数字时钟附源码下载(jquery篇)
2015/11/24 Javascript
js判断浏览器是否支持严格模式的方法
2016/10/04 Javascript
解析AngularJS中get请求URL出现的跨域问题
2016/12/01 Javascript
微信小程序获取循环元素id以及wx.login登录操作
2017/08/17 Javascript
详解Vue 多级组件透传新方法provide/inject
2018/05/09 Javascript
微信小程序页面间值传递的两种方法
2018/11/26 Javascript
解决node-sass偶尔安装失败的方法小结
2018/12/05 Javascript
使用Phantomjs和Node完成网页的截屏快照的方法
2019/07/16 Javascript
可拖拽组件slider.js使用方法详解
2020/12/04 Javascript
JavaScript 中的六种循环方法
2021/01/06 Javascript
在Python的Django框架中更新数据库数据的方法
2015/07/17 Python
python ddt数据驱动最简实例代码
2019/02/22 Python
Python unittest工作原理和使用过程解析
2020/02/24 Python
PyTorch预训练Bert模型的示例
2020/11/17 Python
L*SPACE官网:比基尼、泳装和度假服装
2019/03/18 全球购物
护理专业毕业生自我鉴定
2013/10/08 职场文书
自动化专业毕业生自荐信
2013/11/01 职场文书
住房抵押登记委托书
2014/09/27 职场文书
小学运动会报道稿
2014/10/04 职场文书
共青团员自我评价
2015/03/10 职场文书
2015年音乐教学工作总结
2015/07/22 职场文书
机关单位2016年法制宣传日活动总结
2016/04/01 职场文书
JavaScript 定时器详情
2021/11/11 Javascript
Android在Sqlite3中的应用及多线程使用数据库的建议
2022/04/24 Java/Android