自己动手模拟百分百<select>下拉列表
浏览器默认的下拉确实不好用啊,主要是样式不好修改和统一。
(一)下手之前先理清一下<select>的流程:
1.结构:<select>
<option value="">show</option>
</select>
2.事件:点击<select>-选择<option>-显示option的innerHTML-表单value改变-onchange被触发
(二)接着写出dom结构并设计一个样式:
1.dom结构如下:
<div id="selectYear">
<div class="select-ipt"></div><!--显示框,存放span的innerHTML,相当于option的innerHTML-->
<div style="display: none " class="select-list"><!--下拉框-->
<span id="1">1992</span><!--N个span-->
</div>
<input type="hidden" /><!--存放span的id,相当于option的value-->
</div>
2.css样式,下拉框需要一个下三角图片居右,图片就不上传了,也可以自己用css模拟下三角。样式可以定义多种,样式名称改变不会影响js。
/*下拉框*/
.select-ipt {color:#888888;cursor: pointer;background: url(select.jpg) no-repeat center right;
border:1px #ccc solid;cursor:pointer;width:73px;height: 29px;margin:0px 0px 0px 0px;padding:3px 0px 0px 0px;
line-height:29px;font-size:14px;}
/*样式一:下拉一排一个*/
.select-list {border: 1px #ccc solid;width:73px;margin-left:0px;position:absolute;z-index:;background:#fff;}
.select-list span{cursor:pointer;display:block;width:100%;height:22px;line-height:22px;padding:;font-size:14px;}
.select-list span:hover{background:#f6615b;color:#fff}
(三)开始写JS:
1.根据id绑定dom
function SelectPullDown(box){
this.selectBox = document.getElementById(box);
this.selectIpt = document.getElementById(box).getElementsByTagName("input")[0];//传值表单
this.selectDivBtn = document.getElementById(box).getElementsByTagName("div")[0];//选中显示框
this.selectDivList = document.getElementById(box).getElementsByTagName("div")[1];////下拉框
this.selectSpan = document.getElementById(box).getElementsByTagName("span");//选项
}
//调用方法
var year = new SelectPullDown('selectYear');
year.init();
2.定义原型方法,开始模拟:
很简单,主要就是定义显示隐藏和点击事件,然后修改值,最后手动触发onchange事件,onchange事件必须有,方便以后的js验证。
SelectPullDown.prototype ={
selectBox : '',
selectIpt : '',
selectDivBtn : '',
selectDivList : '',
selectSpan : '',
iptEven : function(){
var self = this;
this.selectBox.onmouseover = function(){
self.selectListShow();
}
this.selectBox.onmouseout = function(){
self.selectListHide();
}
return this;
},
selectListShow: function(){
this.selectDivList.style.display = "block";
},
selectListHide: function(){
this.selectDivList.style.display = "none";
},
selectPick : function() {
var span = this.selectSpan,
self = this;
function trimStr(str){return str.replace(/(^\s*)|(\s*$)/g,"");}
for(var i=0;i<span.length;i++){
span[i].onclick = function(){
self.selectDivBtn.innerHTML = trimStr(this.innerHTML);
self.selectIpt.value= trimStr(this.id);
self.selectListHide();
//chang事件触发
if (self.selectIpt.fireEvent) self.selectIpt.fireEvent('onchange');
else{
var evt;
evt = document.createEvent("HTMLEvents");
evt.initEvent("change", true, true);
self.selectIpt.dispatchEvent(evt);
};
}
}
return this;
},
init : function(){
this.iptEven().selectPick();
}
};
(四)完整代码如下(试着用下吧):
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>下拉表单</title>
<style type="text/css">
* {
margin:0px;
padding:0px;
}
body {
font-family: Arial, Helvetica, sans-serif;
font-size: 12px;
}
/*下拉框*/
.select-ipt {color:#888888;cursor: pointer;background: url(select.jpg) no-repeat center right;
border:1px #ccc solid;cursor:pointer;width:73px;height: 29px;margin:0px 0px 0px 0px;padding:3px 0px 0px 0px;
line-height:29px;font-size:14px;}
/*样式一:下拉一排一个*/
.select-list {border: 1px #ccc solid;width:73px;margin-left:0px;position:absolute;z-index:10000;background:#fff;}
.select-list span{cursor:pointer;display:block;width:100%;height:22px;line-height:22px;padding:0;font-size:14px;}
.select-list span:hover{background:#f6615b;color:#fff} </style>
</head>
<body>
<div id="selectYear">
<div class="select-ipt">请选择</div><!--显示框,存放span的innerHTML,相当于option的innerHTML-->
<div style="display: none " class="select-list"><!--下拉框-->
<span id="1">1992</span>
<span id="2">1993</span>
<span id="3">1994</span>
<span id="4">1995</span>
<span id="5">1996</span>
<span id="6">1997</span>
</div>
<input type="hidden" /><!--存放span的id,相当于option的value-->
</div> <script type="text/javascript" >
function SelectPullDown(box){
this.selectBox = document.getElementById(box);
this.selectIpt = document.getElementById(box).getElementsByTagName("input")[0];//传值表单
this.selectDivBtn = document.getElementById(box).getElementsByTagName("div")[0];//选中显示框
this.selectDivList = document.getElementById(box).getElementsByTagName("div")[1];////下拉框
this.selectSpan = document.getElementById(box).getElementsByTagName("span");//选项
}
SelectPullDown.prototype ={
selectBox : '',//document.getElementById('selectYear').getElementsByTagName("input")[0],
selectIpt : '',//document.getElementById('selectYear').getElementsByTagName("input")[0],
selectDivBtn : '',//document.getElementById('selectYear').getElementsByTagName("div")[0],
selectDivList : '',//document.getElementById(box).getElementsByTagName("div")[1];
selectSpan : '',//document.getElementById('selectYear').getElementsByTagName("span"),
iptEven : function(){
var self = this;
this.selectBox.onmouseover = function(){
self.selectListShow();
}
this.selectBox.onmouseout = function(){
self.selectListHide();
}
return this;
},
selectListShow: function(){
this.selectDivList.style.display = "block";
},
selectListHide: function(){
this.selectDivList.style.display = "none";
},
selectPick : function() {
var span = this.selectSpan,
self = this;
function trimStr(str){return str.replace(/(^\s*)|(\s*$)/g,"");}
for(var i=0;i<span.length;i++){
span[i].onclick = function(){
self.selectDivBtn.innerHTML = trimStr(this.innerHTML);
self.selectIpt.value= trimStr(this.id);
self.selectListHide();
//chang事件触发
if (self.selectIpt.fireEvent) self.selectIpt.fireEvent('onchange');
else{
var evt;
evt = document.createEvent("HTMLEvents");
evt.initEvent("change", true, true);
self.selectIpt.dispatchEvent(evt);
};
}
}
return this;
},
init : function(){
this.iptEven().selectPick();
}
};
//调用方法
var year = new SelectPullDown('selectYear');
year.init(); </script>
</body>
</html>
自己动手模拟百分百<select>下拉列表的更多相关文章
- jQuery还原select下拉列表和清空input的值,回显下拉列表框的值
实现用jQuery还原select下拉列表的值,用了很多种方式,花了一些时间,最后重要找到一种可以实现的方式, 页面上有这些内容 <select id ="level" na ...
- css配合js模拟的select下拉框
css配合js模拟的select下拉框 <!doctype html> <html> <head> <meta charset="utf-8&quo ...
- 集装箱学习(两):动手模拟AOP
简单的说,Spring是一个轻量级的控制反转(IOC)和面向切面(AOP)的容器框架. 上文已经介绍模拟IoC实现,这篇文章来动手模拟AOP. AOP简述 面向对象强调"一切皆是对象&quo ...
- [原]容器学习(二):动手模拟AOP
简单来说,Spring是一个轻量级的控制反转(IOC)和面向切面(AOP)的容器框架.上文已经介绍模拟IoC实现,这篇文章来动手模拟AOP. AOP简述 面向对象强调"一切皆是对象" ...
- [原]容器学习(一):动手模拟spring的IoC
介绍 学习经典框架的实现原理以及设计模式在其实际中的运用,是非常有必要的,可以让我们更好进行面向对象. 本篇文章就来模拟Spring的IOC功能,明白原理后,可以更好的使用它,进而为进行面向对象提供一 ...
- 详细的<select>下拉列表详解
我们使用表单下拉列表选择数据,如省.市.县.年.月等数据,我们即可使用下拉菜单表单进行设置.select 我下拉列表菜单标签Option为下拉列表数据标签Value 为Option的数据值(用于数据的 ...
- iOS中Safari浏览器select下拉列表文字太长被截断的处理方法
网页中的select下拉列表,文字太长的话在iOS的Safari浏览器里会被自动截断,显示成下面这种: 安卓版的浏览器则没有这个问题. 如何让下拉列表中的文字在iOS的Safari浏览器里显示完整呢? ...
- 容器学习(一):动手模拟spring的IoC
介绍 学习经典框架的实现原理以及设计模式在事实上际中的运用,是很有必要的,能够让我们更好进行面向对象. 本篇文章就来模拟Spring的IOC功能.明确原理后,能够更好的使用它,进而为进行面向对象提供一 ...
- ASP.NET自定义Web服务器控件-DropDownList/Select下拉列表控件
using System; using System.Collections.Generic; using System.ComponentModel; using System.Linq; usin ...
随机推荐
- nmap端口状态解析
nmap端口状态解析 状态 说明 open 应用程序在该端口接收 TCP 连接或者 UDP 报文 closed 关闭的端口对于nmap也是可访问的, 它接收nmap探测报文并作出响应.但没有应用程序在 ...
- Facebook is Hiring!
I am a software engineer in Facebook. I joined Facebook a year ago and now doing some iOS stuff. If ...
- [C/C++] zltabout(带缩进的格式化输出)v1.0。能以相同的代码绑定到 C FILE 或 C++流
作者:zyl910 一.缘由 在写一些生成文本的程序时,经常需要使用带缩进的格式化输出的功能.以前为此写过不少类似的函数,可惜它们的可重用性很差. 这是因为——1) C语言的FILE*不支持重定向到自 ...
- 【Vegas原创】RHEL6.2安装vmtools
1,mount虚拟cdrom # mount /dev/cdrom /mnt/cdrom 2, ls一下,看有没有 # cd /mnt/cdrom # ls –l ...
- Xshell小技巧
1. 鼠标右键粘贴 工具->选项->鼠标->向右按钮->(paste the clipboard contents.) 2. 选定文本自动复制到剪贴板 工具->选项-&g ...
- HDU 3844 Mining Your Own Business
首先,如果图本来就是一个点双联通的(即不存在割点),那么从这个图中选出任意两个点就OK了. 如果这个图存在割点,那么我们把割点拿掉后图就会变得支离破碎了.对于那种只和一个割点相连的块,这个块中至少要选 ...
- android studio clone 失败
Clone failedunable to access 'https://git.oschina.net/xx/xx.git/': Failed to connect to x.tu26.net p ...
- Android 模拟器检测
参考链接:https://github.com/MindMac/HideAndroidEmulator 从多个方面识别模拟器1.用户习惯:联系人数量.短信数量.相册里面照片数量.安装的应用2.从IME ...
- swift 如何删除subviews
scrollView.subviews.map { (var view) -> () in if (view is UIButton) { view.removeFromSuperview() ...
- worksteal thread pool
worksteal的场景 对于一个线程池,每个线程有一个队列,想象这种场景,有的线程队列中有大量的比较耗时的任务堆积,而有的线程队列却是空的,现象就是有的线程处于饥饿状态,而有的线程处于消化不良的状态 ...