IE6、7、8 select下的option无法完全显示的解决方案

在IE6,7,8中,但一个select的option选项很长,但width又被限定的时候,option超过长度的部分无法显示。这个bug改的让人很蛋疼,可恨的IE系列,有这么多bug但是用率仍然很高。经过一天的探索,经过google和自己的反复修改测试,现总结出以下几种解决方案:

1、title法(IE6不支持)

  利用title属性展示出隐藏的option内容。

  如下所示:

<html>
<head>
<title>select的option无法完全展现问题</title>
 
<script>
 
function showTitle2(content){
    var obj = document.getElementById("test");
    obj.title = content ;
}
</script>

</head>
<body>
   <select id="test"   onmousemove="showTitle2(this[this.selectedIndex].innerHTML);" style="width:100px">
            <option >select的option无法完全展现问题</option>
            <option >select的option无法完全展现问题;select的option无法完全展现问题</option>
       </select>
</body>
</html>

 

2、在原有的select的上方新建一个select。

  

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

<script type="text/javascript">


function fixWidth(selectObj)
{
    //创建一个新的select
    var newSelectObj = document.createElement("select");
    newSelectObj = selectObj.cloneNode(true);
    newSelectObj.selectedIndex = selectObj.selectedIndex;
    newSelectObj.onmouseover = null;
    
    var e = selectObj;
    var absTop = e.offsetTop;
    var absLeft = e.offsetLeft;
    while(e = e.offsetParent)
    {
        absTop += e.offsetTop;
        absLeft += e.offsetLeft;
    }

    var len = selectObj.options.length ;
    var wid ="80px";
    var text1 ;
    for(var i=0 ; i <len ; i++ ){
        text1 = selectObj.options[i].text ;
        if( fucCheckLength(text1) > 7 ){
            wid = "auto" ;
            break ;
        }
    }
    
    with (newSelectObj.style)
    {
        position = "absolute";
        top = absTop + "px";
        left = absLeft + "px";
        var w =parseInt( width.substring(0,2) );
           width = wid ;
    }

    var rollback = function(){ 
        RollbackWidth(selectObj, newSelectObj); 
    };
    
    if(window.addEventListener)
    {
        newSelectObj.addEventListener("blur", rollback, false);
        newSelectObj.addEventListener("change", rollback, false);
    }
    else
    {
        newSelectObj.attachEvent("onblur", rollback);
        newSelectObj.attachEvent("onchange", rollback);
    }
    selectObj.style.visibility = "hidden";
    document.body.appendChild(newSelectObj);
    newSelectObj.focus();
}

function RollbackWidth(selectObj, newSelectObj)
{
    selectObj.selectedIndex = newSelectObj.selectedIndex;
    selectObj.style.visibility = "visible";
    document.body.removeChild(newSelectObj);
}


function fucCheckLength(strTemp)  
{  
     var i,sum;  
     sum=0;  
     for(i=0;i<strTemp.length;i++)  
     {  
      if ((strTemp.charCodeAt(i)>=0) && (strTemp.charCodeAt(i)<=255))  
       sum=sum+1;  
      else  
       sum=sum+2;  
     }  
     return sum;  
}  

</script>

</head>
<body>
    <form method="post">
        <div style="width: 80px; height: 100px; margin: 100px; padding: 10px; background: gray;">
            <select name="select1" id="select1" style="width: 80px;" onmouseover="fixWidth(this)">
                <option id="A" title="this is A">AAA</option>
                <option id="B" title="this is B">BBBBB</option>
                <option id="C" title="this is C">中国的地地道道的的淡淡的</option>
            </select>
        </div>
    </form>
</body>
</html>

有一个不足就是在其他代码部分如果对原select进行操作时可能会发生错误,毕竟这里是新建了一个对象。

3、span方法:

这个是最简单也是我认为最好的方法。

<span id="selectDiv"  style="width:100px;overflow-x:hidden;">
                         <select id="select1">
                             <option >解决ie6中的问题,美工不行,不好意思。</option>
                             <option >假如有一天高速不收费多好啊,假如有一天动车票价和公交车票一样多好啊。</option>
                        </select>
                   </span>

这里的关键在overflow-x:hidden这个设置。查看w3c教程,里面是这样解释的:

overflow-x : visible | auto | hidden | scroll

visible:不剪切内容也不添加滚动条。假如显式声明此默认值,对象将被剪切为包含对象的window或frame的大小。并且clip属性设置将失效

auto:此为body对象和textarea的默认值。在需要时剪切内容并添加滚动条

hidden:不显示超过对象尺寸的内容

scroll:横向显示滚动条

这里并不限定select的width,那么select会根据option的长度自适应;然后限定外层span的width,那么当select的option长度超过span的width时,因为overflow-x设置为hidden,所以超出的部分就被隐藏了。

 最关键的问题解决了,但是还有其它小麻烦:

进箱码头是个select,它的数据源是根据输入的船名动态加载的。当进箱码头外面的span设置为style="width:100px;overflow-x:hidden;"时,select的width就会根据加载的选项的长度动态调整,当加载的option长度大于100时没问题,但是如果小于100px,那么select的长度就会比标准的100px小,这样看起来就很不美观。解决方法如下:

首先设置select的宽度为固定的100px,然后在select中又添加了两个事件:

onmouseover="fixWidth()" onblur="setWidth()"

对应的方法是:

function fixWidth()
{
    var len = document.getElementById('berth').options.length;
    if( len != 0 ){
        document.getElementById('berth').style.width = "auto";    
    }
}

function setWidth()
{
    document.getElementById('berth').style.width = "100px" ;
}

当鼠标放在select上时就会将select的width设置为auto,这样就可以看到超过长度的部分;而当select失去焦点时,再将width设置为100px,这样就解决了以上问题。

当船名还没有输入时,如果鼠标一不小心滑到了select的上方,这个时候select的宽度就会变成0了,所以在fixWidth方法中要首先判断一下select中是否有option。同时要注意的是onblur事件是不能换成onmouseout的,如果换成此方法,会导致总是无法选中select中的option。

小结:

  忙活了一天,最终才找到第三种方法,这种方法既简单又适用;如果最早能找到这种方法就不需花这么多时间了,所以说有些小知识点虽然小,但关键时刻却能帮大忙啊!小到知识点积累起来了,就能成为技术上的大牛!

 

posted @ 2012-07-13 17:06  Vincent.Pei  阅读(2893)  评论(0编辑  收藏  举报