老生常谈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的链式调用浅析
Dec 03 Javascript
JavaScript实现拼音排序的方法
Nov 20 Javascript
js 获取(接收)地址栏参数值的方法
Apr 01 Javascript
ExtJS实现文件下载的方法实例
Nov 09 Javascript
基于jquery固定于顶部的导航响应浏览器滚动条事件
Nov 02 Javascript
非常棒的jQuery图片轮播效果
Apr 17 Javascript
41个Web开发者必须收藏的JavaScript实用技巧
Jul 22 Javascript
AngularJS中scope的绑定策略实例分析
Oct 30 Javascript
如何将你的AngularJS1.x应用迁移至React的方法
Feb 01 Javascript
详解VUE自定义组件中用.sync修饰符与v-model的区别
Jun 26 Javascript
详解Vue路由自动注入实践
Apr 17 Javascript
vue实现点击追加选中样式效果
Nov 01 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实现的在线人员函数库
2008/04/09 PHP
php 随机数的产生、页面跳转、件读写、文件重命名、switch语句
2009/08/07 PHP
PHP中基于ts与nts版本- vc6和vc9编译版本的区别详解
2013/04/26 PHP
php学习笔记之基础知识
2014/11/08 PHP
PHP mysql事务问题实例分析
2016/01/18 PHP
JavaScript 设计模式学习 Factory
2009/07/29 Javascript
JavaScript 原型与继承说明
2010/06/09 Javascript
Jquery Ajax的Get方式时需要注意URL地方
2011/04/07 Javascript
JavaScript编程的10个实用小技巧
2014/04/18 Javascript
JS实现简洁、全兼容的拖动层实例
2015/05/13 Javascript
jQuery Easyui 验证两次密码输入是否相等
2016/05/13 Javascript
详解js的事件代理(委托)
2016/12/22 Javascript
node.js操作mongodb简单示例分享
2017/05/25 Javascript
react-router实现跳转传值的方法示例
2017/05/27 Javascript
bootstrap响应式导航条模板使用详解(含下拉菜单,弹出框)
2017/11/17 Javascript
详解vuex结合localstorage动态监听storage的变化
2018/05/03 Javascript
Webpack 4.x搭建react开发环境的方法步骤
2018/08/15 Javascript
vue-video-player 通过自定义按钮组件实现全屏切换效果【推荐】
2018/08/29 Javascript
实例介绍JavaScript中多种组合继承
2019/01/20 Javascript
js 实现 list转换成tree的方法示例(数组到树)
2019/08/18 Javascript
layui 实现表单和文件上传一起传到后台的例子
2019/09/16 Javascript
详解关闭令人抓狂的ESlint 语法检测配置方法
2019/10/28 Javascript
vue+canvas实现拼图小游戏
2020/09/18 Javascript
python Web开发你要理解的WSGI &amp; uwsgi详解
2018/08/01 Python
Django 创建后台,配置sqlite3教程
2019/11/18 Python
解决python DataFrame 打印结果不换行问题
2020/04/09 Python
python脚本定时发送邮件
2020/12/22 Python
css3实现背景模糊的三种方式(小结)
2020/05/15 HTML / CSS
HTML5 Canvas实现文本对齐的方法总结
2016/03/24 HTML / CSS
英国儿童鞋和靴子:Start-Rite
2019/05/06 全球购物
企业行政文员岗位职责
2013/12/03 职场文书
《放飞蜻蜓》教学反思
2014/04/27 职场文书
中层领导干部群众路线对照检查材料思想汇报
2014/10/02 职场文书
2015年科研工作总结范文
2015/05/13 职场文书
学历证明样本
2015/06/16 职场文书
MySQL批量更新不同表中的数据
2022/05/11 MySQL