一个用javascript写的select支持上下键、首字母筛选以及回车取值的功能

来源:互联网 发布:python requests get 编辑:程序博客网 时间:2024/05/16 13:46

调用时可以这样:

1,tempStr=GetNewSelectStr(dataTable.value,"select"+rowIndex,true);
2,makeSelectBox("select"+rowIndex,tempStr,value,obj);

tempStr-这个是返回的下拉列表值的框体
dataTable.value-这个是数据源(我这里是一张表)
"select"+rowIndex-这个是ID号,也就是当前这个select的id号(我这里是有多个select所以ID号是自动的)
true-这个是控制单击时出现下拉框体的标识
value-这个是初始的时候显示在select输入框中的值
obj-这个是要显示select的对象

 

源代码:
var nowOpenedSelectBox = "";
var mousePosition = "";
var userList=null;
function selectThisValue(thisId,thisIndex,thisValue,thisString) {
    var objId = thisId;
    var nowIndex = thisIndex;
    var valueString = thisString;
    var sourceObj = $(objId);
    var nowSelectedValue = document.getElementById(nowIndex+thisId).innerHTML;
    hideOptionLayer(objId);
    if (sourceObj) sourceObj.value = nowSelectedValue;
    settingValue(objId,valueString);
    selectBoxFocus(objId);
    if (sourceObj.onchange) sourceObj.onchange();
}

function settingValue(thisId,thisString) {
    var objId = thisId;
    var valueString = thisString;
    var selectedArea = document.getElementById(objId+"selectBoxSelectedValue");
    if (selectedArea) {
        if(navigator.appName.indexOf("Explorer") > -1){
            selectedArea.innerText = valueString;
        }
       else{
            selectedArea.textContent = valueString;
        }
   }
}

var l=0;
//显示下拉框中的值
function viewOptionLayer(thisId,Istask,flag) {
    var objId = thisId;
    var selectInfo="";
    var optionHeight = 18; // 高
    var optionMaxNum = 7; //
    var optionInnerLayerHeight = "";
    var selectBoxWidth =130;
    var selectBoxHeight =17;
    l=userList.Rows.length;
    var optionLayer = document.getElementById(objId+"selectBoxs");
    if(optionLayer.innerHTML=="")
     {
       if (l > optionMaxNum) optionInnerLayerHeight = "height:"+ (optionHeight * optionMaxNum) + "px";
       selectInfo  = "<table class='selectTable' id='" + objId + "selectBoxOptionLayer' cellpadding='0' cellspacing='0' border='0' style='position:absolute;z-index:100;'>";
       if(Istask=="true")
       {
        selectInfo += "    <tr>";
        selectInfo += "        <td height='" + selectBoxHeight + "' style='cursor:hand;' onClick=/"hideOptionLayer('"+ objId + "')/"></td>";
        selectInfo += "    </tr>";
        selectInfo += "    <tr>";
        selectInfo += "        <td style='height:2px;overflow:hidden;'></td>";
        selectInfo += "    </tr>";
       }
       else
       {
         selectInfo += "    <tr style='height:24px;'>";
         selectInfo += "        <td height='" + selectBoxHeight + "' style='cursor:hand;' onClick=/"hideOptionLayer('"+ objId + "')/"></td>";
         selectInfo += "    </tr>";
       }
       selectInfo += "    <tr style='height:17px;line-height:17px;border:none;'>";
       selectInfo += "        <td>";
       selectInfo += "        <div id='"+objId+"viewOptions' class='selectBoxOptionInnerLayer' style='width:" + selectBoxWidth + "px;" + optionInnerLayerHeight + "'>";
       selectInfo += "        <table class='selectTable' cellpadding='0' cellspacing='0' border='0' width='98%'>";
       for (var i=0 ; i < l ; i++)
        {
          var nowValue = userList.Rows[i][userList.Columns[0].Name];
          var nowText = userList.Rows[i][userList.Columns[0].Name];
          if(Istask=="true")
          {
            selectInfo += "            <tr>";
          }
          else
          {
            selectInfo += "            <tr style='height:17px;line-height:17px; border:none;'>";
          }
          selectInfo += "                <td id='"+i+objId+"' onMouseOver=/"resetStyle('"+objId+"');this.style.backgroundColor='#2c59aa';this.style.color='#ffffff';return true;/"  onMouseOut=/"this.style.backgroundColor='#FFFFFF';this.style.color='#253449';return true;/"  height='" + optionHeight + "' class='selectBoxOption' onMouseOver=/"this.className='selectBoxOptionOver'/" onMouseOut=/"this.className='selectBoxOption'/" onClick=/"selectThisValue('"+ objId + "'," + i + ",'" + nowValue + "','" + nowText + "')/" style='cursor:hand;'>" + nowText + "</td>";
         // selectInfo += "                <input type='hidden' id='"+ objId + "SelectBoxOptionValue" + i + "' value='" + nowValue + "'/>";
          selectInfo += "            </tr>";
        }
        selectInfo += "        </table>";
        selectInfo += "        </div>";
        selectInfo += "        </td>";
        selectInfo += "    </tr>";
        selectInfo += "</table>";
        optionLayer.innerHTML=selectInfo;
      }
   if (flag && optionLayer.style.display=="none"){ optionLayer.style.display = "";optionLayer.focus();}
   else
   {
     optionLayer.style.display = "none";
      if(document.getElementById("level"))
     {
       document.getElementById("level").style.display="";
     }
     if(document.getElementById("priority"))
     {
      document.getElementById("priority").style.display="";
     }
   }
   if(!flag){optionLayer.style.display = "";optionLayer.focus();}
   for(var i=0;i<count;i++)
    {
      if(document.getElementById("select"+i+""+"viewOptions"))
      {
        document.getElementById("select"+i+""+"viewOptions").style.display="none";
      }
    }
    document.getElementById(objId+"viewOptions").style.display="";
    if(document.getElementById("level"))
    {
      document.getElementById("level").style.display="none";
    }
     if(document.getElementById("priority"))
    {
      document.getElementById("priority").style.display="none";
    }
    nowOpenedSelectBox = objId;
    setMousePosition("inBox");
}
//支持首字母筛选、回车键取值、上下键选值功能
function firstLetter(thisId){
  var count=0;
  var selectedVal="";
  if(document.getElementById(thisId+"viewOptions").style.display=="")
    {
      document.getElementById(thisId+"viewOptions").focus();
      var asciiCode=String.fromCharCode(event.keyCode).toLowerCase();
      var selectValue="";
     if(event.keyCode==38)
      {
        for(var i=0;i<l;i++)
          {
            if(document.getElementById(i+thisId).className=="selectBoxOptionOver" && i>0)
             {
                 document.getElementById(i+thisId).style.backgroundColor='#ffffff';
                 document.getElementById(i+thisId).style.color='#253449';
                 document.getElementById(i+thisId).className='selectBoxOption';
                 document.getElementById((i-1)+thisId).style.backgroundColor='#2c59aa';
                 document.getElementById((i-1)+thisId).style.color='#ffffff';
                 document.getElementById((i-1)+thisId).className='selectBoxOptionOver';
                 document.getElementById(thisId+"viewOptions").scrollTop= (i-1)*20;
                 count=1;
                 break;
             }    
          }
          if(count==0)
          {
             document.getElementById((l-1)+thisId).style.backgroundColor='#2c59aa';
             document.getElementById((l-1)+thisId).style.color='#ffffff';
             document.getElementById((l-1)+thisId).className='selectBoxOptionOver';
          }
      }
      if(event.keyCode==40)
      {
        for(var i=0;i<l;i++)
          {
            if(document.getElementById(i+thisId).className=="selectBoxOptionOver" && i<l-1)
             {
                 document.getElementById(i+thisId).style.backgroundColor='#ffffff';
                 document.getElementById(i+thisId).style.color='#253449';
                 document.getElementById(i+thisId).className='selectBoxOption';
                 document.getElementById((i+1)+thisId).style.backgroundColor='#2c59aa';
                 document.getElementById((i+1)+thisId).style.color='#ffffff';
                 document.getElementById((i+1)+thisId).className='selectBoxOptionOver';
                 if(i>10)
                 {
                   document.getElementById(thisId+"viewOptions").scrollTop= (i+1)*19;
                 }
                 else
                 {
                    document.getElementById(thisId+"viewOptions").scrollTop= (i+1)*10;
                 }
                 count=1;
                 break;
             }       
          }
          if(count==0)
          {
            document.getElementById(0+thisId).style.backgroundColor='#2c59aa';
            document.getElementById(0+thisId).style.color='#ffffff';
            document.getElementById(0+thisId).className='selectBoxOptionOver';
          }
      }
      if(event.keyCode==13)
      {
        for(var i=0;i<l;i++)
          {
            if(document.getElementById(i+thisId).className=="selectBoxOptionOver")
             {
                 selectedVal=document.getElementById(i+thisId).innerHTML;
                 var sourceObj = $(thisId);
                 hideOptionLayer(thisId);
                 if (sourceObj) sourceObj.value = selectedVal;
                 settingValue(thisId,selectedVal);
                 selectBoxFocus(thisId);
                 if (sourceObj.onchange) sourceObj.onchange();
                 document.getElementById(thisId+"viewOptions").style.display="none";
                 if(document.getElementById("level"))
                 {
                   document.getElementById("level").style.display="";
                 }
                 if(document.getElementById("priority"))
                 {
                  document.getElementById("priority").style.display="";
                 }
                 break;
             }           
          }
      }
      for(var i=0 ; i < l ; i++)
      {
       selectValue=document.getElementById(i+thisId).innerHTML;
       if(asciiCode==selectValue.substring(0,1))
       {
         resetStyle(thisId);
         document.getElementById(i+thisId).style.backgroundColor='#2c59aa';
         document.getElementById(i+thisId).style.color='#ffffff';
         document.getElementById(i+thisId).className='selectBoxOptionOver';
         document.getElementById(thisId+"viewOptions").scrollTop= i*19;
         break;
       }
      }
    }
}
//清除被选中的下拉列表值的样式
function resetStyle(thisId){
  for(var i=0;i<l;i++)
  {
     document.getElementById(i+thisId).style.backgroundColor='#ffffff';
     document.getElementById(i+thisId).style.color='#253449';
     document.getElementById(i+thisId).className='selectBoxOption';
  }
}
//隐藏下拉框
function hideOptionLayer(thisId) {
    var objId = thisId;
    var optionLayer = document.getElementById(objId+"selectBoxs");
    if (optionLayer) optionLayer.style.display = "none";
     if(document.getElementById("level"))
     {
       document.getElementById("level").style.display="";
     }
     if(document.getElementById("priority"))
     {
      document.getElementById("priority").style.display="";
     }
}

function setMousePosition(thisValue) {
    var positionValue = thisValue;
    mousePosition = positionValue;
}

function clickMouse() {
    if (mousePosition == "out") hideOptionLayer(nowOpenedSelectBox);
}

function selectBoxFocus(thisId) {
    var objId = thisId;
    var obj = document.getElementById(objId + "selectBoxSelectedValue");
    obj.className = "selectBoxSelectedAreaFocus";
    obj.focus();
}

function selectBoxBlur(thisId) {
    var objId = thisId;
    var obj = document.getElementById(objId + "selectBoxSelectedValue");
    obj.className = "selectBoxSelectedArea";
}

function hiddenOptions(thisId){
 document.getElementById(thisId+"viewOptions").style.display="none";
  if(document.getElementById("level"))
     {
       document.getElementById("level").style.display="";
     }
     if(document.getElementById("priority"))
     {
      document.getElementById("priority").style.display="";
     }
}

function makeSelectBox(index,newSelect,value,obj) {
    newSelect=newSelect.replace(/(select0)/g,index);
    $(obj).html(newSelect);
    settingValue(index,value);
}
function GetNewSelectStr(table,index,IsTask){
    userList=table;
    var downArrowSrc = "../images/sanjiao.gif";    //三角
    var downArrowSrcWidth = 16;    //宽
    var selectBoxWidth =130;
    var selectBoxHeight =17;

    newSelect="<div id='" + index + "selectBoxs' style='position:absolute;z-index:100;display:none;' onMouseOut=/"setMousePosition('out')/" onkeydown=/"firstLetter('"+ index + "')/"></div>"
    newSelect += "<table class='selectTable' cellpadding='0' cellspacing='1' border='0' onClick=/"viewOptionLayer('"+ index + "','"+ IsTask + "',true)/" style='cursor:hand;height:18px;line-height:18px;' onkeydown=/"firstLetter('"+ index + "')/">";
    newSelect += "    <tr>";
    newSelect += "        <td>";
    newSelect += "        <table class='selectTable' cellpadding='0' cellspacing='0' border='0' style='height:18px;border:1px solid #9BB8C8;'>";
    if(IsTask)
    {
       newSelect += "            <tr>";
       newSelect += "                <td><div id='" + index + "selectBoxSelectedValue' name='selectBoxSelectedValue' class='selectBoxSelectedArea' style='width:" + (selectBoxWidth-downArrowSrcWidth-3)+ "px;height:" + selectBoxHeight + "px;overflow:hidden;' onBlur=/"selectBoxBlur('" + index + "');ValueEditd(this)/" onchange='ValueEditd(this)'></div></td>";
    }
    else
    {
      newSelect += "            <tr style='height:18px;line-height:17px;'>";
      newSelect += "                <td><div id='" + index + "selectBoxSelectedValue' name='selectBoxSelectedValue' class='selectBoxSelectedArea' style='width:" + (selectBoxWidth-downArrowSrcWidth-4)+ "px;overflow:hidden;' onBlur=/"selectBoxBlur('" + index + "');/"></div></td>";
    }
    newSelect += "                <td><img src='" + downArrowSrc + "' width='" + downArrowSrcWidth + "'  border='0'></td>";
    newSelect += "            </tr>";
    newSelect += "        </table>";
    newSelect += "        </td>";
    newSelect += "    </tr>";
    newSelect += "</table>";
    return newSelect ;
}

原创粉丝点击