IE下select width的解決方式

          開發過程中遇到這么一個問題有一個<select></select>的選擇框,里面有個option的值很長大約128個字節,那么如果我不指定select的width時候,這個框就會很長,但是如果我限制了width那么這個option又顯示不全,這個BUG僅僅會在IE中出現,如何解決呢,其實可以把select的下拉框用一個層覆蓋掉,那個層會顯示完整的數據,而select的widt指定好,這樣整個頁面的布局都不會被影響。所有的操作都通過JS實現,下面我就把代碼貼出來。
          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包裹起來
          <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>    



          posted on 2010-05-25 11:57 Cloud kensin 閱讀(2028) 評論(3)  編輯  收藏 所屬分類: 其他

          評論

          # re: IE下select width的解決方式 2014-04-02 17:21 蒼天在上

          你好,我最近正好碰到一個ie8下的select問題,用的你的方法解決了,但是,select的級聯卻無法進行,請問你了解嗎?謝謝  回復  更多評論   

          # re: IE下select width的解決方式 2014-04-06 21:17 xinta

          @蒼天在上
          你如果要級聯的話就麻煩了,得通過onselect事件來觸發你要級聯select的選擇  回復  更多評論   

          # re: IE下select width的解決方式 2014-06-16 14:54 zzz

          能說的具體些嗎?我也碰到了@xinta
            回復  更多評論   

          <2010年5月>
          2526272829301
          2345678
          9101112131415
          16171819202122
          23242526272829
          303112345

          導航

          統計

          常用鏈接

          留言簿(4)

          隨筆分類

          相冊

          相冊

          搜索

          最新評論

          主站蜘蛛池模板: 来凤县| 屯留县| 库尔勒市| 泽库县| 安义县| 梧州市| 清水县| 凤庆县| 贡觉县| 洪湖市| 宜黄县| 固安县| 舟曲县| 揭东县| 安吉县| 嘉峪关市| 武冈市| 呼伦贝尔市| 江源县| 正定县| 永州市| 富川| 济源市| 开阳县| 中卫市| 阳高县| 武陟县| 北流市| 若羌县| 阜城县| 定远县| 双鸭山市| 上蔡县| 开封县| 米易县| 西华县| 太康县| 深州市| 格尔木市| 武功县| 枣庄市|