可输入、自动匹配的下拉框

最近做一B/S项目,客户习惯了速达里边的COMBOBOX控件的使用,输入产品编号然后自动提示匹配产品信息,为了实现这个功能想了很多办法,原本在无技可施的时候准备用ActiveX控件凑合一下算了,好在JK兄出手相助,给偶一个类似的参考,终于了解了实现的方法,不过由于那套方案无法应对一些控件的遮挡,所以还不能完全达到要求,于是偶用POPUP方法改了下,终于大功告成,可以很好的实现客户的要求了,现将源公开给大家一起讨论,由于偶JS功力不深,SO,该代码还有很大的优化空间,欢迎大家讨论指正!

Thanks for JK!

STYLE.CSS

.ac_menu{border:1px solid #3162A6;background-color:#F6F6F6;z-index:99;cursor:default;overflow:hidden;-moz-box-sizing:border-box;height:expression((this.scrollHeight>130)?"130px":"auto")}
.ac_menuitem{width:100%;color:#141414;padding:2px;cursor:pointer;cursor:default;}
.ac_menuitem_selected{background-color:#D6DEEC;width:100%;color:#141414;padding:2px;cursor:default;}

MAIN.JS

<!--Combobox-->
function combobox(sobj,al_v,al_t)
{

 var rmopo = window.createPopup();

 function rm(i,oct,h)
 {  
  var i2=eval(i);
  var oct=eval(oct);
  var w=eval(i).offsetWidth;
  var h=eval(h);
  var lefter = i2.offsetLeft-1; var topper = i2.offsetHeight;
  rmopo.document.body.innerHTML = oct.innerHTML;
  rmopo.document.body.style.border="1px solid #3162A6";
  rmopo.document.body.style.background="#F6F6F6";
  rmopo.show(lefter, topper, w, h, i2);
 }

 loadcombobox(sobj,al_v,al_t);

 function loadcombobox(obj,al_v,al_t)
 {
  var obj = eval(obj)
  theListArrayV = al_v;
  theListArrayT = al_t;

  var tempStr='<DIV id="'+obj.id+'showcombox" style="position:relative;visibility:hidden">'
    +'<DIV class="ac_menu" id="'+obj.id+'ListDiv" style="FONT-SIZE: 12px; Z-INDEX: 10; POSITION: absolute;OVERFLOW-Y:auto; WIDTH:expression('+obj.offsetWidth+'-1);">'
  for(var i=0;i<theListArrayV.length;i++)
   tempStr+='<DIV class="ac_menuitem" οnmοuseοver="this.style.backgroundColor=/'#D6DEEC/';" οnmοuseοut="this.style.backgroundColor=/'/';" οnclick="this.selectedflag=1;parent.document.all.'+obj.id+'.value=this.value;parent.document.all.'+obj.id+'.blur();" style="cursor:default;" value="'+htmlEncode(theListArrayV[i])+'" textvalue="'+htmlEncode(theListArrayT[i])+'">'+htmlEncode(theListArrayT[i])+'</DIV>';
  tempStr+='</DIV></DIV>';

  obj.insertAdjacentHTML("afterEnd",tempStr);
  obj.οnfοcus=AC_OnFocus;
  obj.οnclick=AC_OnFocus;
  obj.οnblur=AC_OnBlur;
  obj.οnkeydοwn=AC_OnKeyDown;
  obj.autoComplete="off";
  obj.onpropertychange=AC_OnPropertyChange;
 }

 function AC_OnFocus(obj)
 {
  if(obj==null) obj=event.srcElement;
  popmenu=eval(obj.id+"showcombox");
  rm(obj,popmenu,130);
  AC_OnPropertyChange(obj);
 }


 function AC_OnBlur(obj)
 {
  rmopo.hide();
 }

 function AC_OnPropertyChange(obj)
 {
  if(obj==null) obj=event.srcElement;

  var dv = eval("rmopo.document.all['"+obj.id+"ListDiv']");
  theListDiv = dv
  if(theListDiv==null) return ;
  var theListDivChildren=theListDiv.children;

  theListDiv.selectedIndex=-1;
  var theFirstVisibleIndex=-1;

  var objValue=obj.value;

  for(var i=0;i<theListDivChildren.length;i++)
  {
   if(theListDiv.children[i].textvalue.indexOf(objValue)==0)
   {
    if(theFirstVisibleIndex==-1) theFirstVisibleIndex=i;
    theListDivChildren[i].style.backgroundColor="#F6F6F6";
    theListDivChildren[i].style.display="";
   }
   else
    theListDivChildren[i].style.display="none";
   if(theListDiv.selectedIndex==-1 && theListDiv.children[i].textvalue==objValue)
   {
    theListDiv.selectedIndex=i;
   }
  }
  if(theListDiv.selectedIndex==-1 && theFirstVisibleIndex!=-1)
  {
   theListDiv.selectedIndex=theFirstVisibleIndex;
  }
  if(theListDiv.selectedIndex!=-1)
  {
   theListDiv.children[theListDiv.selectedIndex].style.backgroundColor="#D6DEEC";
  }
  adjustListDivScroll(obj);
 }

 function AC_OnKeyDown(obj)
 {
  if(obj==null) obj=event.srcElement;

  var AC_TAB = 9;
  var AC_ENTER = 13;
  var AC_UP_ARROW = 38;
  var AC_DOWN_ARROW = 40;

  var dv = eval("rmopo.document.all['"+obj.id+"ListDiv']");
  theListDiv = dv
  if(theListDiv==null) return ;

  var keyCode=event.keyCode;
  if(keyCode==AC_ENTER) keyCode=event.keyCode=AC_TAB;

  if(keyCode==AC_TAB && theListDiv.selectedIndex!=-1)
  {
   obj.value=theListDiv.children[theListDiv.selectedIndex].value;
   rmopo.hide() ;
  }
 
  if(keyCode==AC_UP_ARROW && theListDiv.selectedIndex!=-1)
  {
   for(var i=theListDiv.selectedIndex-1;i>-1;i--)
   {
    if(theListDiv.children[i].style.display!="none")
    {
     theListDiv.children[theListDiv.selectedIndex].style.backgroundColor="#F6F6F6";
     theListDiv.selectedIndex=i;
     theListDiv.children[theListDiv.selectedIndex].style.backgroundColor="#D6DEEC";
     adjustListDivScroll(obj);
     break;
    }
   }
  }
 
  if(keyCode==AC_DOWN_ARROW && theListDiv.selectedIndex!=-1)
  {
   for(var i=theListDiv.selectedIndex*1+1;i<theListDiv.children.length;i++)
   {
    if(theListDiv.children[i].style.display!="none")
    {
     theListDiv.children[theListDiv.selectedIndex].style.backgroundColor="#F6F6F6";
     theListDiv.selectedIndex=i;
     theListDiv.children[theListDiv.selectedIndex].style.backgroundColor="#D6DEEC";
     adjustListDivScroll(obj);
     break;
    }
   }
   return;
  }
 
 }

 function adjustListDivScroll(obj)
 {
  if(obj==null) obj=event.srcElement;

  var dv = eval("rmopo.document.all['"+obj.id+"ListDiv']");
  theListDiv = dv

  if ( theListDiv==null || theListDiv.selectedIndex==-1 ) return ;
  var i=theListDiv.selectedIndex;
  if((theListDiv.children[i].offsetTop<theListDiv.scrollTop)||(theListDiv.children[i].offsetTop>theListDiv.scrollTop+120))
   theListDiv.scrollTop=theListDiv.children[i].offsetTop-85;
 }

 function htmlEncode(str)
 {
  if(str==null) return "";
  str=str.replace(/</ig,"&lt;")
  str=str.replace(/>/ig,"&gt;");
  str=str.replace(/"/ig,"&quot;");
  return str;
 }
}
<!--end-->


COMBOBOX.HTM

<html>
<head>
<link type="text/css" rel="stylesheet" href="../../style.css">
<script language="javascript" src="../../main.js"></script>
</head>
<body>

<table cellpadding=4 cellspacing=0 border=0 width="100%" >
<tr>
<td >Pid A:</td>
<td style="padding-top:0px;" >
<input name="Cca" style="width:300" tabindex="1" id="ccfield">
</td>
</tr>
<tr>
<td >Pid B:</td>
<td style="padding-top:0px;" >
<input name="Ccb" style="width:300" tabindex="1" id="ttfield">
</td>
</tr>
<tr>
<td >Select:</td>
<td style="padding-top:0px;" >
<select style="width:300px;"></select>
</td>
</tr>
</table>

<script>
var lat=["001001 产品一之一","001002 产品一之二","001011 产品一之三","001012 产品一之四","001021 产品一之五","001022 产品一之六","001023 产品一之七",
"002031 产品二之一","002032 产品二之二","002041 产品二之三","002042 产品二之四","002043 产品二之五","002051 产品二之六","002052 产品二之七",
"003000 产品三之一","003001 产品三之二","003101 产品三之三","003102 产品三之四","003201 产品三之五","003202 产品三之六","003216 产品三之七"];
var lav=["产品一之一","产品一之二","产品一之三","产品一之四","产品一之五","产品一之六","产品一之七",
"产品二之一","产品二之二","产品二之三","产品二之四","产品二之五","产品二之六","产品二之七",
"产品三之一","产品三之二","产品三之三","产品三之四","产品三之五","产品三之六","产品三之七"];
combobox(document.all.ccfield,lat,lat);
combobox(document.all.ttfield,lav,lat);
</script>
</body>
</html>

效果如下:

图一:

图二:

图三:

欢迎大家讨论,优化!

转载请注明出处、作者;使用优化请务必邮件通知一下,好让偶有机会向大家学习,谢谢!

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 14
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值