职业IT人-IT人生活圈

 找回密码
 成为会员
搜索
查看: 1282|回复: 0

模仿combox(select)控件 省去美化烦恼

[复制链接]
胖哥 发表于 2007-8-13 13:12 | 显示全部楼层 |阅读模式
  不用整天为美化select控件烦恼了。
  1、可批量美化select控件。
  2、可以有onchange句柄。
  3、触发onchange的函数可带参数。
  3、可以得到select的值。
  4、可设置像select类似的滚动条(如大于或等于8个数目时出现滚动条)
  5、可设置宽度和高度
  API参考:
  //首先生成一个simulateSelect的实例
  //构造函数的第一个可选参数为触发onchange的函数,其它的为onchange函数的参数;
  c = new simulateSelect(s1onchange, \"never-online\");
  //设置select的CSS,第一个参数为控件的主要CSS、第二个为选中条目时的CSS、第三个为没有选中条目时的CSS
  c.style(\"CtlSelect2\", \"selected2\", \"unselected2\");
  //设置select的宽度和高度;
  c.width = 320;
  c.height = 20;
  //初始化参数为:select控件的ID,可以用逗号分离,进行批量转换;
  c.init(\"s1,s2,s3\");
  下一版本将可修改combox
<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\">
<HTML>
<HEAD>
<TITLE> simulate combox control - http://www.never-online.net </TITLE>
<META NAME=\"Generator\" CONTENT=\"EditPlus\">
<META NAME=\"Author\" CONTENT=\"\">
<META NAME=\"Keywords\" CONTENT=\"\">
<META NAME=\"Description\" CONTENT=\"\">
<style>
body, input
{
  font-family: verdana;
  font-size: 9pt;
}
h1
{
  font-family: tahoma;
  font-size: 22pt;
  text-align: left;
}
pre
{
  font-size: 9pt;
  font-family: verdana;
  border: 1px solid #006600;
  width: 400px;
  padding: 10px;
  background: #ffffff;
  color: #006600;
}
.CtlSelect
{
  border: 1px solid #006600;
  font-family: verdana;
  height: 20px;
  color: #006600;
  background: #ffffff;
  /*background:url({E5066804-650D-4757-9BA4-A92DB8817A18}0.jpg);*/
}
.selected
{
  background: #006600;
  color: #ffffff;
  height: 20px;
}
.unselected
{
  height: 20px;
  color: #006600;
  line-height: 120%;
  border-bottom: 1px solid #006600;
}
.CtlSelect1
{
  border: 1px solid #003399;
  font-family: verdana;
  height: 20px;
  color: #003399;
  background: #ffffff;
  /*background:url({E5066804-650D-4757-9BA4-A92DB8817A18}0.jpg);*/
}
.selected1
{
  background: #003399;
  color: #ffffff;
  height: 20px;
}
.unselected1
{
  height: 20px;
  color: #003399;
  line-height: 120%;
  border-bottom: 1px solid #003399;
}
.CtlSelect2
{
  border: 1px solid #990000;
  font-family: verdana;
  height: 20px;
  color: #990000;
  background: #ffffff;
  /*background:url({E5066804-650D-4757-9BA4-A92DB8817A18}0.jpg);*/
}
.selected2
{
  background: #990000;
  color: #ffffff;
  height: 20px;
}
.unselected2
{
  height: 20px;
  color: #990000;
  line-height: 120%;
  border-bottom: 1px solid #990000;
}
.copyright
{
  margin-top: 10px;
  font-size: 9pt;
  text-align: center;
  color: #333;
  font-weight: bold;
}
</style>
</HEAD>

<BODY>
<SCRIPT LANGUAGE=\"JavaScript\">
<!--
//-------------------------------------------------------------
// @ Module: simulate select control, IE only.
// @ Debug in: IE 6.0
// @ Script by: blueDestiny, never-online
// @ Updated: 2006-3-22
// @ Version: 1.0 apha
// @ Email: blueDestiny [at] 126.com
// @ Website: http://www.never-online.net
// @ Please Hold this item please.
//
// API
// @ class: simulateSelect()
//
// @ object.style(ctlStyle[,selStyle][,unselStyle])
//  ctlStyle: main control combox css class name
//  selStyle: when mouseover or option focus css class name
//  unselStyle: options blur&#39;s css class name
//
// @ object.width=(widthPX)
//  widthPX must be a digit number.
//
// @ object.height=(heightPX)
//  heightPX must be a digit number.
//
// @ object.getValue(ctlSelID)
//  ctlSelID is the unique select control ID
//
// -------------- for the next Version ----------
// @ object.readOnly = (blnReadOnly)
//  blnReadOnly must be a boolean type or a number type.
// @ object.addEvent(w, h)
//  w: fire handler&#39;s event.
//  h: handler function.
//-------------------------------------------------------------

function $(objID)
{
  return document.getElementById(objID);
};
function Offset(e)
{
  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
  }
}
//-----------------------------------------------
function simulateSelect(handlerFunction) { with(this)
{
  this.IDs = [];
  this.name = this;
  this.value = null;
  this.onchangeArgs = [];
  this.onchange = handlerFunction;
  this.height = 20;
  this.width = null;
  this.number = null;
  this.ctlStyle = \"CtlSelect\";
  this.selStyle = \"selected\";
  this.unselStyle = \"unselected\";
  this.elementPrefix = \"e__\";
  this.inputPrefix = \"i__\";
  this.containerPrefix = \"c__\";
  this.buttonPrefix = \"b__\";
  // property for beta Version
  // can editable combox
  this.readonly = true;
  if( arguments.length>0 )
  for(var i=0; i<arguments.length; i++)
  onchangeArgs[i-1] = arguments;
  return this;
}};
simulateSelect.prototype.init = function(ctlSelIDs) { with(this)
{
  eval(name).append(ctlSelIDs);
  eval(name).simulates();
}};

simulateSelect.prototype.style = function() { with(this)
{
  ctlStyle = arguments[0];
  selStyle = arguments[1];
  unselStyle = arguments[2];
}};
//-----------------------------------------------
simulateSelect.prototype.append = function(ctlSelIDs) { with(this)
{
  if( ctlSelIDs.indexOf(\",\")>0 )
  {
    var arrCtlSel = ctlSelIDs.split(\",\");
    for(var i=0; i<arrCtlSel.length; i++)
    {
      IDs.push(arrCtlSel);
    }
  }
  else
  IDs.push(ctlSelIDs);
}};
simulateSelect.prototype.checkupOnMouseDown = function(e) { with(this)
{
  // here compatible mf.
  var el = e ? e.srcElement : e.target;
  if( el.id.indexOf(elementPrefix)>-1 ||
  el.id.indexOf(inputPrefix)>-1 ||
  el.id.indexOf(containerPrefix)>-1 ||
  el.id.indexOf(buttonPrefix)>-1 )
  {
    return;
  }
  else
  {
    for(var i=0; i<eval(name).IDs.length; i++)
    if( $(containerPrefix + IDs) )
    $(containerPrefix + IDs).style.display = \"none\";
  }

}};
simulateSelect.prototype.simulates = function() { with(this)
{
  for(var i=0; i<IDs.length; i++)
  eval(name).simulate(IDs);
}};
simulateSelect.prototype.simulate = function(ctlSelID) { with (this)
{
  var input;
  var button;
  var object;
  var offset;

  object = $(ctlSelID);
  offset = Offset(object);
  input = document.createElement(\"INPUT\");
  button = document.createElement(\"BUTTON\");
  button.setAttribute(\"id\", buttonPrefix + ctlSelID);
  //button.value = \"⊿\";
  button.value = \"6\";
  button.style.fontFamily = \"Webdings, Marlett\";
  button.style.background = \"\";
  button.onclick = input.onclick = function()
  {
    this.blur();
    eval(name).expand(ctlSelID, offset);
  };
  input.onselectstart = function()
  {
    eval(name).expand(ctlSelID, offset);
    event.returnValue = false;
  };

  input.setAttribute(\"id\", inputPrefix + ctlSelID);
  input.title = button.title = \"click expand options\";
  input.style.cursor = button.style.cursor = \"default\";
  input.className = button.className = ctlStyle;
  input.style.width = (width>0 ? width : object.offsetWidth);
  height ? input.style.height=button.style.height=height : \"\";
  input.value = value = object[0].text;
  if( readonly==true ) input.readOnly=true;

  // this method is only IE.
  object.insertAdjacentElement(\"afterEnd\",button);
  object.insertAdjacentElement(\"afterEnd\",input);
  object.style.display = &#39;none&#39;;
}};
simulateSelect.prototype.expand = function(ctlSelID, offset) { with(this)
{
  var div;
  var object = $(ctlSelID);

  if( !$(containerPrefix + ctlSelID) )
  {
    div = document.createElement(\"DIV\");
    div.style.position = \"absolute\";
    div.style.display = \"block\";
    div.setAttribute(\"id\", containerPrefix + ctlSelID);
    div.className = ctlStyle;
    div.style.left = offset.left;
    div.style.top = offset.top + offset.height;
    div.style.width = (width ? width : offset.width) + 20;
    if( number )
    {
      div.style.height = height * number;
      div.style.overflow = \"auto\";
    }
    document.body.appendChild(div);

    for(var i=0; i<object.length; i++)
    {
      div = document.createElement(\"DIV\");
      div.setAttribute(\"id\", div.id = elementPrefix + ctlSelID + i);
      div.style.cursor = \"default\";

      if( object.text==$(inputPrefix + ctlSelID).value )
      div.className = selStyle;
      else
      div.className = unselStyle;

      div.innerText = div.title = object.text;
      div.style.height = height;
      div.setAttribute(\"value\", object.value);

      div.onmouseover = function()
      {
        for(var j=0; j<$(containerPrefix + ctlSelID).childNodes.length; j++)
        {
          if($(containerPrefix + ctlSelID).childNodes[j]==this)
          $(containerPrefix + ctlSelID).childNodes[j].className = selStyle;
          else
          $(containerPrefix + ctlSelID).childNodes[j].className = unselStyle;
        }            
      };
      div.onclick = function()
      {
        $(inputPrefix + ctlSelID).value = this.innerText;
        $(containerPrefix + ctlSelID).style.display = \"none\";
        if( onchange && value!=$(inputPrefix + ctlSelID).value )
        {
          onchange.apply(this,onchangeArgs);
          value = $(inputPrefix + ctlSelID).value;
        }
      };
      $(containerPrefix + ctlSelID).appendChild(div);
    }
    return;
  }

  if( $(containerPrefix + ctlSelID).style.display==\"none\" )
  {
    for(var i=0; i<object.length; i++)
    {
      if( object.text==$(inputPrefix + ctlSelID).value )
      $(elementPrefix + ctlSelID + i).className = selStyle;
      else
      $(elementPrefix + ctlSelID + i).className = unselStyle;
    }
    $(containerPrefix + ctlSelID).style.display=\"block\";
    return;
  }

  if( $(containerPrefix + ctlSelID).style.display==\"block\" )
  {
    $(containerPrefix + ctlSelID).style.display=\"none\";
    return;
  }
}};
simulateSelect.prototype.getValue = function(ctlSelID) { with(this)
{
  if( $(inputPrefix + ctlSelID) )
  return $(inputPrefix + ctlSelID).value;

  else
  return null;
}};
simulateSelect.prototype.addEvent = function(w, h) { with(this)
{
}};
//-----------------------------------------------
//window.onerror = Function(\"return true;\");
// IE only.
document.attachEvent(\"onmousedown\", function() {
  a.checkupOnMouseDown(event);
  b.checkupOnMouseDown(event);
  c.checkupOnMouseDown(event)
});
window.attachEvent(\"onload\", function() {
  window.a = new simulateSelect();
  a.style(\"CtlSelect\", \"selected\", \"unselected\");
  a.init(\"s1\");
  //-------------------------------------------
  window.b = new simulateSelect();
  b.style(\"CtlSelect1\", \"selected1\", \"unselected1\");
  b.width = 300;
  b.number = 9;
  b.init(\"s2\");
  //-------------------------------------------
  window.c = new simulateSelect(s1onchange, \"never-online\", a.getValue(&#39;s1&#39;));
  c.style(\"CtlSelect2\", \"selected2\", \"unselected2\");
  c.width = 320;
  c.init(\"s3\");
});
function s1onchange(para, s)
{
  alert(\"onchage handler fire \" + para + s);
}
//-->
</SCRIPT>
<h1> simulate combox control </h1>
<h4> demonstrate </h4>

<p>
normal select: <select id=\"s0\">
<option value=\"- please select your options -\"> - please select your options -</option>
<option value=\"1\">option1</option>
<option value=\"2\">option2</option>
<option value=\"3\">option3</option>
<option value=\"4\">option4</option>
<option value=\"5\">option5</option>
</select>
</p>

<p>
simulate select: <select id=\"s1\">
<option value=\"- please select your options -\"> - please select your options -</option>
<option value=\"1\">1option1</option>
<option value=\"2\">1option2</option>
<option value=\"3\">1option3</option>
<option value=\"4\">1option4</option>
<option value=\"5\">1option5</option>
</select>
</p>

<p>
scroll simulate select: <select id=\"s2\">
<option value=\"- please select your options -\"> - please select your options -</option>
<option value=\"1\">2option1</option>
<option value=\"2\">2option2</option>
<option value=\"3\">2option3</option>
<option value=\"4\">2option4</option>
<option value=\"5\">2option6</option>
<option value=\"5\">2option7</option>
<option value=\"5\">2option8</option>
<option value=\"5\">2option9</option>
<option value=\"5\">2option10</option>
<option value=\"5\">2option11</option>
<option value=\"5\">2option12</option>
<option value=\"5\">2option13</option>
<option value=\"5\">2option14</option>
</select>
</p>

<p>
onchange handler fire: <select id=\"s3\">
<option value=\"- please select your options -\"> - please select your options -</option>
<option value=\"1\">3option1</option>
<option value=\"2\">3option2</option>
<option value=\"3\">3option3</option>
<option value=\"4\">3option4</option>
<option value=\"5\">3option5</option>
</select>
</p>

<button onclick=\"alert(a.getValue(&#39;s1&#39;) + &#39;\\n\\n&#39; + b.getValue(&#39;s2&#39;) + &#39;\\n\\n&#39; + c.getValue(&#39;s3&#39;))\" class=\"CtlSelect\"> Get value </button>
<button onclick=\"alert(&#39;next version&#39;)\" class=\"CtlSelect\">append item</button>
<button onclick=\"alert(&#39;next version&#39;)\" class=\"CtlSelect\">remove item</button>

<h4> description </h4>
<pre>
//-------------------------------------------------------------
// @ Module: simulate select control, IE only.
// @ Debug in: IE 6.0
// @ Script by: blueDestiny, never-online
// @ Updated: 2006-3-22
// @ Version: 1.0 apha
// @ Email: blueDestiny [at] 126.com
// @ Website: http://www.never-online.net
// @ Please Hold this item please.
//
// API
// @ class: simulateSelect()
//
// @ object.style(ctlStyle[,selStyle][,unselStyle])
//  ctlStyle: main control combox css class name
//  selStyle: when mouseover or option focus css class name
//  unselStyle: options blur&#39;s css class name
//
// @ object.width=(widthPX)
//  widthPX must be a digit number.
//
// @ object.height=(heightPX)
//  heightPX must be a digit number.
//
// @ object.getValue(ctlSelID)
//  ctlSelID is the unique select control ID
//
// -------------- for the next Version ----------
// @ object.readOnly = (blnReadOnly)
//  blnReadOnly must be a boolean type or a number type.
// @ object.addEvent(w, h)
//  w: fire handler&#39;s event.
//  h: handler function.
//-------------------------------------------------------------
</pre>

<div class=\"copyright\">
Power By blueDestiny, never-online
http://www.never-online.net
</div>
</BODY>
</HTML>

   [Ctrl+A 全部选择 提示:你可先修改部分代码,再按运行]
您需要登录后才可以回帖 登录 | 成为会员

本版积分规则

QQ|手机版|小黑屋|网站帮助|职业IT人-IT人生活圈 ( 粤ICP备12053935号-1 )|网站地图
本站文章版权归原发布者及原出处所有。内容为作者个人观点,并不代表本站赞同其观点和对其真实性负责,本站只提供参考并不构成任何投资及应用建议。本站是信息平台,网站上部分文章为转载,并不用于任何商业目的,我们已经尽可能的对作者和来源进行了通告,但是能力有限或疏忽造成漏登,请及时联系我们,我们将根据著作权人的要求立即更正或者删除有关内容。

GMT+8, 2024-5-3 11:14 , Processed in 0.150026 second(s), 20 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表