6.0 给系统下拉框增加搜索功能

把插件放到:\app\system\include\public\searchableSelect文件下


引用三个文件:

<script src="{$_M['url']['pub']}searchableSelect/jquery-1.11.1.min.js"></script>
<script src="{$_M['url']['pub']}searchableSelect/jquery.searchableSelect.js"></script>

<link rel="stylesheet" href="{$_M['url']['pub']}searchableSelect/jquery.searchableSelect.css">



jquery.searchableSelect.css

/*
Author: David Qin
E-mail: [email protected]
Date: 2014-11-05
*/

.searchable-select-hide {
  display: none;
}

.searchable-select {
  display: inline-block;
  min-width: 200px;
  font-size: 14px;
  line-height: 1.428571429;
  color: #555;
  vertical-align: middle;
  position: relative;
  outline: none;
	z-index: 9999;
}

.searchable-select-holder{
  padding: 6px;
  background-color: #fff;
  background-image: none;
  border: 1px solid #ccc;
  border-radius: 4px;
  min-height: 30px;
  box-sizing: border-box;
  -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,0.075);
  box-shadow: inset 0 1px 1px rgba(0,0,0,0.075);
  -webkit-transition: border-color ease-in-out .15s,box-shadow ease-in-out .15s;
  transition: border-color ease-in-out .15s,box-shadow ease-in-out .15s;
}

.searchable-select-caret {
  position: absolute;
  width: 0;
  height: 0;
  box-sizing: border-box;
  border-color: black transparent transparent transparent;
  top: 0;
  bottom: 0;
  border-style: solid;
  border-width: 5px;
  margin: auto;
  right: 10px;
}

.searchable-select-dropdown {
  position: absolute;
  background-color: #fff;
  border: 1px solid #ccc;
  border-bottom-left-radius: 4px;
  border-bottom-right-radius: 4px;
  padding: 4px;
  border-top: none;
  top: 28px;
  left: 0;
  right: 0;
}

.searchable-select-input {
  margin-top: 5px;
  border: 1px solid #ccc;
  outline: none;
  padding: 4px;
  width: 100%;
  box-sizing: border-box;
  width: 100%;
}

.searchable-scroll {
  margin-top: 4px;
  position: relative;
}

.searchable-scroll.has-privious {
  padding-top: 16px;
}

.searchable-scroll.has-next {
  padding-bottom: 16px;
}

.searchable-has-privious {
  top: 0;
}

.searchable-has-next {
  bottom: 0;
}

.searchable-has-privious, .searchable-has-next {
  height: 16px;
  left: 0;
  right: 0;
  position: absolute;
  text-align: center;
  z-index: 10;
  background-color: white;
  line-height: 8px;
  cursor: pointer;
}

.searchable-select-items {
  max-height: 400px;
  overflow-y: scroll;
  position: relative;
}

.searchable-select-items::-webkit-scrollbar {
  display: none;
}

.searchable-select-item {
  padding: 5px 5px;
  cursor: pointer;
  min-height: 30px;
  box-sizing: border-box;
    transition: all 1s ease 0s;
}

.searchable-select-item.hover {

  background: #555;
  color: white;
}

.searchable-select-item.selected {
  background: #28a4c9;
  color: white;
}

jquery-1.11.1.min.js(可以引用其它的)


jquery.searchableSelect.js

// Author: David Qin
// E-mail: [email protected]
// Date: 2014-11-05
function getUrlParam(name)
{
var reg = new RegExp("(^|&)"+ name +"=([^&]*)(&|$)"); //构造一个含有目标参数的正则表达式对象
var r = window.location.search.substr(1).match(reg);  //匹配目标参数
if (r!=null) return unescape(r[2]); return null; //返回参数值
} 

(function($){

  // a case insensitive jQuery :contains selector
  $.expr[":"].searchableSelectContains = $.expr.createPseudo(function(arg) {
    return function( elem ) {
      return $(elem).text().toUpperCase().indexOf(arg.toUpperCase()) >= 0;
    };
  });

  $.searchableSelect = function(element, options) {
    this.element = element;
    this.options = options || {};
    this.init();

    var _this = this;

    this.searchableElement.click(function(event){
      // event.stopPropagation();
      _this.show();
    }).on('keydown', function(event){
      if (event.which === 13 || event.which === 40 || event.which == 38){
        event.preventDefault();
        _this.show();
      }
    });

    $(document).on('click', null, function(event){
      if(_this.searchableElement.has($(event.target)).length === 0)
        _this.hide();
    });

    this.input.on('keydown', function(event){
      event.stopPropagation();
      if(event.which === 13){         //enter
        event.preventDefault();
        _this.selectCurrentHoverItem();
        _this.hide();
      } else if (event.which == 27) { //ese
        _this.hide();
      } else if (event.which == 40) { //down
        _this.hoverNextItem();
      } else if (event.which == 38) { //up
        _this.hoverPreviousItem();
      }
    }).on('keyup', function(event){
      if(event.which != 13 && event.which != 27 && event.which != 38 && event.which != 40)
        _this.filter();
    })
  }

  var $sS = $.searchableSelect;

  $sS.fn = $sS.prototype = {
    version: '0.0.1'
  };

  $sS.fn.extend = $sS.extend = $.extend;

  $sS.fn.extend({
    init: function(){
      var _this = this;
      this.element.hide();

      this.searchableElement = $('<div tabindex="0" class="searchable-select"></div>');
      this.holder = $('<div class="searchable-select-holder" id="searchableid"></div>');
      this.dropdown = $('<div class="searchable-select-dropdown searchable-select-hide"></div>');
      this.input = $('<input type="text" class="searchable-select-input" />');
      this.items = $('<div class="searchable-select-items"></div>');
      this.caret = $('<span class="searchable-select-caret"></span>');

      this.scrollPart = $('<div class="searchable-scroll"></div>');
      this.hasPrivious = $('<div class="searchable-has-privious">...</div>');
      this.hasNext = $('<div class="searchable-has-next">...</div>');

      this.hasNext.on('mouseenter', function(){
        _this.hasNextTimer = null;

        var f = function(){
          var scrollTop = _this.items.scrollTop();
          _this.items.scrollTop(scrollTop + 20);
          _this.hasNextTimer = setTimeout(f, 50);
        }

        f();
      }).on('mouseleave', function(event) {
        clearTimeout(_this.hasNextTimer);
      });

      this.hasPrivious.on('mouseenter', function(){
        _this.hasPriviousTimer = null;

        var f = function(){
          var scrollTop = _this.items.scrollTop();
          _this.items.scrollTop(scrollTop - 20);
          _this.hasPriviousTimer = setTimeout(f, 50);
        }

        f();
      }).on('mouseleave', function(event) {
        clearTimeout(_this.hasPriviousTimer);
      });

      this.dropdown.append(this.input);
      this.dropdown.append(this.scrollPart);

      this.scrollPart.append(this.hasPrivious);
      this.scrollPart.append(this.items);
      this.scrollPart.append(this.hasNext);

      this.searchableElement.append(this.caret);
      this.searchableElement.append(this.holder);
      this.searchableElement.append(this.dropdown);
      this.element.after(this.searchableElement);

      this.buildItems();
      this.setPriviousAndNextVisibility();
    },

    filter: function(){
      var text = this.input.val();
      this.items.find('.searchable-select-item').addClass('searchable-select-hide');
      this.items.find('.searchable-select-item:searchableSelectContains('+text+')').removeClass('searchable-select-hide');
      if(this.currentSelectedItem.hasClass('searchable-select-hide') && this.items.find('.searchable-select-item:not(.searchable-select-hide)').length > 0){
        this.hoverFirstNotHideItem();
      }

      this.setPriviousAndNextVisibility();
    },

    hoverFirstNotHideItem: function(){
      this.hoverItem(this.items.find('.searchable-select-item:not(.searchable-select-hide)').first());
    },

    selectCurrentHoverItem: function(){
      if(!this.currentHoverItem.hasClass('searchable-select-hide'))
        this.selectItem(this.currentHoverItem);
    },

    hoverPreviousItem: function(){
      if(!this.hasCurrentHoverItem())
        this.hoverFirstNotHideItem();
      else{
        var prevItem = this.currentHoverItem.prevAll('.searchable-select-item:not(.searchable-select-hide):first')
        if(prevItem.length > 0)
          this.hoverItem(prevItem);
      }
    },

    hoverNextItem: function(){
      if(!this.hasCurrentHoverItem())
        this.hoverFirstNotHideItem();
      else{
        var nextItem = this.currentHoverItem.nextAll('.searchable-select-item:not(.searchable-select-hide):first')
        if(nextItem.length > 0)
          this.hoverItem(nextItem);
      }
    },

    buildItems: function(){
      var _this = this;
      this.element.find('option').each(function(){
        var item = $('<div class="searchable-select-item" data-value="'+$(this).attr('value')+'">'+$(this).text()+'</div>');

        if(this.selected){
          _this.selectItem(item);
          _this.hoverItem(item);
        }

        item.on('mouseenter', function(){
          $(this).addClass('hover');
        }).on('mouseleave', function(){
          $(this).removeClass('hover');
        }).click(function(event){
          event.stopPropagation();
          _this.selectItem($(this));
          _this.hide();
        });

        _this.items.append(item);
      });

      this.items.on('scroll', function(){
        _this.setPriviousAndNextVisibility();
      })
    },
    show: function(){
      this.dropdown.removeClass('searchable-select-hide');
      this.input.focus();
      this.status = 'show';
      this.setPriviousAndNextVisibility();
    },

    hide: function(){
      if(!(this.status === 'show'))
        return;

      if(this.items.find(':not(.searchable-select-hide)').length === 0)
          this.input.val('');
      this.dropdown.addClass('searchable-select-hide');
      this.searchableElement.trigger('focus');
      this.status = 'hide';
			//alert("返回"); 
      //this.currentSelectedItem = item;;
			 //self.location='c1.htm?id=11';
    },

    hasCurrentSelectedItem: function(){
      return this.currentSelectedItem && this.currentSelectedItem.length > 0;
    },

    selectItem: function(item){
      if(this.hasCurrentSelectedItem())
        this.currentSelectedItem.removeClass('selected');

      this.currentSelectedItem = item;
      item.addClass('selected');

      this.hoverItem(item);

      this.holder.text(item.text());
      var value = item.data('value');
      this.holder.data('value', value);
      this.element.val(value);
			
			//下拉框
			//var url = window.location.href;
			    //url=$.trim(url);
					url="/admin/index.php?lang=cn&anyid=44&n=examination&c=examination&a="+getUrlParam("a");
			//试卷推送
			var starttime=$("#starttime").val();
			if(starttime){
				 starttime='&starttime='+starttime;
			}else{
				 starttime='';
			}
			var endtime=$("#endtime").val();
			if(endtime){
				 endtime='&endtime='+endtime;
			}else{
				 endtime='';
			}
			var number=$("#number").val();
			if(number){
				 number=$.trim(number);
				 number='&number='+number;
			}else{
				 number='';
			}
			var teachers_id=$("#teachers_id").val();
			if(teachers_id){
				  teachers_id=$.trim(teachers_id);
          teachers_id='&teachers_id='+teachers_id;
			}else{
				 teachers_id='';
			}
			var search_title=$("#search_title").val();
			if(search_title){
				  search_title=$.trim(search_title);
          search_title='&search_title='+search_title;
			}else{
				  search_title='';
			}
			if(item.text()){
				  title1=item.text();
				  title11=$.trim(title1);
					teachers_title='&teachers_title='+title11;
			}else{
				  teachers_title='';
			}
			//推送记录
			var eid=$("#eid").val();
			if(eid){
				 eid=$.trim(eid);
				 eid='&eid='+eid;
			}else{
				  eid='';
			}
			var uid=$("#uid").val();
			if(uid){
				 uid=$.trim(uid);
				 uid='&uid='+uid;
			}else{
				 uid='';
			}
			if(item.data('value')){
			    //self.location=url+starttime+endtime+number;
				  self.location=url+starttime+endtime+number+teachers_id+search_title+teachers_title+eid+uid;
				  //self.location='/admin/index.php?lang=cn&anyid=44&n=examination&c=examination&a=do_user_test&teachers_id='+teachers_id+'&starttime='+starttime+'&endtime='+endtime+'&number='+number+'&search_title='+search_title+'&teachers_title='+item.text();
			}
			
      if(this.options.afterSelectItem){
        this.options.afterSelectItem.apply(this);
				
      }
    },

    hasCurrentHoverItem: function(){
      return this.currentHoverItem && this.currentHoverItem.length > 0;
    },

    hoverItem: function(item){
      if(this.hasCurrentHoverItem())
        this.currentHoverItem.removeClass('hover');

      if(item.outerHeight() + item.position().top > this.items.height())
        this.items.scrollTop(this.items.scrollTop() + item.outerHeight() + item.position().top - this.items.height());
      else if(item.position().top < 0)
        this.items.scrollTop(this.items.scrollTop() + item.position().top);

      this.currentHoverItem = item;
      item.addClass('hover');
    },

    setPriviousAndNextVisibility: function(){
      if(this.items.scrollTop() === 0){
        this.hasPrivious.addClass('searchable-select-hide');
        this.scrollPart.removeClass('has-privious');
				//self.location='a.htm'; 
      } else {
        this.hasPrivious.removeClass('searchable-select-hide');
        this.scrollPart.addClass('has-privious');
				//self.location='b.htm'; 
      }

      if(this.items.scrollTop() + this.items.innerHeight() >= this.items[0].scrollHeight){
        this.hasNext.addClass('searchable-select-hide');
        this.scrollPart.removeClass('has-next');
				//self.location='c1.htm'; 
      } else {
        this.hasNext.removeClass('searchable-select-hide');
        this.scrollPart.addClass('has-next');
				//self.location='c2.htm'; 
      }
    }
  });

  $.fn.searchableSelect = function(options){
    this.each(function(){
      var sS = new $sS($(this), options);
			
    });

    return this;
  };

})(jQuery);

重点:

     this.holder.text(item.text());
      var value = item.data('value');
      this.holder.data('value', value);
      this.element.val(value);

//下拉框
//var url = window.location.href;
   //url=$.trim(url);
url="/admin/index.php?lang=cn&anyid=44&n=examination&c=examination&a="+getUrlParam("a");
//试卷推送
var starttime=$("#starttime").val();
if(starttime){
starttime='&starttime='+starttime;
}else{
starttime='';
}
var endtime=$("#endtime").val();
if(endtime){
endtime='&endtime='+endtime;
}else{
endtime='';
}
var number=$("#number").val();
if(number){
number=$.trim(number);
number='&number='+number;
}else{
number='';
}
var teachers_id=$("#teachers_id").val();
if(teachers_id){
 teachers_id=$.trim(teachers_id);
          teachers_id='&teachers_id='+teachers_id;
}else{
teachers_id='';
}
var search_title=$("#search_title").val();
if(search_title){
 search_title=$.trim(search_title);
          search_title='&search_title='+search_title;
}else{
 search_title='';
}
if(item.text()){
 title1=item.text();
 title11=$.trim(title1);
teachers_title='&teachers_title='+title11;
}else{
 teachers_title='';
}
//推送记录
var eid=$("#eid").val();
if(eid){
eid=$.trim(eid);
eid='&eid='+eid;
}else{
 eid='';
}
var uid=$("#uid").val();
if(uid){
uid=$.trim(uid);
uid='&uid='+uid;
}else{
uid='';
}
if(item.data('value')){
   //self.location=url+starttime+endtime+number;
 self.location=url+starttime+endtime+number+teachers_id+search_title+teachers_title+eid+uid;
 //self.location='/admin/index.php?lang=cn&anyid=44&n=examination&c=examination&a=do_user_test&teachers_id='+teachers_id+'&starttime='+starttime+'&endtime='+endtime+'&number='+number+'&search_title='+search_title+'&teachers_title='+item.text();
}


系统模板上代码:

								<select name="teachers_id" id="teachers_id" data-table-search="1" data-checked="{$teachersid}">
									<option value="">选择讲师的学生</option>
<!--
EOT;
if($admin_group==9){//9老师
 $wh=" where id='$teachersid'";
}
$t_list=DB::get_all("SELECT id,title,user_id FROM ".$_M['table']['my_teacher']." $wh ORDER BY id DESC");//取出标题
foreach($t_list as $key=>$valt){
echo <<<EOT
-->
									<option value="{$valt['id']}">{$valt['title']}</option>
<!--
EOT;
}
echo <<<EOT
-->
								</select>


    <script>
		$(function(){
			$('#teachers_id').searchableSelect();
		});
    </script>


猜你喜欢

转载自blog.csdn.net/haibo0668/article/details/80519847