自己封装的一个模拟下拉列表的插件

simSelect”下拉列表

简述:

通过使用simSelect可以实现由传统HTML模拟类似于原生select标签的功能。

主要是解决select标签样式在不同浏览器中的兼容性问题。

通过模拟,使用者便可以完全自定义下拉列表的样式。

该工具主要有以下几种功能:

  • 结合表单提交,使用者可以自定义表单控件的name值。
  • 可以适用于多级联动的情况。
  • 支持带参数的回调功能。

结构:

  通过使用simSelect,可以在指定的dom对象内生成一个模拟的结构,这个模拟的HTML结构详细内容如下:

  dom

    |- em       -> 用于显示使用者选中的结果。

    |- span         -> 下来列表的三角形箭头。

    |- input:hidden     -> 结合表单提交的表单控件。

    |-ul           -> 用于展示生成的下拉列表选项。

      |- li         -> 每一个下来列表选项。

具体代码:

  1 ;(function(root){
  2 
  3     var UlBox = [];   // 定义一个堆栈,压入所有的UL。
  4     function hideUl(){    //对着整个文档单击或右击时的处理函数。
  5         for(var i=0;i<UlBox.length;i++){   //循环所有的UL,来进行关闭
  6             UlBox[i].style.display="none";
  7             UlBox[i].flag = true;
  8         }
  9     }
 10 
 11     document.onclick=hideUl;
 12     document.oncontextmenu=hideUl;
 13 
 14     function simSelect(param){
 15 
 16         this.oBox = param.dom || null;
 17         this.data = (param.data)?param.data:[];
 18         this.fn = param.fn || null;
 19         this.name = param.name || '';
 20         this.config = [];
 21         this.oBox && this.init();
 22         this.oBox && this.core();
 23 
 24     }
 25 
 26     simSelect.prototype.init=function(){
 27 
 28         var a = [];
 29 
 30         this.ul = document.createElement('ul');
 31         this.cnt = document.createElement('em');
 32         this.mark = document.createElement('span');    
 33         this.inp = document.createElement('input');
 34         this.inp.type="hidden";
 35         this.inp.name = this.name;
 36 
 37         this.oBox.innerHTML="";
 38 
 39         
 40         a.push('<li>请选择</li>');
 41 
 42         if(this.data && this.data.length){
 43             for(var i in this.data){
 44                 for(var j in this.data[i]){
 45                     this.config.push(j);
 46                 }
 47                 break;
 48             }
 49 
 50 
 51             for(var i = 0,l = (this.data && this.data.length)?this.data.length : 0;i<l;i++){
 52                 a.push('<li value="'+ this.data[i][this.config[1]] +'">'+ this.data[i][this.config[0]] + '</li>');
 53             }
 54 
 55         }
 56 
 57         this.ul.innerHTML = a.join('');
 58         this.ul.style.display = 'none';
 59         this.cnt.innerHTML = "请选择";
 60         this.mark.innerHTML = '▼'
 61 
 62 
 63         this.oBox.appendChild(this.cnt);
 64         this.oBox.appendChild(this.mark);
 65         this.oBox.appendChild(this.inp);
 66         this.oBox.appendChild(this.ul);
 67 
 68         UlBox.push(this.ul);
 69         this.oLi = this.ul.getElementsByTagName('li');
 70  
 71     };
 72 
 73 
 74     simSelect.prototype.core=function(){
 75 
 76         var _this = this;
 77 
 78         this.ul.flag = true;
 79         function hide(__this){    //单击下拉列表选项时候的处理函数。
 80             _this.ul.style.display="none";
 81             _this.cnt.innerHTML = __this.innerHTML;
 82             _this.inp.value = __this.getAttribute(_this.config[1]) ||  null;
 83             _this.ul.flag=true;
 84             _this.fn &&  _this.fn(_this.inp.value,__this,_this.oLi,_this.ul,_this.oBox);
 85         }
 86 
 87         function hideAndShow(){    //单击内容框或者三角形按钮时候的处理函数。
 88             
 89             return function(event){
 90                 var event = event || window.event;
 91                 if(_this.ul.flag){
 92                     _this.ul.style.display="block";
 93                     _this.ul.flag=false;
 94                 }else{
 95                     _this.ul.style.display="none";
 96                     _this.ul.flag=true;
 97                 }
 98 
 99                 for(var i=0;i<UlBox.length;i++){
100                     if(_this.ul != UlBox[i]){
101                         UlBox[i].style.display="none";
102                         UlBox[i].flag = true;
103                     }
104                 }
105 
106                 if(document.addEventListener){
107                     event.stopPropagation();
108                     event.preventDefault();
109                 }else{
110                     event.cancelBubble = true;
111                     event.returnValue = false;
112                 }
113             }
114 
115         }
116 
117         for(var i=0;i<this.oLi.length;i++){
118 
119             this.oLi[i].index = i;
120             this.oLi[i].onclick=function(){
121                 hide(this);
122             };
123             this.oLi[i].onmouseover=function(){
124                 this.className = 'hover';
125             };
126             this.oLi[i].onmouseout=function(){
127                 this.className = '';
128             };
129             this.oLi[i].oncontextmenu=function(event){
130                 var event = event || window.event,
131                     oTarget = event.srcElement ? event.srcElement : event.target;
132                     hide(this);
133                     return false;
134             };
135 
136         }
137         this.cnt.onclick=hideAndShow();
138         this.mark.onclick=hideAndShow();
139     };
140 
141     root.simSelect=function(p){
142         new simSelect(p);
143     };
144 
145 })(window)

调用方式如下:

 1 simSelect({
 2     'dom':document.getElementById('select'),
 3     'data':data,
 4     'name':'dq'
 5 });
 6 /*
 7     |-- dom [object]        :指定生成下拉列表组件的dom对象。
 8     |-- name[string]            :设置表单控件的name属性值。
 9     |-- data [object]        :生成下拉列表选项的数据。
10     |-- fn[function]        :选择下来列表后的回调函数。
11 */

示例:联动生成:

 1 var data =[
 2     {'key':'安徽','value':'ah'},
 3     {'key':'浙江','value':'zj'},
 4     {'key':'江苏','value':'js'}
 5 ];    
 6 var data2 =[
 7     {'name':'六安','value':'la'},
 8     {'name':'合肥','value':'hf'},
 9     {'name':'安庆','value':'aq'}
10 ];
11 simSelect({
12     'dom':document.getElementById('select'),
13     'data':data,
14     'name':'dq',
15     'fn':function(a){
16         if(a == 'ah'){
17             simSelect({
18                 'dom':document.getElementById('select1'),
19                 'data':data2,
20                 'name':'sx',
21                 'fn':function(b){
22                     alert(b);
23                 }
24             });
25         }
26     }
27 });
原文地址:https://www.cnblogs.com/HCJJ/p/5632920.html