开发过程中遇到这么一个问题有一个<select></select>的选择框,里面有个option的值很长大约128个字节,那么如果我不指定select的width时候,这个框就会很长,但是如果我限制了width那么这个option又显示不全,这个BUG仅仅会在IE中出现,如何解决呢,其实可以把select的下拉框用一个层覆盖掉,那个层会显示完整的数据,而select的widt指定好,这样整个页面的布局都不会被影响。所有的操作都通过JS实现,下面我就把代码贴出来。
<!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
-->function foo(px,py,pw,ph,baseElement,fid)
{
var win = document.getElementById(this.fid);
};
function dropdown_menu_hack(el)
{
if(el.runtimeStyle.behavior.toLowerCase()=="none"){return;}
el.runtimeStyle.behavior="none";
var ie5 = (document.namespaces==null);
el.ondblclick = function(e)
{
window.event.returnValue=false;
return false;
};
if(window.createPopup==null)
{
var fid = "dropdown_menu_hack_" + Date.parse(new Date());
window.createPopup = function()
{
if(window.createPopup.frameWindow==null)
{
el.insertAdjacentHTML("AfterEnd","<iframe id='"+fid+"' name='"+fid+"' src='about:blank' frameborder='1' scrolling='no'></></iframe>");
var f = document.frames[fid];
f.document.open();
f.document.write("<html><body></body></html>");
f.document.close();
f.fid = fid;
var fwin = document.getElementById(fid);
fwin.style.cssText="position:absolute;top:0;left:0;display:none;z-index:99999;";
f.show = function(px,py,pw,ph,baseElement)
{
py = py + baseElement.getBoundingClientRect().top + Math.max( document.body.scrollTop, document.documentElement.scrollTop) ;
px = px + baseElement.getBoundingClientRect().left + Math.max( document.body.scrollLeft, document.documentElement.scrollLeft) ;
fwin.style.width = pw + "px";
fwin.style.height = ph + "px";
fwin.style.posLeft =px ;
fwin.style.posTop = py ;
fwin.style.display="block";
};
f_hide = function(e)
{
if(window.event && window.event.srcElement && window.event.srcElement.tagName && window.event.srcElement.tagName.toLowerCase()=="select"){return true;}
fwin.style.display="none";
} ;
f.hide = f_hide;
document.attachEvent("onclick",f_hide);
document.attachEvent("onkeydown",f_hide);
}
return f;
};
}
function showMenu()
{
function selectMenu(obj,value)
{
var o = document.createElement("option");
o.value = value;
o.innerHTML = value;
while(el.options.length>0){el.options[0].removeNode(true);}
el.appendChild(o);
el.title = value;
el.contentIndex = value ;
el.value=value;
//alert(value);
//$("#deviceOwnerValue").val(value);
el.menu.hide();
}
el.menu.show(0 , el.offsetHeight , 10, 10, el);
var mb = el.menu.document.body;
mb.style.cssText ="border:solid 1px black;margin:0;padding:0;overflow-y:auto;overflow-x:auto;background:white;text-aligbn:center;FONT-WEIGHT: normal;FONT-SIZE: 8pt;COLOR: #003399;FONT-FAMILY: Arial;TEXT-DECORATION: none";
var t = el.contentHTML;
t = t.replace(/<select/gi,'<ul');
t = t.replace(/<option/gi,'<li');
t = t.replace(/<\/option/gi,'</li');
t = t.replace(/<\/select/gi,'</ul');
mb.innerHTML = t;
el.select = mb.all.tags("ul")[0];
el.select.style.cssText="list-style:none;margin:0;padding:0;";
mb.options = el.select.getElementsByTagName("li");
for(var i=0;i<mb.options.length;i++)
{
mb.options[i].selectedIndex = i;
mb.options[i].style.cssText = "list-style:none;margin:0;padding:1px 2px;width/**/:100%;cursor:hand;cursorointer;white-space:nowrap;FONT-WEIGHT: normal;FONT-SIZE: 8pt;COLOR: #003399;FONT-FAMILY: Arial;TEXT-DECORATION: none";
mb.options[i].title =mb.options[i].innerHTML;
mb.options[i].innerHTML =mb.options[i].innerHTML ;
mb.options[i].onmouseover = function()
{
if( mb.options.selected ){mb.options.selected.style.background="white";mb.options.selected.style.color="#003399";}
mb.options.selected = this;
this.style.background="#333366";this.style.color="white";
};
mb.options[i].onmouseout = function(){this.style.background="white";this.style.color="black";};
mb.options[i].onmousedown = function(){selectMenu(this,this.innerHTML);};
mb.options[i].onkeydown = function(){selectMenu(this,this.innerHTML);};
if(i == el.contentIndex)
{
mb.options[i].style.background="#333366";
mb.options[i].style.color="white";
mb.options.selected = mb.options[i];
}
}
var mw = Math.max( ( el.select.offsetWidth + 22 ), el.offsetWidth + 22 );
mw = Math.max( mw, ( mb.scrollWidth+22) );
var mh = mb.options.length * 15 + 8 ;
var mx = (ie5)?-3:0;
var my = el.offsetHeight -2;
var docH = document.documentElement.offsetHeight ;
var bottomH = docH - el.getBoundingClientRect().bottom ;
mh = Math.min(mh, Math.max(( docH - el.getBoundingClientRect().top - 50),100) );
if(( bottomH < mh) )
{
mh = Math.max( (bottomH - 12),10);
if( mh <100 )
{
my = -100 ;
}
mh = Math.max(mh,100);
}
self.focus();
el.menu.show( mx , my , mw, mh , el);
sync=null;
if(mb.options.selected)
{
mb.scrollTop = mb.options.selected.offsetTop;
}
window.onresize = function(){el.menu.hide()};
}
function switchMenu()
{
if(event.keyCode)
{
if(event.keyCode==40){ el.contentIndex++ ;}
else if(event.keyCode==38){ el.contentIndex--; }
}
else if(event.wheelDelta )
{
if (event.wheelDelta >= 120)
el.contentIndex++ ;
else if (event.wheelDelta <= -120)
el.contentIndex-- ;
}else{return true;}
if( el.contentIndex > (el.contentOptions.length-1) ){ el.contentIndex =0;}
else if (el.contentIndex<0){el.contentIndex = el.contentOptions.length-1 ;}
var o = document.createElement("option");
o.value = el.contentOptions[el.contentIndex].value;
o.innerHTML = el.contentOptions[el.contentIndex].text;
while(el.options.length>0){el.options[0].removeNode(true);}
el.appendChild(o);
el.title = o.innerHTML;
}
if(dropdown_menu_hack.menu ==null)
{
dropdown_menu_hack.menu = window.createPopup();
document.attachEvent("onkeydown",dropdown_menu_hack.menu.hide);
}
el.menu = dropdown_menu_hack.menu ;
el.contentOptions = new Array();
el.contentIndex = el.selectedIndex;
el.contentHTML = el.outerHTML;
for(var i=0;i<el.options.length;i++)
{
el.contentOptions [el.contentOptions.length] =
{
"value": el.options[i].value,
"text": el.options[i].innerHTML
};
if(!el.options[i].selected){el.options[i].removeNode(true);i--;};
}
el.onkeydown = switchMenu;
el.onclick = showMenu;
el.onmousewheel= switchMenu;
}
JS代码就是这些,在单击,下拉和鼠标滚轮操作时,响应相关的函数,在页面里面需要在需要这样用的元素中加入onfocus="window.dropdown_menu_hack(this)"这么一句就OK了,下面是代码,我用的struts2的标签,记得一定要用层将你要改的select包裹起来
<!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><div id="pri">
<s:select name="deviceOwnedBy" id="deviceOwnedBy" list="deviceOwnedByList" listKey="value" listValue="value" headerKey="" headerValue="" cssClass="selectbox" style="width:150px;FONT-WEIGHT: normal;FONT-SIZE: 8pt;COLOR: #003399;FONT-FAMILY: Arial;TEXT-DECORATION: none" onfocus="window.dropdown_menu_hack(this)"></s:select>
</div>
分享到:
相关推荐
这个IFrame可以解决IE6中的z-index问题,使元素能够正确地遮挡住`<select>`。使用bgiframe时,需要引入jQuery库和bgiframe插件,并调用相应的方法将插件应用到目标元素上。 2. 创建透明IFrame:不依赖jQuery的情况...
总的来说,解决IE6下的Select覆盖Div问题需要根据实际情况灵活运用上述方法。在现代浏览器广泛使用的今天,虽然IE6的市场份额已经非常小,但考虑到部分用户可能还在使用,开发者仍需关注此类兼容性问题。在解决这类...
总之,解决"ie8-select滚动条"问题需要结合对CSS、JavaScript(尤其是jQuery和jQuery插件)的理解,以及对IE8浏览器特性的掌握。通过合理利用jQuery EasyUI和其他兼容IE8的库,可以创建出既美观又功能完备的下拉选择...
### 解决IE6环境下`select`元素的`title`属性无法正常显示的问题 在Web开发过程中,经常会遇到一些浏览器兼容性问题,特别是在处理老旧版本的Internet Explorer(IE)时更为明显。本文将针对一个特定的问题——如何...
< input id="text1" type="text" echange="echange" class="e_select" style="width: 100px;" etop="0" edata="{,普通:普通AA,模糊:模糊,右边模糊:右边模糊}"/> 构造方法在:input表单添加class="e_select"属性 ...
本文将深入探讨如何利用jQuery解决一个特定的问题:在IE6下,Select元素总是显示在具有较高z-index的图层(如div)之上。 首先,我们要理解z-index的概念。在CSS中,z-index是一个用于控制元素在垂直方向(即Z轴)...
在做下拉框select的时候用一个箭头符号,作为下拉框的三角,在firefox和chrome下均可以正常显示,但是在IE下无法显示。 查找了很久,发现是图片格式问题,把png格式的转换成gif的就没有问题了。。。。 附相关代码,...
总结来说,解决IE6下三级下拉菜单被`<select>`遮挡的问题主要通过以下两步: 1. 在下拉菜单元素之前插入一个透明的`<iframe>`,提高菜单的z-index层次。 2. 使用CSS控制菜单的布局和交互效果,包括定位、浮动、显示...
3. SELECT 元素覆盖问题:IE6-IE7 中存在 SELECT 元素不能被 div 覆盖的问题。解决办法是,使用 position 属性来解决这个问题。 4. CSS 样式大小写敏感:IE6-IE7 中 CSS 样式区分大小写。解决办法是,确保所有 CSS ...
总结来说,面对IE6中的`div`层被`select`控件遮住的问题,我们可以利用`iframe`作为遮罩,并通过设置`z-index`和动态调整`iframe`尺寸的方法来解决。虽然这个方法在现代浏览器中可能不再适用,但对于仍然需要支持IE6...
通过以上步骤,我们可以成功地使用`<iframe>`作为遮罩层,解决IE6下`<select>`无法被`<div>`遮盖的问题。值得注意的是,虽然这个方法在IE6中有效,但它并不适用于其他现代浏览器,因为这些浏览器已经修复了这个问题...
以上就是针对IE6下select元素被div等元素覆盖的常见解决方法。需要注意的是,由于IE6已经是一个非常老旧的浏览器,虽然在一些特定情况下仍然需要提供兼容支持,但在现代web开发中,更建议引导用户使用较新的浏览器...
- **配置与定制**:`select2`提供许多配置选项,例如`width`设置宽度,`minimumResultsForSearch`设置搜索门槛,`placeholder`设置占位符文本等。 - **模板与数据绑定**:如果你的数据源是动态的,可以使用`data`...
2. `.container` 类:这个类主要用于解决IE6、7下的高度和溢出问题。通过设置 `*overflow:hidden`,我们可以隐藏下拉菜单超出容器的部分,避免在某些情况下下拉选项列表显示不全。同时,`*position:relative` 设置让...
通过这种方式可以在不破坏其他浏览器兼容性的前提下解决IE6/7中的样式问题。 **示例**: ```css #select { width: 500px; /* DOM */ +width: 500px; /* for IE6/7 */ _width: 500px; /* for IE6 */ width: 500...
例如,我们可以使用`*html`或`_width`这样的前缀来专门针对IE浏览器设置样式。不过,对于IE6,由于其对CSS2的支持有限,可能无法实现所有复杂的美化效果,因此可能需要提供一个备选方案,如简单的无样式`select`或者...
- **兼容性处理**:为了确保代码能够在不同版本的IE浏览器中正常运行,开发者在生成隐藏的select容器时做了特殊处理。对于IE5.5以下版本,不会生成`<iframe>`元素,这是因为早期版本的IE可能无法正确支持`<iframe>`...
3. **配置选项**:Bootstrap Select提供了一系列配置选项,如`style`(选择器的样式),`width`(宽度),`liveSearch`(是否开启搜索过滤),`size`(默认显示的选项数量)等。这些选项可以通过在初始化时设置对象...
为了解决这个问题,开发者通常会采用 CSS Hack 技术,即编写特定的 CSS 规则来适应不同浏览器的解析方式,从而实现跨浏览器的兼容性。 首先,`!important` 是一种常见的 CSS Hack,它允许开发者设定某个样式在所有...
总结来说,jQuery提供了一种通过动态调整宽度来解决IE 6/7/8下下拉框select选项显示不全的问题。开发者可以根据具体项目需求,结合这个解决方案进行适当的修改和优化,以确保在各种浏览器环境下提供良好的用户体验。