如何盖住html页面上的SELECT(下拉框)元素

下拉框,即html的SELECT元素,.net设计时的DropDownList,是html中的windowed   element,尤其ie6之后,几乎是唯一的windowed   element(还有popup等少量极少用的的)。  
   
  普通的元素,textbox,   div,   table……这些,属于windowless   element,它们之间互相遮盖的情况由z-index决定,在它们之上,是SELECT这些windowed   element。所以一般情况下div、table等不能遮盖select。  
   
  这个问题广泛存在于各种弹出式控件的使用之中,比如日历控件等。  
   
  如果要显示div,以前的做法是,动态的,在显示的时候,让div区域的select不可见,div消失的时候,再恢复这些select元素。这种做法比较奇怪,因为它严格上并不是“遮盖”了select,而是,让她整个消失了,如果calendar弹出元素只是应该遮盖select元素的一部分,但select却整个不见,用户也许会觉得奇怪;做起来也麻烦,要用js逐一判断各select的位置。  
   
  ie5.5之后,有一个新的小技巧,称之为“iframe   shim”(iframe加塞:p),可以真正的“遮盖”select元素。  
   
  它利用了一种特殊的元素:iframe。在ie5.5之前,iframe也是windowed   element,但从5.5开始,iframe就是普通的windowless   element了,可是,虽然是windowless   element,iframe却可以盖住select。这种做法的原理就是:放一个iframe与你要显示的东西(比如说一个div)同样大小、位置,并设置z-index使得iframe在此DIV之下;这样,iframe遮盖了select,同时,iframe又在要显示的div的下面,div就露出来了。  
   
  限制:仅适用于ie5.5及以后版本。  
   
  参考文章链接:  
  http://dotnetjunkies.com/WebLog/jking/archive/2003/07/21/488.aspx  
   
  示例程序代码:  
  //html.select.hack.iframe   shim.htm  
  <html>  
  <head>  
    <script>  
      function   DivSetVisible(state)  
      {  
        var   DivRef   =   document.getElementById('PopupDiv');  
        var   IfrRef   =   document.getElementById('DivShim');  
        if(state)  
        {  
          DivRef.style.display   =   "block";  
          IfrRef.style.width   =   DivRef.offsetWidth;  
          IfrRef.style.height   =   DivRef.offsetHeight;  
          IfrRef.style.top   =   DivRef.style.top;  
          IfrRef.style.left   =   DivRef.style.left;  
          IfrRef.style.zIndex   =   DivRef.style.zIndex   -   1;  
          IfrRef.style.display   =   "block";  
        }  
        else  
        {  
          DivRef.style.display   =   "none";  
          IfrRef.style.display   =   "none";  
        }  
      }  
    </script>  
  </head>  
  <body   background="http://www.orkut.com/img/i_blau2.gif">  
    <form>  
      <select>  
        <option>A   Select   Box   is   Born   ....</option>  
      </select>  
    </form>  
    <div  
      id="PopupDiv"  
      style="position:absolute;font:italic   normal   bolder   12pt   Arial;   top:25px;   left:50px;   padding:4px;   display:none;   color:#ffff00;   z-index:100">  
      ....   and   a   DIV   can   cover   it   up<br>through   the   help   of   an   IFRAME.  
    </div>  
    <iframe  
      id="DivShim"  
      src="javascript:false;"  
      scrolling="no"  
      frameborder="0"  
      style="position:absolute;   top:0px;   left:0px;   display:none;filter=progid:DXImageTransform.Microsoft.Alpha(style=0,opacity=0);">  
    </iframe>  
    <br>  
    <br>  
      <a   href="#"   οnclick="DivSetVisible(true)">Click   to   show   DIV.</a>  
    <br>  
    <br>  
      <a   href="#"   οnclick="DivSetVisible(false)">Click   to   hide   DIV.</a>  
  </body>  
  </html>  

-----------------------------------------------------------------

当层遇到下拉框时总是挡不了select框?其实这是IE的BUG,其它的浏览器没有这个问题,对于这个问题论坛里不少提出,在这里提供我的几种方法,各有各的好处,有错,有好的意见者提出,谢谢.

1.最直接的方法:隐藏下拉框.

下面提供的是一个比较通用的一组函数:

test.htm

------------

<script>
var HideElementTemp = new Array();
//点击菜单时,调用此的函数,菜单对象
function cal_hideElementAll(obj){
cal_HideElement("IMG",obj);
cal_HideElement("SELECT",obj);
cal_HideElement("OBJECT",obj);
cal_HideElement("IFRAME",obj);
}
function cal_HideElement(strElementTagName,obj){
try{
var showDivElement = obj;
var calendarDiv = obj;
var intDivLeft = cal_GetOffsetLeft(showDivElement);
var intDivTop = cal_GetOffsetTop(showDivElement);//+showDivElement.offsetHeight;
//HideElementTemp=new Array()
for(i=0;i<window.document.all.tags(strElementTagName).length; i++){
var objTemp = window.document.all.tags(strElementTagName)[i];
if(!objTemp||!objTemp.offsetParent)
continue;
var intObjLeft=cal_GetOffsetLeft(objTemp);
var intObjTop=cal_GetOffsetTop(objTemp);
if(((intObjLeft+objTemp.clientWidth)>intDivLeft)&&
(intObjLeft<intDivLeft+calendarDiv.style.posWidth)&&
(intObjTop+objTemp.clientHeight>intDivTop)&&
(intObjTop<intDivTop+calendarDiv.style.posHeight)){
//var intTempIndex=HideElementTemp.length;//已经有的长度
//save elementTagName is stutas
//HideElementTemp[intTempIndex]=new Array(objTemp,objTemp.style.visibility);
HideElementTemp[HideElementTemp.length]=objTemp
objTemp.style.visibility="hidden";
}
}
}catch(e){alert(e.message)
}
}

function cal_ShowElement(){
var i;
for(i=0;i<HideElementTemp.length; i++){
var objTemp = HideElementTemp[i]
if(!objTemp||!objTemp.offsetParent)
continue;
objTemp.style.visibility=''
}
HideElementTemp=new Array();
}
function cal_GetOffsetLeft(src){
var set=0;
if(src && src.name!="divMain"){
if (src.offsetParent){
set+=src.offsetLeft+cal_GetOffsetLeft(src.offsetParent);
}
if(src.tagName.toUpperCase()!="BODY"){
var x=parseInt(src.scrollLeft,10);
if(!isNaN(x))
set-=x;
}
}
return set;
}

function cal_GetOffsetTop(src){
var set=0;
if(src && src.name!="divMain"){
if (src.offsetParent){
set+=src.offsetTop+cal_GetOffsetTop(src.offsetParent);
}
if(src.tagName.toUpperCase()!="BODY"){
var y=parseInt(src.scrollTop,10);
if(!isNaN(y))
set-=y;
}
}
return set;
}

</script>
<select></select>
<select></select>
<div style="position:absolute;left:0;top:0;width:100;height:100;background-color:red" οnclick="cal_hideElementAll(this)">
点击让select隐藏
</div>
<br><br><br><br><br><br>
<input type="button" value="点击让select显示" οnclick="cal_ShowElement()">

以上这种方法,如果对于select框数目少,相对固定的话,直接用obj.style.visibility="hidden"这样进行隐藏是更直接的.

2.Object对象的优先度较高,可以挡住select框

<OBJECT id=aa style="display:none;z-index:1000; position:absolute; top:0; left:0; width:152; height: 200;" type="text/x-scriptlet" data="about:<body><div style='position:absolute;left:0;top:0;width:152;height:200;font:14;color:white;background:black;border:1 solid black'>test</div>"></OBJECT>
<select><option>hellohellohellohello</select><button οnclick=aa.style.display=aa.style.display=="none"?"":"none">test</button>

这种方法虽然也简单,但对复杂的层是来说还不是好的解决方法



3.用iframe作载体

以下是一简单的例子:

-----------

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<meta name="GENERATOR" content="Microsoft FrontPage 4.0">
<meta name="ProgId" content="FrontPage.Editor.Document">
<title>简单菜单</title>
<!--
提供定位函数,用iframe作载体,不会被select挡住
By Fason(2003-5-21)
-->
<style id=s>
#div1{
position:absolute;
z-index:100;
width:100;
height:130;
background-color:#d2e8ff;
border:1 solid black;
}
div{cursor:hand;font-size:12px;}
a{text-decoration:none;color:red;font-size:12px}
</style>
</head>
<body>
<script>
function window.onload(){
var shtml=div1.innerHTML;
var ifm=document.createElement("<iframe frameborder=0 marginheight=0 marginwidth=0 hspace=0 vspace=0 scrolling=no></iframe>")
ifm.style.width=div1.offsetWidth
ifm.style.height=div1.offsetHeight
ifm.name=ifm.uniqueID
div1.innerHTML=""
div1.appendChild(ifm)
window.frames[ifm.name].document.write(s.outerHTML+"<body leftmargin=0 topmargin=0>"+shtml+"</body>")
}

function show(){
with(document.all.img1){
x=offsetLeft;
y=offsetTop;
objParent=offsetParent;
while(objParent.tagName.toUpperCase()!= "BODY"){
x+=objParent.offsetLeft;
y+=objParent.offsetTop;
objParent = objParent.offsetParent;
}
y+=offsetHeight-1
}
with(document.all.div1.style){
pixelLeft=x
pixelTop=y
visibility=''
}
}
function hide(){
document.all.div1.style.visibility='hidden'
}
</script>
<img id=img1 οnmοuseοver="show()" οnmοuseοut="hide()" src="ie.gif"><br><select></select>
<div id=div1 οnmοuseοver="style.visibility=''" οnmοuseοut="style.visibility='hidden'" style="visibility:hidden;">
<div href="http://www.csdn.net" οnmοuseοver="style.backgroundColor='highlight'" οnmοuseοut="style.backgroundColor=''" οnclick="window.open(href)">中国程序员</div>
<div href="http://www.sohu.com" οnmοuseοver="style.backgroundColor='highlight'" οnmοuseοut="style.backgroundColor=''" οnclick="window.open(href)">sohu</div>
</div>
</body>
</html>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值