模拟下拉列表 - select

名称:laSelect

功能:模拟浏览器的原生下拉列表功能

原因:解决下拉列表在IE 7 - 下的兼容性问题,并提供更自由的外观以及功能设定。

----------------------------------------------------------------

1. 使用方法:

(1) html 结构:

  创建一个包裹所有内容的盒子,必须要指定一个id,该元素由使用者自己创建:

<div id=‘selectBox‘></div>

(2) 引入:laSelect.js

2. laSelect.js核心方法说明:

核心方法:

 laSelect()

参数说明:

  核心方法实现的所有功能,必须要有一个对象作为参数。

  以下是该参数对象中可接受的属性:

    dom : [必须],取值为包裹盒子元素的id。

    theme : 设置是否有默认的样式,如果使用默认的样式,可以不写。取值为‘none‘时表示不适用默认样式。

    css : 在theme值不为‘none‘时,用于微调默认的样式。

    data : 一个数组,该数组用于存放着生成下拉列表选项的数据。

    fn : 当下拉列表选项被选择后触发的一个由用户自定义的回调功能。

属性详解:

    · theme 

    用于设置是否有默认的样式。

    如果取值为 theme:‘none‘,则表示只生成所需要 的HTML结构,而不具有任何样式,

    所有的样式都是由使用者自己书写。

    · css

     如果theme取值不为‘none‘时,会生成默认的样式。

   css对象可以对默认的样式进行调整。

    css是一个对象,它可以接受以下属性参数:

W: 设置包裹盒子元素的宽度,示例:W:‘180px‘。

H: 设置包裹盒子元素的高度。

bg: 设置下拉列表的背景,示例:bg:‘#fff‘。

fontSize: 设置字体的大小,示例:fontSize:‘13px‘。

color: 设置文字的颜色,示例:color:‘#000‘。

border: 设置包裹盒子元素的边框样式,示例:border:‘1px solid #eee‘。

Uborder: 设置包裹下拉列表选项的边框样式。

borderRadius:设置包裹盒子元素的圆角,示例:borderRadius:‘5px‘。

textIndent:设置文字的首行缩进,示例:textIndent:‘5px‘。

linkcolor: 设置下拉列表选项默认的文字颜色。

hovercolor: 设置hover下的下拉列表选项的文字颜色。

linkbg: 设置下拉列表默认的背景颜色。

hoverbg: 设置hover下的下拉列表选项背景颜色。

    · data

     一个数组。保存着生成下拉列表选项的数据。

    其格式如下:

1 [
2   {‘name‘:‘text1‘,‘id‘,‘idValue1‘},
3   {‘name‘:‘text2‘,‘id‘,‘idValue2‘},
4   ....
5 ]

     * 必须要有name与id,name是下拉列表选项要显示的文本,id是后台所需要 用到的。

    · fn

      当下拉列表选项被选择后,用户可以发送一个自定义的回调功能。

      取值是一个function。

      fn中的方法可以接收以下参数:

      elem : 当前的下拉列表选项:

            —| elem.index 可以获取当前下拉列表的索引值。

      ulElem : 获得包含所有下拉列表选项的ul元素。

      oBoxElement:获得整个下拉列表对象。

      示例:

1 ‘fn‘:function(elem,ulElem,oBoxElement){
2         console.log(elem)
3         console.log(ulElem)
4         console.log(oBoxElement)
5  }

3. 一般的使用示例:

1 laSelect({
2   ‘dom‘:‘selectBox‘
3 });
4 // 生成一个默认的初始下拉列表框
1 laSelect({
2   ‘dom‘:‘selectBox‘,
3   ‘theme‘:‘none‘,
4   ‘data‘ :Data
5 });
6 // 生成一个不带任何样式的下拉列表
1 laSelect({
2   ‘dom‘:‘selectBox‘,
3   ‘css‘:{‘W‘:‘180px‘,‘H‘:‘30px‘,‘bg‘:‘#000‘},
4   ‘data‘:Data,
5   ‘fn‘:function(elem){alert(elem.index)}
6  });
7 //自定义一个下拉列表框,并可传入自定义的事件功能

4. HTML 结构说明

本次模拟原生下拉列表所用到的HTML结构如下表:


id | class


description


customId


用户自定义自创建的包裹盒子ID


customId > UL


包裹盒子内的一个UL列表,用于展示下拉列表数据。根据data属性的值自动创建。


customId > b


包裹盒子内的一个b元素,用于生成下拉的三角形图标


customId > em


包裹盒子内的一个em元素,用于记录最终的选择结果,它的元素内容,是用户选择的下拉列表的内容,它的value属性,则是下拉列表选项的id名称。

6 .实现联动

  思路:通过fn属性为用户选择下拉列表选项后绑定事件回调,该回调利用了当前下拉列表选项的索引值(index 属性) 实现对下一级的select进行重新生成。

示例:

 1 var select1 = function(x,y,z){
 2     var indexs = x.index-1,  //获取当前下拉列表选项的索引
 3         val = ‘‘;          //保存着生成下一级下拉列表的数据。
 4     if(indexs>=0){    //如果用户选择的是"请选择",那么将生成数据值为空。
 5         val = ‘‘;
 6     }else{      //否则获取生成数据
 7         val = subData;
 8     }
 9
10     SubSelect(val) //执行下级下拉列表的生成方法。
11 }
12
13
14 laSelect({
15     ‘dom‘:‘select‘,
16     ‘data‘:data,
17     ‘css‘:{‘H‘:‘20px‘},
18     ‘fn‘:select1
19 });
20
21 function SubSelect(val){
22     laSelect({
23         ‘dom‘:‘select1‘,
24         ‘css‘:{‘H‘:‘25px‘,‘bg‘:‘#eee‘},
25         ‘data‘:val
26     });
27 }
28
29 SubSelect(); //默认生成一条

============================ Code ============================

  1 ;(function(root){
  2
  3     var UlBox = [];
  4     function hideUl(){
  5         for(var i=0;i<UlBox.length;i++){
  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 laSelect(param){
 15
 16         this.oBox = document.getElementById(param.dom);
 17         if(!this.oBox) return false;
 18         this.data = param.data?param.data:[];
 19         this.css = param.css;
 20         this.fn = param.fn;
 21         this.theme = param.theme;
 22         this.UL = document.createElement(‘UL‘);
 23         this.EM = document.createElement(‘EM‘);
 24         this.Tr = document.createElement(‘B‘);
 25         this.initStyle = {‘W‘:‘198px‘,‘H‘:‘17px‘,‘bg‘:‘white‘,‘fontSize‘:‘13px‘,‘border‘:‘1px solid #aaaaaa‘,‘Uborder‘:‘1px solid #7a9cd3‘,‘borderRadius‘:‘2px‘,‘color‘:‘#000‘,‘textIndent‘:‘5px‘,‘linkcolor‘:‘#000‘,‘hovercolor‘:‘#fff‘,‘linkbg‘:‘none‘,‘hoverbg‘:‘#1e90ff‘};
 26
 27         for(var i in this.css){
 28             if(this.css[i] != this.initStyle[i]) this.initStyle[i] = this.css[i];
 29         }
 30
 31         this.init();
 32         if(this.theme!="none"){
 33             this.setStyle();
 34         }
 35         this.core();
 36
 37     }
 38
 39     laSelect.prototype.createStyle=function(obj,css){
 40         for(var i in css){
 41             obj.style[i]=css[i];
 42         }
 43     };
 44
 45     laSelect.prototype.init=function(){
 46
 47         var a = [];
 48         this.oBox.innerHTML="";
 49         a.push(‘<li value="undefined">请选择</li>‘);
 50
 51         for(var i = 0;i<this.data.length;i++){
 52             a.push(‘<li value="‘+ this.data[i].id +‘">‘+ this.data[i].name + ‘</li>‘);
 53         }
 54         this.UL.innerHTML = a.join(‘‘);
 55         this.EM.innerHTML = "请选择";
 56         this.EM.setAttribute(‘value‘,‘undefined‘);
 57         this.oBox.appendChild(this.EM);
 58         this.oBox.appendChild(this.UL);
 59         UlBox.push(this.UL);
 60         this.oLi = this.UL.getElementsByTagName(‘li‘);
 61         this.oBox.appendChild(this.Tr);
 62
 63     };
 64
 65     laSelect.prototype.setStyle=function(){
 66
 67         this.oBox.style.cssText = "position:relative;height:"+ this.initStyle.H +";line-height:"+ this.initStyle.H +";width:"+ this.initStyle.W +";color:"+ this.initStyle.color +";background:"+ this.initStyle.bg +";font-size:"+ this.initStyle.fontSize +";border:"+ this.initStyle.border +";border-radius:"+this.initStyle.borderRadius;
 68
 69         this.UL.style.cssText = "position:absolute;width:"+ this.initStyle.W +";left:-1px;top:"+( parseInt(this.initStyle.H)+1)+"px;display:none;border:"+this.initStyle.Uborder +";border-radius:"+ this.initStyle.borderRadius +";background:"+this.initStyle.bg;
 70
 71         this.EM.style.cssText = "position:absolute;width:"+ this.initStyle.W + ";height:" + this.initStyle.H +";line-height:"+ this.initStyle.H +";text-indent:"+ this.initStyle.textIndent + ";cursor:pointer;font-style:normal;font-size:"+this.initStyle.fontSize;
 72
 73         this.Tr.style.cssText = "position:absolute;width:0px;height:0px;border-width:5px;border-style:solid;border-color:transparent;_border-color:"+ this.initStyle.bg +";border-top-width:8px;border-top-color:#000;line-height:0px;overflow:hidden;right:6px;top:50%;margin-top:-4px;cursor:pointer";
 74
 75         for(var i=0;i<this.oLi.length;i++){
 76             this.createStyle(this.oLi[i],{‘lineHeight‘:this.initStyle.H,‘textIndent‘:this.initStyle.textIndent,‘cursor‘:‘pointer‘,‘fontSize‘:this.initStyle.fontSize});
 77         }
 78
 79     };
 80
 81     laSelect.prototype.core=function(){
 82
 83         var _this = this,
 84             ulElement = this.UL,
 85             liElement = this.oLi,
 86             oBoxElement = this.oBox;
 87         this.UL.flag = true;
 88
 89         function hide(__this){
 90             _this.UL.style.display="none";
 91             _this.EM.innerHTML = __this.innerHTML;
 92             _this.EM.setAttribute(‘value‘,__this.getAttribute(‘value‘));
 93             _this.UL.flag=true;
 94             if(_this.fn && typeof(_this.fn)==‘function‘) _this.fn(__this,liElement,ulElement,oBoxElement);
 95         }
 96
 97         function HADIS(event){
 98
 99             return function(event){
100                 var event = event || window.event;
101                 if(_this.UL.flag){
102                     _this.UL.style.display="block";
103                     _this.UL.flag=false;
104                 }else{
105                     _this.UL.style.display="none";
106                     _this.UL.flag=true;
107                 }
108
109                 for(var i=0;i<UlBox.length;i++){
110                     if(_this.UL != UlBox[i]){
111                         UlBox[i].style.display="none";
112                         UlBox[i].flag = true;
113                     }
114                 }
115
116                 if(document.addEventListener){
117                     event.stopPropagation();
118                     event.preventDefault();
119                 }else{
120                     event.cancelBubble = true;
121                     event.returnValue = false;
122                 }
123             }
124
125         }
126
127         for(var i=0;i<this.oLi.length;i++){
128             this.oLi[i].index = i;
129             this.oLi[i].onmouseover=function(){
130                 _this.createStyle(this,{‘background‘:_this.initStyle.hoverbg,‘color‘:_this.initStyle.hovercolor});
131             };
132             this.oLi[i].onmouseout=function(){
133                 _this.createStyle(this,{‘background‘:_this.initStyle.linkbg,‘color‘:_this.initStyle.linkcolor});
134             };
135             this.oLi[i].onclick=function(){
136                 hide(this);
137             };
138             this.oLi[i].oncontextmenu=function(event){
139                 var event = event || window.event,
140                     oTarget = event.srcElement ? event.srcElement : event.target;
141                     hide(this);
142                     return false;
143             };
144         }
145
146         this.EM.onclick=HADIS(event);
147         this.Tr.onclick=HADIS(event);
148     };
149
150     root.laSelect=function(p){
151         new laSelect(p);
152     }
153
154 })(window)
时间: 2024-10-01 03:15:31

模拟下拉列表 - select的相关文章

模拟下拉列表select

<!doctype html> <html> <head> <meta charset="utf-8"> <title>模拟下拉菜单</title> <style> * { margin: 0; padding: 0; } body { font: 14px '微软雅黑'; color: #555; padding:50px; } ul { list-style: none; } p { margin-

JS-005-JavaScript 操作常见 web 元素之五-常见下拉列表 Select 和 datalist

下拉列表在我们日常的网页浏览的过程中,随处可见,是 web 编程过程中大家非常熟悉的一个页面元素,随着 HTML 语言的日益强大,其在广大攻城狮的手中可谓是千变万化,有了很多不同的实现方式.本文主要以常规的 Select 下拉列表来讲述 js 对下拉列表的常规操作,其中 datalist 算是此文稍许的延伸,也可看做一种简单的下拉列表,遗憾的是 IE 9 和更早版本的 IE 浏览器 以及 Safari 不支持 datalist 标签,其主要应用于输入或搜索文字的自动完成功能等,感兴趣的亲们可以详

下拉列表Select的操作

<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><title>对下拉列表select的基本操作</title><script src="jquery-1.8.2.min.js"></script></head> <body><select nam

【JavaScript】下拉列表select中在value传递多个值,取出其option显示值,并应用此作为导航

对于下拉列表select,众所周知,其值就是选中的option中的value值,可是如果需要取出每一个option的显示值,那又如何做呢?虽然没什么必要取出option的显示值,但是如果有时候确实需要这个显示值,在javascript的脚本做点什么呢?另外,如果要再value处传递多个值呢?那又改如何呢? 一.取出option的显示值 你可以先传递整个select过去脚本,假设传过去的形式参数是obj,然后利用obj.options[obj.selectedIndex].innerHTML来取出

js获取下拉列表(select)选中项的值和文本

获取下拉列表选中项的值和文本(select) <html> <head> <meta charset="utf-8"/> <title>获取下拉列表选中项的值和文本(select)</title> </head> <body> <select id="myselect"> <option value="fist">1</option&

用纯css改变下拉列表select框的默认样式(转)

用纯css改变下拉列表select框的默认样式 分享到 分类 JS学习   关键字 前端   发布 kris  2015-04-01 注意 转载须保留原文链接,译文链接,作者译者等信息. 在这篇文章里,我将介绍如何不依赖JavaScript用纯css来改变下拉列表框的样式. 问题的提出 事情是这样的,您的设计师团队向您发送一个新的PSD(Photoshop文档),它是一个新的网站的最终设计. 一切看起来很好,很正常,直到你看到他/她设计的一个选择下拉框跟浏览器默认提供的样式有些不同!你说:“这没

自己动手模拟百分百&lt;select&gt;下拉列表

浏览器默认的下拉确实不好用啊,主要是样式不好修改和统一. (一)下手之前先理清一下<select>的流程: 1.结构:<select> <option value="">show</option> </select> 2.事件:点击<select>-选择<option>-显示option的innerHTML-表单value改变-onchange被触发 (二)接着写出dom结构并设计一个样式: 1.dom

移动端-模拟下拉列表

在移动端使用原生的下拉列表(select)会有自带的样式,想要做到自定义样式怎么办呢? 首先第一步会去掉默认样式:-webkit-appearance:none;这些对input下的各类型属性,如:type="date",会去掉默认样式,但是这时候对select设置的边框,宽度或者是文字居中显示等等样式都不起作用.这时候就需要模拟select框了.因为select在移动端上会用到手机默认的弹框,所以还是要用到select标签. 最终效果如图: html结构如下: 1 <div c

jquery之下拉列表select

选择下拉列表中的一项,文本框显示其值 html代码如下: <select id="ttt"> <option value="Volvo" id="op1">Volvo</option> <option value="Saab">Saab</option> <option value="Opel">Opel</option>