`
tokyo2006
  • 浏览: 32265 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
最近访客 更多访客>>
社区版块
存档分类
最新评论

IE下select width的解决方式

阅读更多
开发过程中遇到这么一个问题有一个<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 , 1010, 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.replace(/<select/gi,'<ul');
= t.replace(/<option/gi,'<li');
= t.replace(/<\/option/gi,'</li');
= 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>    
分享到:
评论

相关推荐

    解决IE6 中select 穿透 div 等层的问题

    这个IFrame可以解决IE6中的z-index问题,使元素能够正确地遮挡住`&lt;select&gt;`。使用bgiframe时,需要引入jQuery库和bgiframe插件,并调用相应的方法将插件应用到目标元素上。 2. 创建透明IFrame:不依赖jQuery的情况...

    ie6下select覆盖div的解决办法

    总的来说,解决IE6下的Select覆盖Div问题需要根据实际情况灵活运用上述方法。在现代浏览器广泛使用的今天,虽然IE6的市场份额已经非常小,但考虑到部分用户可能还在使用,开发者仍需关注此类兼容性问题。在解决这类...

    ie8-select滚动条

    总之,解决"ie8-select滚动条"问题需要结合对CSS、JavaScript(尤其是jQuery和jQuery插件)的理解,以及对IE8浏览器特性的掌握。通过合理利用jQuery EasyUI和其他兼容IE8的库,可以创建出既美观又功能完备的下拉选择...

    解决ie6 select的title不能显示的问题

    ### 解决IE6环境下`select`元素的`title`属性无法正常显示的问题 在Web开发过程中,经常会遇到一些浏览器兼容性问题,特别是在处理老旧版本的Internet Explorer(IE)时更为明显。本文将针对一个特定的问题——如何...

    jQuery select小控件适用IE6、IE7、IE8

    &lt; input id="text1" type="text" echange="echange" class="e_select" style="width: 100px;" etop="0" edata="{,普通:普通AA,模糊:模糊,右边模糊:右边模糊}"/&gt; 构造方法在:input表单添加class="e_select"属性 ...

    Jquery 解决IE6 Select 框总是在图层(div)的上面显示的BUG

    本文将深入探讨如何利用jQuery解决一个特定的问题:在IE6下,Select元素总是显示在具有较高z-index的图层(如div)之上。 首先,我们要理解z-index的概念。在CSS中,z-index是一个用于控制元素在垂直方向(即Z轴)...

    IE下background背景图片无法显示问题解决方法

    在做下拉框select的时候用一个箭头符号,作为下拉框的三角,在firefox和chrome下均可以正常显示,但是在IE下无法显示。 查找了很久,发现是图片格式问题,把png格式的转换成gif的就没有问题了。。。。 附相关代码,...

    解决IE6下三级下拉菜单被select遮挡的问题.docx

    总结来说,解决IE6下三级下拉菜单被`&lt;select&gt;`遮挡的问题主要通过以下两步: 1. 在下拉菜单元素之前插入一个透明的`&lt;iframe&gt;`,提高菜单的z-index层次。 2. 使用CSS控制菜单的布局和交互效果,包括定位、浮动、显示...

    致WEB前端开发者:IE6-IE11兼容性问题列表及解决办法

    3. SELECT 元素覆盖问题:IE6-IE7 中存在 SELECT 元素不能被 div 覆盖的问题。解决办法是,使用 position 属性来解决这个问题。 4. CSS 样式大小写敏感:IE6-IE7 中 CSS 样式区分大小写。解决办法是,确保所有 CSS ...

    IE6下div层被select控件遮住的问题解决方法

    总结来说,面对IE6中的`div`层被`select`控件遮住的问题,我们可以利用`iframe`作为遮罩,并通过设置`z-index`和动态调整`iframe`尺寸的方法来解决。虽然这个方法在现代浏览器中可能不再适用,但对于仍然需要支持IE6...

    ie6 select无法被div遮盖的bug解决方法

    通过以上步骤,我们可以成功地使用`&lt;iframe&gt;`作为遮罩层,解决IE6下`&lt;select&gt;`无法被`&lt;div&gt;`遮盖的问题。值得注意的是,虽然这个方法在IE6中有效,但它并不适用于其他现代浏览器,因为这些浏览器已经修复了这个问题...

    IE6下Select元素被div等元素覆盖的解决办法

    以上就是针对IE6下select元素被div等元素覆盖的常见解决方法。需要注意的是,由于IE6已经是一个非常老旧的浏览器,虽然在一些特定情况下仍然需要提供兼容支持,但在现代web开发中,更建议引导用户使用较新的浏览器...

    select下拉菜单美化

    - **配置与定制**:`select2`提供许多配置选项,例如`width`设置宽度,`minimumResultsForSearch`设置搜索门槛,`placeholder`设置占位符文本等。 - **模板与数据绑定**:如果你的数据源是动态的,可以使用`data`...

    下拉菜单select样式设置(兼容IE6/IE7/IE8/火狐)

    2. `.container` 类:这个类主要用于解决IE6、7下的高度和溢出问题。通过设置 `*overflow:hidden`,我们可以隐藏下拉菜单超出容器的部分,避免在某些情况下下拉选项列表显示不全。同时,`*position:relative` 设置让...

    IE6兼容笔记

    通过这种方式可以在不破坏其他浏览器兼容性的前提下解决IE6/7中的样式问题。 **示例**: ```css #select { width: 500px; /* DOM */ +width: 500px; /* for IE6/7 */ _width: 500px; /* for IE6 */ width: 500...

    div+css select效果

    例如,我们可以使用`*html`或`_width`这样的前缀来专门针对IE浏览器设置样式。不过,对于IE6,由于其对CSS2的支持有限,可能无法实现所有复杂的美化效果,因此可能需要提供一个备选方案,如简单的无样式`select`或者...

    JavaScript模拟select

    - **兼容性处理**:为了确保代码能够在不同版本的IE浏览器中正常运行,开发者在生成隐藏的select容器时做了特殊处理。对于IE5.5以下版本,不会生成`&lt;iframe&gt;`元素,这是因为早期版本的IE可能无法正确支持`&lt;iframe&gt;`...

    bootstrap-select-1.12.4

    3. **配置选项**:Bootstrap Select提供了一系列配置选项,如`style`(选择器的样式),`width`(宽度),`liveSearch`(是否开启搜索过滤),`size`(默认显示的选项数量)等。这些选项可以通过在初始化时设置对象...

    ie6兼容bug总结

    为了解决这个问题,开发者通常会采用 CSS Hack 技术,即编写特定的 CSS 规则来适应不同浏览器的解析方式,从而实现跨浏览器的兼容性。 首先,`!important` 是一种常见的 CSS Hack,它允许开发者设定某个样式在所有...

    jQuery解决下拉框select设宽度时IE 6/7/8下option超出显示不全

    总结来说,jQuery提供了一种通过动态调整宽度来解决IE 6/7/8下下拉框select选项显示不全的问题。开发者可以根据具体项目需求,结合这个解决方案进行适当的修改和优化,以确保在各种浏览器环境下提供良好的用户体验。

Global site tag (gtag.js) - Google Analytics