IE6兼容性问题 select 遮盖div

来源:互联网 发布:sql blob大小 编辑:程序博客网 时间:2024/04/30 02:25

在IE中,select属于window类型控件,它会“挡住”所有非window类型控件
可以这么理解,div这样的组件是在浏览器客户区使用代码“渲染”的,
他们被渲染在客户区的绘画表面上,
而select是使用的标准windows控件,只是作为客户区的子控件放置而已,
它会覆盖所有客户区绘画表面上“画”出来的一切,但不一定会覆盖其他类型的window控件,
比如iframe和其他的select,如果你使用过类似Delphi这样的环境就会自然理解。IE7解决了此类BUG。

使用JS做DIV弹出层时,一般地在IE下是无法遮罩ActiveX控件的,同时在IE6下Select也遮罩不住。在IE中ActiveX默认永远显示在最顶层,因此通过设置Style的Z-Index属性也无法改变遮罩关系的。在信息系统软件中,许多场合由于性能、操作等原因,往往会使用ActiveX代替Html来完成功能,从而成为不可回避的问题。

1var sd = XX.style.display;
2XX.style.display = "none";
3 ...
4//关闭弹出层后显示
5XX.style.display = sd;
  最容易想到的方法是在弹出DIV层前隐藏控件对应的object,关闭层后再显示出来。如果只是当个页面诚然这样简单,但如果存在多个Iframe嵌套的话,对于其他Iframe也存在控件的话就比较麻烦。
  在IE6以后版本存在称之为shim的解决办法,基本思路是这样的,在当前页面动态创建一个iframe,其z-index比当前的要高,则这个iframe会呈现在最上方,然后将弹出的div的z-index设置比这个iframe的要高,此时弹出的div就能遮罩住ActiveX控件了,示意见如下简图(实际div是与iframe重合的)。
shim示意图
  当然还需要设置一些必要地属性,比较关键是设置iframe的src属性为javascript:false;,并设置display为none,透明度为0。

 
01//popDiv是弹出层,nowindex是当前的z-index
02popDiv.style.zIndex=nowindex+1;
03//加一个iframe以遮住ActiveX
04if($get("__iframeBodyCover" + winname )==null){
05    var iframeBodyCover = document.createElement("iframe");
06        iframeBodyCover.id = "__iframeBodyCover"+winname;
07        iframeBodyCover.style.cssText = "position:absolute;top:0;left:0;width:" + document.body.clientWidth+ "px; height:" + document.body.clientHeight + "px;background-color:#000000;filter:alpha(opacity=0);display:none;";
08        iframeBodyCover.src ="javascript:false;";
09        document.body.appendChild(iframeBodyCover);
10}
11//iframe的z-index比div的要低
12$get("__iframeBodyCover" + winname ).style.zIndex = nowindex;
  当然这时候在IE6下自然也能遮罩住select了,方法还是有一点巧妙地,没有经验的可能比较难以想到,不过不知道是不是有更好地方法。

转载方案:

有多种种办法;
1. 修改select,不用标准select,而是自己用其他html元素模拟
2. 修改你的div,使用iframe。
3. 在div被显示的时候或者到达select所在位置时隐藏select
4. 在div中或div的同一坐标上,用相同尺寸的iframe先遮挡一下,然后在iframe上显示div的内容。
5.Object对象的优先度较高,可以挡住select框

 

解决方案4   iframe

<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>
<form>
<select>
<option>A Select Box is Born ....</option>
</select>
</form>
<div id="PopupDiv" style="position:absolute; top:25px; left:50px; padding:4px; display:none; background-color:#000000; color:#ffffff; 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;">
</iframe>
<br/>
<br/>
<a href="#" onclick="DivSetVisible(true)">Click to show DIV.</a>
<br/>
<br/>
<a href="#" onclick="DivSetVisible(false)">Click to hide DIV.</a>
</body>
</html>

转载方案:

先看看IE6下效果:

       IE8下:

 

 

 

                       

 

可见,这是极其难看的,无论层的z-index设到多少亿都是没用的,目前没发现完美的解决方法,都是存在bug的,本人现知道的有2种:

 

1.显示层之前隐藏全部select,此方法影响效率,也影响布局美观。

2.在层里插入一个隐藏iframe,奇怪的是,iframe可以覆盖select,需要设置iframe为浮动,透明度为0,IE6效果:

 

 

 

代码,IE6-8、firefox3.5、safari4、opera9测试下通过:

 

 

Html代码  收藏代码
  1. <html>  
  2.     <head>  
  3.         <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">  
  4.         <title>Untitled Document</title>  
  5.     </head>  
  6.     <body>  
  7.         <div style="position:absolute;background:red;width:100px;height:200px;left:20px;top:20px;">  
  8.             <iframe style="position:absolute;width:100%;height:100%;_filter:alpha(opacity=0);opacity=0;border-style:none;"></iframe>  
  9.             sdfsdfsdf<br>sdfsdfsdf<br>sdfsdfsdf<br>sdfsdfsdf<br>  
  10.         </div>  
  11.         <select><option>sdf</option></select>  
  12.         dfgdfgdfgdfgdfgdfgdfgdfgdfdfgdfgdfgdfgdfgdfgdfgdfgddfgdfgdfgdfgdfgdfgdfgdfgd  
  13.         dfgdfgdfgdfgdfgdfgdfgdfgdf        
  14.     </body>  
  15. </html>

 完。




原创粉丝点击