今天刚刚看到罗亭的许可. "请勿做商用". 说明: 1.罗亭的可输入下拉框是个加密版.(变量名,函数名都被替换成数字) 2.函数众多.比如添加删除OPTION等被简化掉了.各位可以参考罗亭的贴子. 总之,这个要小上一点.看起来也可能会清楚点.
test.html <HTML> <HEAD> <TITLE>compobox</TITLE> <META http-equiv=Content-Type content="text/html; charset=shift_JIS">
<!--以外部引用方式--> <SCRIPT TYPE="text/javascript" src="ComboBox.js"></SCRIPT> </HEAD> <BODY onload="init();"><!-- onresize="resetAllSize();"这句话不加好象也可以.--> <form name="form1">
<!--如果不定宽度的话,会有很怪的效果^^--> <table border="1" width="395"> <tr> <td width="140">input web address:</td> <td width="216"> <select id="comboBox1" style="POSITION: absolute; onResize="if (combox1!=null) {combox1.doResize();}" onChange="if (combox1!=null) {combox1.doChange();}" name="select2">
<!--这句话里的selected似乎不起作用,可能我没看出来--> <option value=www.51js.com selected>www.51js.com</option> <option value=www.ccbfu.com>www.ccbfu.com</option> <option value=www.sina.com.cn>www.sina.com.cn</option> </select> </td> </tr> <tr> <td width="140">input web address:</td> <td height="200" width="216">
<!--如果要建立多个的话可以参考这种做法--> <select id="comboBox2" style="POSITION: absolute" onResize="if (combox2!=null) {combox2.doResize();}" onChange="if (combox2!=null) {combox2.doChange();}" name="select"> <option value=www.51js.com selected>www.51js.com</option> <option value=www.ccbfu.com>www.ccbfu.com</option> <option value=www.sina.com.cn>www.sina.com.cn</option> </select> </td> </tr>
<!--提交后可以看到它是如何传递值的--> <input type="submit" value="submit"> <SCRIPT> var combox1,combox2; function init() { combox1 = new combobox("comboBox1", "combox1"); combox1.doSelectIdx(-1);
combox2 = new combobox("comboBox2", "combox2"); combox2.doSelectIdx(-1); } </SCRIPT> </form> </BODY> </HTML>
ComboBox.js
function getLeftPostion( theObj ) { var pos = 0; while ( theObj != null ) { pos += theObj.offsetLeft; //get the Object which contain theObj. theObj = theObj.offsetParent; } return pos; } function getTopPostion( theObj ) { var pos = 0; while ( theObj != null ) { pos += theObj.offsetTop; //get the Object which contain theObj. theObj = theObj.offsetParent; } return pos; } function checkVersion() { var isBadVersion=true; var curVer=navigator.appVersion; var pos=parseInt(curVer.indexOf("MSIE")); if (pos>=1) { var intVer=parseInt(curVer.charAt(pos+5)); if (intVer>=5) { isBadVersion=false;} } if (isBadVersion) { var msg="This page may not be displayed properly:\n"+ " This product requires Microsoft Internet Explorer 5 or later browser only."; alert(msg); } }
//check the browser version checkVersion();
// the array of comboBoies theArray = new Array();
function combobox(objId, objHandler) { this.comObj = document.all[objId]; this.comObj.selectedIndex = -1; this.getValue = getValue; this.doResize = doResize; this.doChange = doChange; this.loseFocus = loseFocus; this.doSelectIdx = doSelectIdx; this.focus = focus;
var strMsg="";
//------------------------------------------------------------------------------------------------------ // create the text object //------------------------------------------------------------------------------------------------------ var txtObjIdName = objId + "_text";
if (document.all[txtObjIdName] != null) { strMsg="The following id: '" + txtObjIdName +"' is used internally by the Combo Box!\r\n"+ "Use of this id in your page may cause malfunction. Please use another id for your controls."; alert(strMsg); }
var txtInner = "<INPUT type='text' id=" + txtObjIdName + " name=" + txtObjIdName + " onblur='" + objHandler + ".loseFocus()' " + " style='display: none; position: absolute' value='' >";
this.comObj.insertAdjacentHTML("afterEnd", txtInner);
this.txtObj = document.all[txtObjIdName]; //------------------------------------------------------------------------------------------------------ // end //------------------------------------------------------------------------------------------------------
this.beResizing = false; this.doResize(); theArray[theArray.length] = this; }
function loseFocus() { var theComObj = this.comObj; var theTxtObj = this.txtObj; var i; theComObj.selectedIndex = -1;
if (theTxtObj.value == "") { return; }
var optLen = theComObj.options.length; for (i=0; i<optLen; i++) { var comVal = theComObj.options[i].text; var txtVal = theTxtObj.value;
if (comVal == txtVal) { theComObj.selectedIndex = i; return; } } }
function doResize() { if (!this.beResizing) { this.beResizing = true; this.txtObj.style.display="none"; this.comObj.style.position="static"; this.txtObj.style.posLeft = getLeftPostion(this.comObj); this.txtObj.style.posTop = getTopPostion(this.comObj) + 1; this.txtObj.style.posWidth = this.comObj.offsetWidth - 16; this.txtObj.style.posHeight = this.comObj.offsetHeight; this.comObj.style.position ="absolute"; this.comObj.style.posLeft = this.txtObj.style.posLeft; this.comObj.style.posTop = this.txtObj.style.posTop; this.offWidth = this.comObj.offsetWidth; var strRect = "rect(0 "+(this.comObj.offsetWidth)+" "+ this.comObj.offsetHeight + " "+(this.txtObj.style.posWidth - 2 )+")";
this.comObj.style.clip = strRect; this.txtObj.style.display=""; this.beResizing = false; } }
function doChange() { var idx = this.comObj.selectedIndex; var opt = this.comObj.options[idx]; this.txtObj.value = opt.text; this.txtObj.focus(); this.txtObj.select(); this.comObj.selectedIndex=-1; }
function getValue() { return this.txtObj.value; }
function doSelectIdx(i) { var optLen = this.comObj.options.length;
if ((i >=0) && (i < optLen)) { this.comObj.selectedIndex = i; this.txtObj.value = this.comObj.options[i].text; return; }
this.txtObj.value = ""; }
function focus() { this.txtObj.focus(); }
/* resize all combobox when window be resized */ function resetAllSize() { var i; for (i=0; i < theArray.length; i++) { theArray[i].doResize(); } }
|