Windows自带的下拉选择框的优先级别比大多数控件(media player也有类似的“毛病”)要高。因此,在具有绝对定位的层的网页里,一旦触发下拉框空间的onChange事件,将会引起整个页面的闪烁,这样将造成用户体验明显下降。于是,我参考了网上一篇未署名的帖子,模拟出了一个具有筛选功能的下拉选择控件。在我们Web Builder的控件库里,我们改进了该控件,使它具有了自学习的功能(能够将下拉选项中没有的,用户输入的值,自动学习并且存入到数据库)。
    一下使我们改进后的下拉选择控件的代码:
1: 建立控件的内容由txt_SearchLimit、txt_SearchLimit_input、txt_SearchLimit_button、txt_SearchLimit_layer、txt_SearchLimit_table组成。

function BuildControl()
{
var tStrToolBar ="";//控件的内容
tStrToolBar += "<div id=\"txt_SearchLimit\" ctrlId=\"txt_SearchLimit\" selectedIndex=\"4\" value=\"0\" dspValue=\"选择时间范围\" style=\"\" class=\"\">";
通过DIV模拟实现下拉选择框    tStrToolBar 
+= " <span>";
通过DIV模拟实现下拉选择框    tStrToolBar 
+= "<input id=\"txt_SearchLimit_input\"  value=\"\" type=\"text\" class=\"\" style=\"width:80px;border-right:none none none;\" onkeydown=\"displayLayer(this.parentElement.parentElement);\" onKeyup=\"lookUpInput(this.parentElement.parentElement);\"  >";
通过DIV模拟实现下拉选择框    tStrToolBar 
+= "<input type=\"button\" id=\"txt_SearchLimit_button\" value=\" \" class=\"SelectButton\" style=\"width:18px;height:18px;\"  onClick=\"showLayer(this.parentElement.parentElement)\"/>";
通过DIV模拟实现下拉选择框    tStrToolBar 
+= "</span>";
通过DIV模拟实现下拉选择框    tStrToolBar 
+= "<div id=\"txt_SearchLimit_layer\" bgcolor=\"#FFFFFF\"  class=\"SelectTreeList\" style=\"width:80px;height:100px;\">";
通过DIV模拟实现下拉选择框    tStrToolBar 
+= "   <table id=\"txt_SearchLimit_table\" width=\"80px\" cellspacing=\"0\" cellpadding=\"0\" border=\"0\" bgcolor=\"#FFFFFF\">";
通过DIV模拟实现下拉选择框    tStrToolBar 
+= "      <tr onmouseover=\"moveWithOptions('highlight','white')\" onmouseout=\"moveWithOptions('','')\" onmouseup=\"selectedText(this.parentElement.parentElement.parentElement.parentElement)\">";
通过DIV模拟实现下拉选择框    tStrToolBar 
+= "        <td style=\"display:none\">1</td>";
通过DIV模拟实现下拉选择框    tStrToolBar 
+= "        <td >今天</td>";
通过DIV模拟实现下拉选择框    tStrToolBar 
+= "      </tr>";
通过DIV模拟实现下拉选择框    tStrToolBar 
+= "      <tr onmouseover=\"moveWithOptions('highlight','white')\" onmouseout=\"moveWithOptions('','')\" onmouseup=\"selectedText(this.parentElement.parentElement.parentElement.parentElement)\">";
通过DIV模拟实现下拉选择框    tStrToolBar 
+= "        <td style=\"display:none\">3</td>";
通过DIV模拟实现下拉选择框    tStrToolBar 
+= "        <td >最近三天</td>";
通过DIV模拟实现下拉选择框    tStrToolBar 
+= "      </tr>";
通过DIV模拟实现下拉选择框    tStrToolBar 
+= "      <tr onmouseover=\"moveWithOptions('highlight','white')\" onmouseout=\"moveWithOptions('','')\" onmouseup=\"selectedText(this.parentElement.parentElement.parentElement.parentElement)\">";
通过DIV模拟实现下拉选择框    tStrToolBar 
+= "        <td style=\"display:none\">7</td>";
通过DIV模拟实现下拉选择框    tStrToolBar 
+= "        <td >最近一星期</td>";
通过DIV模拟实现下拉选择框    tStrToolBar 
+= "      </tr>";
通过DIV模拟实现下拉选择框    tStrToolBar 
+= "       <tr onmouseover=\"moveWithOptions('highlight','white')\" onmouseout=\"moveWithOptions('','')\" onmouseup=\"selectedText(this.parentElement.parentElement.parentElement.parentElement)\">";
通过DIV模拟实现下拉选择框    tStrToolBar 
+= "        <td style=\"display:none\">30</td>";
通过DIV模拟实现下拉选择框    tStrToolBar 
+= "        <td >最近30天</td>";
通过DIV模拟实现下拉选择框    tStrToolBar 
+= "      </tr>";
通过DIV模拟实现下拉选择框    tStrToolBar 
+= "      <tr onmouseover=\"moveWithOptions('highlight','white')\" onmouseout=\"moveWithOptions('','')\" onmouseup=\"selectedText(this.parentElement.parentElement.parentElement.parentElement)\">";
通过DIV模拟实现下拉选择框    tStrToolBar 
+= "        <td style=\"display:none\">0</td>";
通过DIV模拟实现下拉选择框    tStrToolBar 
+= "        <td >选择时间范围</td>";
通过DIV模拟实现下拉选择框    tStrToolBar 
+= "      </tr></table>";
通过DIV模拟实现下拉选择框    tStrToolBar 
+= " </div>";
   document.body.innerHTML = tStrToolBar;
}

 2、加入控制控件的脚本

通过DIV模拟实现下拉选择框//用在自学习控件文本框的KeyPress事件中
通过DIV模拟实现下拉选择框  
function displayLayer(objAutoLearn)
通过DIV模拟实现下拉选择框   {
通过DIV模拟实现下拉选择框     
if (event.keyCode == 9)
通过DIV模拟实现下拉选择框       
return;
通过DIV模拟实现下拉选择框     
var objLayer = objAutoLearn.lastChild;
通过DIV模拟实现下拉选择框     
if(objLayer !=null)
通过DIV模拟实现下拉选择框     {
通过DIV模拟实现下拉选择框       
if(objLayer.style.display!="block")
通过DIV模拟实现下拉选择框       {
通过DIV模拟实现下拉选择框         objLayer.style.display 
="block";
通过DIV模拟实现下拉选择框          
with(objLayer.style)
通过DIV模拟实现下拉选择框          {
通过DIV模拟实现下拉选择框           
var objLearn = objAutoLearn.firstChild.firstChild;
通过DIV模拟实现下拉选择框           
var xy = getSelectPosition(objLearn);
通过DIV模拟实现下拉选择框           posLeft 
= xy[0];
通过DIV模拟实现下拉选择框          
通过DIV模拟实现下拉选择框           pixelTop 
= xy[1]+objLearn .offsetHeight;
通过DIV模拟实现下拉选择框         }
通过DIV模拟实现下拉选择框         
if(objLayer.innerHTML == "")
通过DIV模拟实现下拉选择框         {
通过DIV模拟实现下拉选择框            //原本是通过Web Services从服务器端,获取数据的函数。这里用不上
               //
ShowAutoLearnData(objAutoLearn);
通过DIV模拟实现下拉选择框         }
通过DIV模拟实现下拉选择框       }
通过DIV模拟实现下拉选择框     }
通过DIV模拟实现下拉选择框   }
通过DIV模拟实现下拉选择框  
//用在自学习控件的按钮按下的的事件中
通过DIV模拟实现下拉选择框
function showLayer(objAutoLearn)
通过DIV模拟实现下拉选择框   {
通过DIV模拟实现下拉选择框     
var objLayer = objAutoLearn.lastChild;
通过DIV模拟实现下拉选择框     
if(objLayer !=null)
通过DIV模拟实现下拉选择框     {
通过DIV模拟实现下拉选择框       
if(objLayer.style.display !="block")
通过DIV模拟实现下拉选择框       {
通过DIV模拟实现下拉选择框         objLayer.style.display 
="block";
通过DIV模拟实现下拉选择框          
with(objLayer.style)
通过DIV模拟实现下拉选择框         {
通过DIV模拟实现下拉选择框           
var objLearn = objAutoLearn.firstChild.firstChild;
通过DIV模拟实现下拉选择框           
var xy = getSelectPosition(objLearn);      
通过DIV模拟实现下拉选择框           posLeft 
= xy[0];
通过DIV模拟实现下拉选择框          
通过DIV模拟实现下拉选择框           pixelTop 
= xy[1]+objLearn .offsetHeight;
通过DIV模拟实现下拉选择框        }
通过DIV模拟实现下拉选择框         
if(objLayer.innerHTML == "")
通过DIV模拟实现下拉选择框         {
通过DIV模拟实现下拉选择框             ShowAutoLearnData(objAutoLearn);
通过DIV模拟实现下拉选择框         }
通过DIV模拟实现下拉选择框       }
通过DIV模拟实现下拉选择框       
else
通过DIV模拟实现下拉选择框       {
通过DIV模拟实现下拉选择框         objLayer.style.display 
="none";
通过DIV模拟实现下拉选择框       }
通过DIV模拟实现下拉选择框     }
通过DIV模拟实现下拉选择框   }

3、获取下拉选项显示位置的函数

通过DIV模拟实现下拉选择框 function getSelectPosition(elt) 
通过DIV模拟实现下拉选择框   {
通过DIV模拟实现下拉选择框    
var pos = new Object;
通过DIV模拟实现下拉选择框    pos.x 
= 0;
通过DIV模拟实现下拉选择框    pos.y 
= 0;
通过DIV模拟实现下拉选择框    
//一直找到body,如果相等就不加
通过DIV模拟实现下拉选择框
    while (elt&& elt.tagName.toUpperCase()!="BODY")
通过DIV模拟实现下拉选择框    {    
通过DIV模拟实现下拉选择框        
if (pos.y!=elt.offsetTop && elt.style.position !="absolute")    
通过DIV模拟实现下拉选择框        {  
通过DIV模拟实现下拉选择框            pos.x 
+= elt.offsetLeft;
通过DIV模拟实现下拉选择框            pos.y 
+= elt.offsetTop;
通过DIV模拟实现下拉选择框            
if(elt.tagName.toUpperCase()!="HTML")
通过DIV模拟实现下拉选择框            {
通过DIV模拟实现下拉选择框             pos.x 
= pos.x -elt.scrollLeft;
通过DIV模拟实现下拉选择框             pos.y 
= pos.y -elt.scrollTop;
通过DIV模拟实现下拉选择框            }
通过DIV模拟实现下拉选择框        }    
通过DIV模拟实现下拉选择框        elt 
= elt.offsetParent;
通过DIV模拟实现下拉选择框    }
通过DIV模拟实现下拉选择框    
return ([pos.x,pos.y]);
通过DIV模拟实现下拉选择框  }

4、查找用户输入项

通过DIV模拟实现下拉选择框 function lookUpInput(objAutoLearn)
通过DIV模拟实现下拉选择框   {
通过DIV模拟实现下拉选择框     
if(objAutoLearn.firstChild.firstChild.readOnly == true)
通过DIV模拟实现下拉选择框     {
通过DIV模拟实现下拉选择框       
return;
通过DIV模拟实现下拉选择框     }
通过DIV模拟实现下拉选择框     
var strInputValue = objAutoLearn.firstChild.firstChild.value;
通过DIV模拟实现下拉选择框    
通过DIV模拟实现下拉选择框        
var objTable = objAutoLearn.lastChild.firstChild;
通过DIV模拟实现下拉选择框         
if (objTable!= null && objTable.rows.length>0)
通过DIV模拟实现下拉选择框         {
通过DIV模拟实现下拉选择框            
var rowCount = objTable.rows.length;
通过DIV模拟实现下拉选择框            
for(var i=0; i<rowCount;i++)
通过DIV模拟实现下拉选择框            {
通过DIV模拟实现下拉选择框               
var objRow = objTable.rows[i];
通过DIV模拟实现下拉选择框               
var strValue = objRow.cells[0].innerText;
通过DIV模拟实现下拉选择框               
var strDspValue = objRow.cells[1].innerText;
通过DIV模拟实现下拉选择框               
if (strDspValue.indexOf(strInputValue)!=-1)
通过DIV模拟实现下拉选择框               {
通过DIV模拟实现下拉选择框                 objRow.style.display 
="block";
通过DIV模拟实现下拉选择框               }
通过DIV模拟实现下拉选择框               
else
通过DIV模拟实现下拉选择框               {
通过DIV模拟实现下拉选择框                  objRow.style.display 
="none";
通过DIV模拟实现下拉选择框               }
通过DIV模拟实现下拉选择框            }
通过DIV模拟实现下拉选择框         }
通过DIV模拟实现下拉选择框      
通过DIV模拟实现下拉选择框   }


5、将选择的值放置到文本框并且给控件的value,Dspvalue属性赋值

通过DIV模拟实现下拉选择框function selectedText(objAutoLearn) 
通过DIV模拟实现下拉选择框   {
通过DIV模拟实现下拉选择框     
var objInput = objAutoLearn.firstChild.firstChild;
通过DIV模拟实现下拉选择框     
if (objInput !=null)
通过DIV模拟实现下拉选择框     {
通过DIV模拟实现下拉选择框        
with(event.srcElement) 
通过DIV模拟实现下拉选择框         {
通过DIV模拟实现下拉选择框           objInput.value
= innerText;
通过DIV模拟实现下拉选择框           objAutoLearn.setAttribute(
"value",previousSibling.innerText);
通过DIV模拟实现下拉选择框           objAutoLearn.setAttribute(
"dspValue",innerText);
通过DIV模拟实现下拉选择框           objAutoLearn.setAttribute(
"selectedIndex",parentElement.rowIndex);
通过DIV模拟实现下拉选择框         }
通过DIV模拟实现下拉选择框       objAutoLearn.lastChild.style.display 
="none";  
通过DIV模拟实现下拉选择框     }
通过DIV模拟实现下拉选择框     objInput.fireEvent(
"onChange");//引发控件的onChange事件
通过DIV模拟实现下拉选择框
   }


 

相关文章:

  • 2022-12-23
  • 2021-09-25
  • 2022-12-23
  • 2021-06-10
  • 2021-08-26
  • 2022-12-23
  • 2022-12-23
猜你喜欢
  • 2022-12-23
  • 2021-11-17
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
相关资源
相似解决方案