jQuery实现select模糊查询(反射机制)


Posted in Javascript onJanuary 14, 2017

通过如下代码就可以简单实现select带模糊查询的条件查询,具体如下jquery.select.js如下:

(function($) {
 $.selectSuggest = function(target, data, itemSelectFunction) {
 var defaulOption = {
  suggestMaxHeight: '200px',//弹出框最大高度
  itemColor : '#000000',//默认字体颜色
  itemBackgroundColor:'RGB(199,237,204)',//默认背景颜色
  itemOverColor : '#ffffff',//选中字体颜色
  itemOverBackgroundColor : '#C9302C',//选中背景颜色
  itemPadding : 3 ,//item间距
  fontSize : 12 ,//默认字体大小
  alwaysShowALL : true //点击input是否展示所有可选项
  };
  var maxFontNumber = 0;//最大字数
  var currentItem;
  var suggestContainerId = target + "-suggest";
  var suggestContainerWidth = $('#' + target).innerWidth();
  var suggestContainerLeft = $('#' + target).offset().left;
  var suggestContainerTop = $('#' + target).offset().top + $('#' + target).outerHeight();
  var showClickTextFunction = function() {
  $('#' + target).val(this.innerText);
  currentItem = null;
  $('#' + suggestContainerId).hide();
  }
  var suggestContainer;
  if ($('#' + suggestContainerId)[0]) {
  suggestContainer = $('#' + suggestContainerId);
  suggestContainer.empty();
  } else {
  suggestContainer = $('<div></div>'); //创建一个子<div>
  }
  suggestContainer.attr('id', suggestContainerId);
  suggestContainer.attr('tabindex', '0');
  suggestContainer.hide();
  var _initItems = function(items) {
  suggestContainer.empty();
   var itemHight=0;
  for (var i = 0; i < items.length; i++) {
   if(items[i].text.length > maxFontNumber){
    maxFontNumber = items[i].text.length;
    }
   var suggestItem = $('<div></div>'); //创建一个子<div>
   suggestItem.attr('id', items[i].id);
   suggestItem.append(items[i].text);
   suggestItem.css({
    'padding':defaulOption.itemPadding + 'px',
   'white-space':'nowrap',
   'cursor': 'pointer',
   'background-color': defaulOption.itemBackgroundColor,
   'color': defaulOption.itemColor
   });
   suggestItem.bind("mouseover",
   function() {
   $(this).css({
    'background-color': defaulOption.itemOverBackgroundColor,
    'color': defaulOption.itemOverColor
   });
   currentItem = $(this);
   });
   suggestItem.bind("mouseout",
   function() {
   $(this).css({
    'background-color': defaulOption.itemBackgroundColor,
    'color': defaulOption.itemColor
   });
   currentItem = null;
   });
   suggestItem.bind("click", showClickTextFunction);
   suggestItem.bind("click", itemSelectFunction);
   suggestItem.appendTo(suggestContainer);
   suggestContainer.appendTo(document.body);
  }
  }
  var inputChange = function() {
  var inputValue = $('#' + target).val();
  inputValue = inputValue.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g, "\\$&");
  var matcher = new RegExp(inputValue, "i");
  return $.grep(data,
  function(value) {
   return matcher.test(value.text);
  });
  }
  $('#' + target).bind("keyup",
  function() {
  _initItems(inputChange());
  });
  $('#' + target).bind("blur",
  function() {
   if(!$('#' + suggestContainerId).is(":focus")){
   $('#' + suggestContainerId).hide();
   if (currentItem) {
   currentItem.trigger("click");
   }
   currentItem = null;
   return;
   }  
  });
  $('#' + target).bind("click",
  function() {
  if (defaulOption.alwaysShowALL) {
   _initItems(data);
  } else {
   _initItems(inputChange());
  }
  $('#' + suggestContainerId).removeAttr("style");
  var tempWidth = defaulOption.fontSize*maxFontNumber + 2 * defaulOption.itemPadding + 30;
  var containerWidth = Math.max(tempWidth, suggestContainerWidth);
  var h = this.scrollHeight;
  $('#' + suggestContainerId).css({
   'border': '1px solid #ccc',
   'max-height': '100px',
   'top': suggestContainerTop,
   'left': suggestContainerLeft,
   'width': containerWidth,
   'position': 'absolute',
   'font-size': defaulOption.fontSize+'px',
   'font-family':'Arial',
   'z-index': 99999,
   'background-color': '#FFFFFF',
   'overflow-y': 'auto',
   'overflow-x': 'hidden',
   'white-space':'nowrap'
  });
  $('#' + suggestContainerId).show();
  });
  _initItems(data);
  $('#' + suggestContainerId).bind("blur",
  function() {
  $('#' + suggestContainerId).hide();
  });
 }
 })(jQuery);

html如下:

<!DOCTYPE html>
 <html lang="zh_cn">
  <head>
  <title>select.suggest</title>
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <!-- Bootstrap -->
  <script src="js/jquery-1.10.2.js"></script>
  <script src="js/jquery.select.js"></script>
  </head>
  <body>
  <h1>Hello, world!</h1>
  <div>
   <div>
   <div>.col-md-1
   </div>
   <div style="">
    <input id="testInput" type="text" />
   </div>
   </div>
  </div>
  <!-- jQuery (necessary for Bootstrap's JavaScript plugins) -->
  <!-- Include all compiled plugins (below), or include individual files as needed -->
  </body>
  <script type="text/javascript">
  var datas =[{"id":"2","text":"中国石油"}, 
  {"id":"4","text":"中国建筑"},
  {"id":"3","text":"中国移动"},
  {"id":"5","text":"中国工商银行"},
  {"id":"7","text":"中国铁建"},
  {"id":"8","text":"上海汽车集团"},
  {"id":"9","text":"中国建设银行"},
  {"id":"10","text":"联想集团"}];
  var itemSelectFuntion = function(){
   alert(this.id + "," + this.innerHTML);
  };
  $.selectSuggest('testInput',datas,itemSelectFuntion);
  </script>
 </html>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
一个用js实现控制台控件的代码
Sep 04 Javascript
javascript window.opener的用法分析
Apr 07 Javascript
兼容IE与firefox火狐的回车事件(js与jquery)
Oct 20 Javascript
JS实现仿Windows7风格的网页右键菜单效果代码
Sep 11 Javascript
js实现div在页面拖动效果
May 04 Javascript
jquery文字填写自动高度的实现方法
Nov 07 Javascript
详解利用jsx写vue组件的方法示例
Jul 17 Javascript
5 种JavaScript编码规范
Jan 30 Javascript
JavaScript 点击触发复制功能实例详解
Nov 02 Javascript
express框架下使用session的方法
Jul 31 Javascript
vue本地打开build后生成的dist文件夹index.html问题
Sep 04 Javascript
Vue鼠标滚轮滚动切换路由效果的实现方法
Aug 04 Vue.js
Angular2-primeNG文件上传模块FileUpload使用详解
Jan 14 #Javascript
Angular2 PrimeNG分页模块学习
Jan 14 #Javascript
bootstrap datetimepicker日期插件使用方法
Jan 13 #Javascript
详解jQuery事件
Jan 13 #Javascript
js实现固定宽高滑动轮播图效果
Jan 13 #Javascript
JavaScript利用闭包实现模块化
Jan 13 #Javascript
Vue.js基础知识小结
Jan 13 #Javascript
You might like
php md5下16位和32位的实现代码
2008/04/09 PHP
php生成带logo二维码方法小结
2016/04/08 PHP
PHP函数rtrim()使用中的怪异现象分析
2017/02/24 PHP
yii框架redis结合php实现秒杀效果(实例代码)
2017/10/26 PHP
php解压缩zip和rar压缩包文件的方法
2019/07/10 PHP
jQuery Clone Bug解决代码
2010/12/22 Javascript
JS批量修改PS中图层名称的方法
2014/01/26 Javascript
JS实现将人民币金额转换为大写的示例代码
2014/02/13 Javascript
详解AngularJS脏检查机制及$timeout的妙用
2017/06/19 Javascript
40行代码把Vue3的响应式集成进React做状态管理
2020/05/20 Javascript
Vue单文件组件开发实现过程详解
2020/07/30 Javascript
基于vue实现简易打地鼠游戏
2020/08/21 Javascript
[06:59]DOTA2-DPC中国联赛3月7日Recap集锦
2021/03/11 DOTA
python实现将pvr格式转换成pvr.ccz的方法
2015/04/28 Python
简单介绍Python中的几种数据类型
2016/01/02 Python
Python编程对列表中字典元素进行排序的方法详解
2017/05/26 Python
浅谈Tensorflow由于版本问题出现的几种错误及解决方法
2018/06/13 Python
python实现向微信用户发送每日一句 python实现微信聊天机器人
2019/03/27 Python
详解爬虫被封的问题
2019/04/23 Python
python异步实现定时任务和周期任务的方法
2019/06/29 Python
详解python中各种文件打开模式
2020/01/19 Python
python实现将range()函数生成的数字存储在一个列表中
2020/04/02 Python
Python3创建Django项目的几种方法(3种)
2020/06/03 Python
澳大利亚领先的睡衣品牌:Peter Alexander
2016/08/16 全球购物
意大利大型购物中心:Oliviero.it
2017/10/19 全球购物
Habitat家居英国官方网站:沙发、家具、照明、厨房和户外
2019/12/12 全球购物
护士自荐信
2013/10/25 职场文书
公关关系专员的自我评价分享
2013/11/20 职场文书
入党思想汇报
2014/01/05 职场文书
食品行业求职人的自我评价
2014/01/19 职场文书
学生自我评价范文
2014/02/02 职场文书
校园文化标语
2014/06/18 职场文书
党性锻炼的心得体会
2014/09/03 职场文书
大学本科生职业生涯规划书范文
2014/09/14 职场文书
只需要100行Python代码就可以实现的贪吃蛇小游戏
2021/05/27 Python
Python实现机器学习算法的分类
2021/06/03 Python