准备工作
1、想好要把select美化成什么样子,并准备好相应的图片。
2、写好一个普通的表单递交页面,注意给select定义基本的CSS样式、在头部添加了调用js文件的代码、在body中添加了调用函数的脚本。
实现思路
第一步:将表单中的select隐藏起来。
第二步:用脚本找到select标签在网页上的绝对位置。
第三步:用脚本把select标签中的值读出来。
第四步:当用户点击select标签的替身,也就是div的时候。我们再用一个div浮在上一个div的下边,这个就是options的替身了。
功能需求
1、调用要方便,做好之后应该像这样:
以下是引用片段:
function loadSelect(selectobj){
//传入一个select对象就能将他的样式美化
}
2、不改变原有表单项,表单的页面代码不去破坏:
以下是引用片段:
<form name=f onsubmit=getResult();>
<fieldset>
<legend>用户注册</legend>
<div>
<label for=username>帐号</label>
<input type=text id=username name=username />
</div>
<div>
<label for=pwd>密码</label>
<input type=password name=pwd id=pwd />
</div>
<div>
<label for=province>省份</label>
<select id=province name=province>
<option value=10>江西</option>
<option value=11>福建</option>
<option value=12>广东</option>
<option value=13>浙江</option>
</select>
</div>
</fieldset>
<input type=submit value=提交 name=btnSub />
</form>
编写javascript
以下是引用片段:
<script type=text/javascript src=select.js></script>
新建一个js文件并保存为select.js,剩下的工作全部在这个js中去完成。
函数名:loadSelect(obj);
参数:select对象
相关函数:
以下是引用片段:
//取标签的绝对位置
{
var t = e.offsetTop;
var l = e.offsetLeft;
var w = e.offsetWidth;
var h = e.offsetHeight-2;
while(e=e.offsetParent)
{
t+=e.offsetTop;
l+=e.offsetLeft;
}
return {
top : t,
left : l,
width : w,
height : h
}
}
第一步:把select的绝对位置记录下来。一会替身上来就知道应该站那里了。
var offset=Offset(obj);
//这里解释一下Offset是一个函数,用来获取对象的绝对位置。写在loadSelect()函数外边的。它有四个属性分别是top/left/width/height。
第二步:将select隐藏。
obj.style.display=none;
第三步:虚拟一个div出来代替select
以下是引用片段:
var iDiv = document.createElement(div);
iDiv.id=selectof + obj.name;
iDiv.style.position = absolute;
iDiv.style.width=offset.width + px;
iDiv.style.height=offset.height + px;
iDiv.style.top=offset.top + px;
iDiv.style.left=offset.left + px;
iDiv.style.background=url(icon_select.gif) no-repeat right 4px;
iDiv.style.border=1px solid #3366ff;
iDiv.style.fontSize=12px;
iDiv.style.lineHeight=offset.height + px;
iDiv.style.textIndent=4px;
document.body.appendChild(iDiv);
第四步:把原始select没人选中的值给它。
以下是引用片段:
iDiv.innerHTML=obj.options[obj.selectedIndex].innerHTML;
第五步:为替身添加鼠标移过样式。
以下是引用片段:
iDiv.onmouseover=function(){//鼠标移到
iDiv.style.background=url(icon_select_focus.gif) no-repeat right 4px;
}
iDiv.onmouseout=function(){//鼠标移走
iDiv.style.background=url(icon_select.gif) no-repeat right 4px;
}
第六步:添加关键的鼠标点击事件。
以下是引用片段:
iDiv.onclick=function(){//鼠标点击
if (document.getElementById(selectchild + obj.name)){
//判断是否创建过div
if (childCreate){
//判断当前的下拉是不是打开状态,如果是打开的就关闭掉。是关闭的就打开。
document.getElementById(selectchild+ obj.name).style.display=none;
childCreate=false;
}else{
document.getElementById(selectchild + obj.name).style.display=;
childCreate=true;
}
}else{
//初始一个div放在上一个div下边,当options的替身。
var cDiv = document.createElement(div);
cDiv.id=selectchild + obj.name;
cDiv.style.position = absolute;
cDiv.style.width=offset.width + px;
cDiv.style.height=obj.options.length *20 + px;
cDiv.style.top=(offset.top+offset.height+2) + px;
cDiv.style.left=offset.left + px;
cDiv.style.background=#f7f7f7;
cDiv.style.border=1px solid silver;
var uUl = document.createElement(ul);
uUl.id=uUlchild + obj.name;
uUl.style.listStyle=none;
uUl.style.margin=0;
uUl.style.padding=0;
uUl.style.fontSize=12px;
cDiv.appendChild(uUl);
document.body.appendChild(cDiv);
childCreate=true;
for (var i=0;i<obj.options.length;i++){
//将原始的select标签中的options添加到li中
var lLi=document.createElement(li);
lLi.id=obj.options[i].value;
lLi.style.textIndent=4px;
lLi.style.height=20px;
lLi.style.lineHeight=20px;
lLi.innerHTML=obj.options[i].innerHTML;
uUl