JS的下拉提示框,和Google下拉提示框差不多

  1. <!--Part code come from :http://us.f901.mail.yahoo.com/ym/Compose?YY=123456-->
  2. <html>
  3. <head>
  4. <meta http-equiv="Content-Type" content="text/html; charset=gb2312">
  5. <title>Editable listbox</title>
  6. <style>
  7. /* Common elements */
  8. body{font:small/1.2em arial,helvetica,clean,sans-serif;font:x-small;}
  9. table{font-size:inherit;font:x-small;}
  10. /* Options Templates */
  11. .ac_menu{border:1px solid #3162A6;background-color:#F6F6F6;cursor:default;overflow:hidden;-moz-box-sizing:border-box;
  12.  height:expression((this.scrollHeight>210)?"210px":"auto")}
  13. .ac_menuitem{width:100%;color:#141414;padding:2px;cursor:pointer;cursor:hand;}
  14. .ac_menuitem_selected{background-color:#D6DEEC;width:100%;color:#141414;padding:2px;cursor:pointer;cursor:hand;}
  15. /* JK */
  16. .minHeightTextarea{
  17.  height:expression((this.scrollHeight>150)?"150px":(this.scrollHeight+5)+"px");
  18.  overflow : auto;
  19. }
  20. </style>
  21. <script language=javascript>
  22. var tofieldListArray=["a@b.c","深圳市科技园","深圳市罗湖东门","深圳市罗/"湖东门","深圳市罗'湖东门","1000", "1001", "1002", "1003", "1004", "1005", "1006", "1007", "1008", "1009",
  23. "1010", "1011", "1012", "1013", "1014", "1015", "1016", "1017", "1018", "1019",
  24. "1020", "1021", "1022", "1023", "1024", "1025", "1026", "1027", "1028", "1029",
  25. "1030", "1031", "1032", "1033", "1034", "1035", "1036", "1037", "1038", "1039",
  26. "1040", "1041", "1042", "1043", "1044", "1045", "1046", "1047", "1048", "1049"
  27. ];
  28. var ccfieldListArray=tofieldListArray;
  29. </script> 
  30. <script language=javascript>
  31.  var AC_TAB = 9;   // make the selection
  32.  var AC_ENTER = 13;   // make the selection
  33.  var AC_UP_ARROW = 38;    // move the drop down list selection up by one
  34.  var AC_DOWN_ARROW = 40;  // move the drop down list selection down by one
  35.  var theListDiv;
  36.  var theListArray;
  37.  var theComboxObj;
  38.  onload=OnLoad
  39.  function OnLoad()
  40.  {
  41.   setTimeout("Initialize()", 100);
  42.  }
  43.  function Initialize()
  44.  {
  45.    AddListDivFun(document.all.tofield); 
  46.    AddListDivFun(document.all.ccfield); 
  47.  }
  48.  function AddListDivFun(obj)
  49.  {
  50.   theListArray=eval(obj.id+"ListArray");
  51.   var tempStr=new Array();
  52.   var tempI=0;
  53.   tempStr[tempI++]='<DIV style="position:relative;visibility:hidden">'
  54.     +'<DIV class=ac_menu id="'+obj.id+'ListDiv" style="FONT-SIZE: 0.9em; Z-INDEX: 1; visibility:hidden; POSITION: absolute;OVERFLOW-Y:auto; WIDTH:'+obj.offsetWidth+'; " '
  55.     +'onmouseover="mouseOverListDivFun(event)" onmouseout="mouseOutListDivFun(event);" onmousedown="mouseDownListDivFun(event);" onscroll="scrollListDivFun();">';
  56.   tempStr[tempI++]="</DIV></DIV>";
  57.   obj.insertAdjacentHTML("afterEnd",tempStr.join(""));
  58.   theListDiv=eval(obj.id+"ListDiv");
  59.   obj.onfocus=AC_OnFocus;
  60.   obj.onblur=AC_OnBlur;
  61.   obj.onkeydown=AC_OnKeyDown;
  62.   obj.autoComplete="off";
  63.   obj.onpropertychange=AC_OnPropertyChange;
  64.  }
  65.  function AC_OnFocus(obj)
  66.  {
  67.   if(obj==null) obj=event.srcElement;
  68.   theListDiv=eval(obj.id+"ListDiv");
  69.   theListArray=eval(obj.id+"ListArray");
  70.   theComboxObj=obj;
  71.   theListDiv.style.visibility="visible";
  72.   //adjustListDivScroll();
  73.  }
  74.  function AC_OnBlur(obj)
  75.  {
  76.   if(obj==null) obj=event.srcElement;
  77.   if(theListDiv.contains(document.activeElement)) obj.focus();
  78.   else theListDiv.style.visibility="hidden";
  79.  }
  80.  function AC_OnPropertyChange(obj)
  81.  {
  82.   if(obj==null) obj=event.srcElement;
  83.   theListDiv=eval(obj.id+"ListDiv");
  84.   if(theListDiv==null) return ;
  85.   theListArray=eval(obj.id+"ListArray");
  86.   var objobjValue=obj.value;
  87.   if(objValue.length==0){
  88.    theListDiv.innerHTML="";
  89.    theListDiv.selectedIndex=-1;
  90.    theListDiv.selectedItemIndex=-1;
  91.    return;  
  92.   }
  93.   var objValueHtml=htmlEncode(objValue);
  94.   theListDiv.selectedIndex=-1;
  95.   var theLastVisibleIndex=0
  96.   var tempStr=new Array();
  97.   var numOfVisibleItems=0;
  98.   for(theLastVisibleIndex=0;theLastVisibleIndex<theListArray.length;theLastVisibleIndex++)
  99.   {
  100.    if(theListArray[theLastVisibleIndex].indexOf(objValue)==0)
  101.    {
  102.     if(numOfVisibleItems==13){
  103.      tempStr[numOfVisibleItems]="<DIV class=ac_menuitem  value="+theLastVisibleIndex+" id=virtualMoreItems itemIndex="+numOfVisibleItems+"><b>...More...</b></DIV>";
  104.      numOfVisibleItems++;
  105.      break;
  106.     }
  107.     else{
  108.      tempStr[numOfVisibleItems]="<DIV class=ac_menuitem  value="+theLastVisibleIndex+" itemIndex="+numOfVisibleItems+"><b>"+objValueHtml+"</b>"+htmlEncode(theListArray[theLastVisibleIndex].substr(objValue.length))+"</DIV>";
  109.      numOfVisibleItems++;
  110.     }
  111.    }
  112.   }
  113.   theListDiv.innerHTML=tempStr.join("");
  114.   if(numOfVisibleItems>0) 
  115.   {
  116.    theListDivtheListDiv.selectedIndex=theListDiv.children[0].value;
  117.    theListDiv.selectedItemIndex=0;
  118.    theListDiv.children[0].className="ac_menuitem_selected";
  119.    adjustListDivScroll();
  120.   }
  121.   else{
  122.    theListDiv.selectedIndex=-1;
  123.    theListDiv.selectedItemIndex=-1; 
  124.   }
  125.  }
  126.  function AC_OnKeyDown(obj)
  127.  {
  128.   if(theListDiv==null) return ;
  129.   if(obj==null) obj=event.srcElement;
  130.   var keyCode=event.keyCode;
  131.   if(keyCode==AC_ENTER) keyCode=event.keyCode=AC_TAB;
  132.   if(keyCode==AC_TAB && theListDiv.selectedIndex!=-1) 
  133.   {
  134.    if(obj.value!=theListArray[theListDiv.selectedIndex]) obj.value=theListArray[theListDiv.selectedIndex];
  135.    return ;
  136.   }
  137.   
  138.   if(keyCode==AC_UP_ARROW && theListDiv.selectedItemIndex>0)
  139.   {
  140.    theListDiv.children[theListDiv.selectedItemIndex].className="ac_menuitem";
  141.    theListDivtheListDiv.selectedItemIndex=theListDiv.selectedItemIndex*1-1;
  142.    theListDivtheListDiv.selectedIndex=theListDiv.children[theListDiv.selectedItemIndex].value;
  143.    theListDiv.children[theListDiv.selectedItemIndex].className="ac_menuitem_selected";
  144.    adjustListDivScroll();
  145.   }
  146.   if(keyCode==AC_DOWN_ARROW && theListDiv.selectedItemIndex<theListDiv.children.length-1)
  147.   {
  148.    theListDiv.children[theListDiv.selectedItemIndex].className="ac_menuitem";
  149.    theListDivtheListDiv.selectedItemIndex=theListDiv.selectedItemIndex*1+1;
  150.    theListDivtheListDiv.selectedIndex=theListDiv.children[theListDiv.selectedItemIndex];
  151.    theListDiv.children[theListDiv.selectedItemIndex].className="ac_menuitem_selected";
  152.    adjustListDivScroll();
  153.   }
  154.  }
  155.  function htmlEncode(str)
  156.  {
  157.   if(str==null) return "";
  158.   strstr=str.replace(/</ig,"<")
  159.   strstr=str.replace(/>/ig,">");
  160.   strstr=str.replace(/"/ig,""");
  161.   return str;
  162.  }
  163.  function scrollListDivFun()
  164.  {
  165.   var virtualMoreItemsObj=theListDiv.children["virtualMoreItems"];
  166.   if(virtualMoreItemsObj==null) return;
  167.   var theLastVisibleIndex=virtualMoreItemsObj.value*1;
  168.   var objValue=theComboxObj.value;
  169.   var objValueHtml=htmlEncode(objValue);
  170.   var tempStr=new Array();
  171.   var numOfVisibleItems=virtualMoreItemsObj.itemIndex*1;
  172.   for(;theLastVisibleIndex<theListArray.length;theLastVisibleIndex++)
  173.   {
  174.    if(theListArray[theLastVisibleIndex].indexOf(objValue)==0)
  175.    {
  176.     if(numOfVisibleItems==203){
  177.      tempStr[numOfVisibleItems]="<DIV class=ac_menuitem  value="+theLastVisibleIndex+" itemIndex="+numOfVisibleItems+" onmousedown='replaceThisWithAllLeftItems(this);'><b>...Click to show all items...</b></DIV>";
  178.      numOfVisibleItems++;
  179.      break;
  180.     }
  181.     else{
  182.      tempStr[numOfVisibleItems]="<DIV class=ac_menuitem  value="+theLastVisibleIndex+" itemIndex="+numOfVisibleItems+"><b>"+objValueHtml+"</b>"+htmlEncode(theListArray[theLastVisibleIndex].substr(objValue.length))+"</DIV>";
  183.      numOfVisibleItems++;
  184.     }
  185.    }
  186.   }
  187.   virtualMoreItemsObj.outerHTML=tempStr.join("");
  188.  }
  189.  function replaceThisWithAllLeftItems(obj)
  190.  {
  191.   var virtualMoreItemsObj=obj;
  192.   if(virtualMoreItemsObj==null) return;
  193.   var theLastVisibleIndex=virtualMoreItemsObj.value*1;
  194.   var objValue=theComboxObj.value;
  195.   var objValueHtml=htmlEncode(objValue);
  196.   var tempStr=new Array();
  197.   var numOfVisibleItems=virtualMoreItemsObj.itemIndex*1;;
  198.   for(;theLastVisibleIndex<theListArray.length;theLastVisibleIndex++)
  199.   {
  200.    if(theListArray[theLastVisibleIndex].indexOf(objValue)==0)
  201.    {
  202.     tempStr[numOfVisibleItems]="<DIV class=ac_menuitem  value="+theLastVisibleIndex+" itemIndex="+numOfVisibleItems+"><b>"+objValueHtml+"</b>"+htmlEncode(theListArray[theLastVisibleIndex].substr(objValue.length))+"</DIV>";
  203.     numOfVisibleItems++;
  204.    }
  205.   }
  206.   virtualMoreItemsObj.outerHTML=tempStr.join("");
  207.   event.cancelBubble=true;
  208.  }
  209.  function mouseOverListDivFun(event)
  210.  {
  211.   if(event.toElement!=theListDiv) event.toElement.style.backgroundColor="#E6E6E6";
  212.  }
  213.  function mouseOutListDivFun(event)
  214.  {
  215.   if(event.fromElement!=theListDiv) event.fromElement.style.backgroundColor="";
  216.  }
  217.  function mouseDownListDivFun(event)
  218.  {
  219.   var selectedStr="";
  220.   if(event.srcElement==theListDiv) return;
  221.   else if(event.srcElement.tagName=="B") selectedStr=theListArray[event.srcElement.parentElement.value] ;
  222.   else selectedStr=theListArray[event.srcElement.value];
  223.   if(theComboxObj.value!=selectedStr)theComboxObj.value=selectedStr;
  224.   theComboxObj.blur();
  225.  }
  226.  function adjustListDivScroll()
  227.  {
  228.   if ( theListDiv==null || theListDiv.selectedItemIndex==-1 || theListDiv.children.length==0 ) return ;
  229.   var i=theListDiv.selectedItemIndex;
  230.   if((theListDiv.children[i].offsetTop<theListDiv.scrollTop)||(theListDiv.children[i].offsetTop>theListDiv.scrollTop+200))
  231.    theListDiv.children[i].scrollIntoView();
  232.  }
  233. </script>
  234. </head> 
  235. <body >
  236.   
  237. <form name="Compose" id="Compose" method=post action="/ym/Compose?YY=61185">
  238. <table cellpadding=4 cellspacing=0 border=0 width="100%">
  239. <tr>
  240. <td >Mail To:</td>
  241. <td style="padding-top:0px;" >
  242. <textarea name="To" class="minHeightTextarea" style="width:300" tabindex="1" id="tofield" 
  243. rows="1"  title="textarea" cols="20">深圳</textarea>
  244. </td>
  245. </tr>
  246. <tr>
  247. <td >Mail Cc:</td>
  248. <td style="padding-top:0px;" >
  249. <input name="Cc" style="width:300" tabindex="1" id="ccfield" value=a title="input">
  250. </td>
  251. </tr>
  252. <tr>
  253. <td colspan=2>测试页面<br>你可以输入"1"、"深圳",就能看见效果<br>和Google有一点区别就是自己数据量大的话,这个是带滚动条的,但没有"XXX条结果"的效果</td>
  254. </tr>
  255. <tr>
  256. <td colspan=2>
  257. <br>
  258. <br>注1:EditableSelect4不是EditableSelect1的升级版,而是互补版,主要目的是想提高效率,支持3000或更多条选项,功能上有以下不同:
  259. <br>  a.可以达到,在3000或更多条选项选项时,反应时间在一秒内。
  260. <br>  b.输入长度大于0时才将过滤后的选项列出。
  261. <br>  c.先只列出可见的十条,scroll时列出200条,如果还有更多,让用户决定是否将所有的选项列出。
  262. <br>  d.舍弃“相等优先于相似”的功能。
  263. <br>
  264. <br>
  265. </td>
  266. </table>
  267. </form>
  268. </body>
  269. </html>  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值