下拉列表自己封装的

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

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 });

时间: 2024-12-16 14:11:25

下拉列表自己封装的的相关文章

.Net Core应用框架Util介绍(五)

上篇简要介绍了Util在Angular Ts方面的封装情况,本文介绍Angular封装的另一个部分,即Html的封装. 标准组件与业务组件 对于管理后台这样的表单系统,你通常会使用Angular Material或Ng-Zorro这样的UI组件库,它们提供了标准化的UI组件. 标准组件将Ts封装起来,以特定标签和属性的方式提供使用. 业务组件使用标准组件拼凑页面,并从服务端API获取数据绑定到页面上. 可以看出,标准组件是业务开发的基础,我们必须将标准组件的开发效率提升到极致. 使用标准组件的问

原生js封装二级城市下拉列表

闲的蛋疼,封装了个二级城市下拉 先保证html里有 <select id="province" size=1 > </select> <select id="city" style="width:60px"> </select> <input type="hidden" id="pro_city" /> 然后引用js  最终通过new Select

封装NPOI导出含下拉列表的Excel

1 /// <summary> 2 /// 绑定数据的方法 3 /// </summary> 4 /// <param name="ssfworkbook">HSSFWorkbook</param> 5 /// <param name="sheet1">HSSFSheet</param> 6 /// <param name="cateDt">数据源</par

自己封装一个下拉列表

// html: <header> <oSelect @changeOption="onChangeOption" :selectData="selectData"></oSelect> </header> data(){ selectData: { defaultIndex: 0,//默认选中是第几个 selectStatus: false,//通过这个来控制下拉框的显示和隐藏 selectOptions: []//

视频编码与封装方式详解

http://blog.csdn.net/attilax/article/details/5807047 1.    编码方式和封装格式    1 2.    视频编码标准两大系统    2 MPEG-1. 2 MPEG-2. 3 MPEG-3. 3 MPEG-4. 3 ITU-T. 4 WMV.. 4 3.    常用视频编码方式有Xvid( 4 4.    常见存储封装格式    6 5.    几种常见的转换格式设置    7 6.    无损视频编码    9 1.   编码方式和封装格

基于Metronic的Bootstrap开发框架经验总结(3)--下拉列表Select2插件的使用

在上篇<基于Metronic的Bootstrap开发框架经验总结(2)--列表分页处理和插件JSTree的使用>介绍了数据的分页处理,使用了Bootstrap Paginator插件,另外对树形列表,采用了JSTree插件,本篇继续介绍在编辑页面中常用到的控件Select2,这个控件可以更加丰富传统的Select下拉列表控件,提供更多的功能和更好的用户体验. 1.Select2控件介绍 这个插件是基于Select的扩展插件,能够提供更加丰富的功能和用户体验,它的github官网地址为:http

JS学习之DOM节点的关系属性封装、克隆节点、Dom中Style常用的一些属性等小结

JS DOM节点: 在JS DOM中节点的关系被定义为节点的属性: 通常有以下几种节点之间的关系: (这里的关系是所有浏览器都支持的) parentNode    父节点 childNodes    子节点 firstChild    父节点里的第一个子节点 lastChild     父节点里的最后一个子节点 nextSibling    与子节点并列的下一个兄弟节点 previousSibling   与子节点并列的上一个兄弟节点 火狐与谷歌支持而ie8不支持的节点关系有: previous

运用.NIT将数据存入数据库、读取数据库(运用封装)陈老师作业

我基础不好,根据所学的知识,书本的例题修改的,也不知道我理解的是否符合老师要求 运用C#将数据存入数据库.并且可以读取数据库里的数据,此项目我运用了封装.我运用了一个窗体将数据存读数据. 我首先创建了一个数据库,库名“数学题库” ,然后创建了一个表“tiku1”, 添加一个类Class1 class Class1    {        public string strCon = @"Data Source=.;Initial Catalog=数学题库;Integrated security=

MVC 下拉列表三级联动

当前所做的项目,关于数据库设计的时候有点小意思,表A是三个联合主键,key1,key2,key3,表B是四个联合主键 key1,key2,key3,key4,其中表B的联合外键关联表A对应的联合主键,这样一来,对表B做新增的时候 就需要几个小步骤: ①:界面初始化,返回全部不重复的 key1.key2.key3 ②:界面勾选key1,触发chang事件,采用getJson 方式将参数key1的值发送到Action中 ,同时设置下拉列表b 的内容为空,$("#b").html('');