Ширината на опциите за избор на HTML се изрязва в IE. Някакви решения?

В браузъри Mozilla и не-IE, ако опцията за списък за избор е с по-голяма дължина от ширината на избора, тя ще се покаже. Но в IE ще изреже опцията до ширината на избраното.

Има ли някакъв начин поведението на избор на IE да бъде като това на браузърите, които не са IE?


person Shyju    schedule 19.06.2009    source източник
comment
с коя версия на IE имаш проблем?   -  person dan richardson    schedule 19.06.2009
comment
Този въпрос е задаван и преди. Вижте тук: stackoverflow.com/questions/73960/dropdownlist-width-in -ie, stackoverflow.com/questions/294040/ и stackoverflow.com/questions/682764/   -  person mercator    schedule 20.06.2009
comment
По мое мнение (и мнението на много други) вече не трябва да поддържате IE6. idroppedie6.com   -  person Christian    schedule 29.07.2009
comment
@Christian - Въпреки че съм съгласен с принципа, понякога това не е опция или защото клиентът настоява, или потребителите все още работят с IE6 (имах няколко до съвсем скоро).   -  person monkeypushbutton    schedule 21.01.2010


Отговори (11)


Това изглежда работи добре, като принуждава IE да преоцени избраната ширина. Работи в IE7 и IE8.

if (jQuery.browser.msie) {
    jQuery("#" + selectID).css("width", "100%").css('width', 'auto');
}
person peter    schedule 22.07.2010
comment
Мисля, че $.browser е премахнат - person rthbound; 08.03.2013

css:

.set_width { width:120px; }

html:

<select class="set_width"><option>one</option><option>two</option></select>
person Steve Mallory    schedule 19.06.2009
comment
Това ще ограничи до 120 px, какво ще стане, ако моята опция има повече дължина от тази? - person Shyju; 19.06.2009
comment
Е, по подразбиране всяко поле за избор е да расте до ширината, от която се нуждае. Ако това е така, че трябва да поддържате, може изобщо да не искате да коригирате ширината му. - person ajm; 19.06.2009

Харесвам решението на 26design, но има 2 недостатъка:

  1. При някои обстоятелства е възможно да се задейства събитието mouseover два пъти, което води до настройка на променливата origWidth на „автоматично“, което предотвратява връщането на избрания към оригиналния размер.

  2. Ако текстовите стойности в падащото меню не се нуждаят от допълнително пространство, тогава избраното всъщност се свива, което изглежда странно.

Тази версия коригира и двата проблема:

if($.browser.msie) {
    /* IE obscures the option text for fixed-width selects if the text 
     * is longer than the select. To work around this we make the width 
     * auto whenever the drop down is visible.
     */
    $("select.fixed-width").livequery(function(){
        /* Use mousedown rather than focus because the focus event gets 
         * interrupted and the dropdown does not appear 
         */
        $(this)
        .mousedown(function(){
            if($(this).css("width") != "auto") {
                var width = $(this).width();
                $(this).data("origWidth", $(this).css("width"))
                       .css("width", "auto");
                /* if the width is now less than before then undo */
                if($(this).width() < width) {
                    $(this).css("width", $(this).data("origWidth"));
                }
            }
        })
        /* Handle blur if the user does not change the value */
        .blur(function(){
            $(this).css("width", $(this).data("origWidth"));

        })
        /* Handle change of the user does change the value */
        .change(function(){
            $(this).css("width", $(this).data("origWidth"));

        });
    });
}

Тестван в IE6-8

person Simon Dyson    schedule 18.05.2010
comment
$.browser е премахнат - person rthbound; 08.03.2013
comment
Все още не съм надстроил до JQuery 1.9, така че не съм се сблъсквал с този проблем. Не мисля, че съм съгласен с решението за премахване на $.browser. Откриването на функции е за предпочитане, но не винаги е възможно при някои странни грешки в IE (като този), така че трябва да прибягвате до откриване на браузъра. - person Simon Dyson; 09.03.2013

Поставих в клетка на таблица, просто се опитвах да запазя същата ширина като клетката.

$("#id" ).width($("#id" ).parent().width());

btw, благодаря за всички публикации, помага ми много.

person bkuo    schedule 05.01.2012

Добре, така че ето решението, което разбрах след доста време. Той автоматично ще увеличи размера на полето за избор въз основа на максималната ширина на дъщерните опции.

<script type="text/javascript">
  window.onload = function()
  {
    var elem = document.getElementById('test');
    var values = elem.length;
    var biggest_value = 0;
    var biggest_option = '';

    for(var i = 0; i <= values; i++)
    {
      if (elem.options[i])
      {
        var len = elem.options[i].value.length;
      }

      if (biggest_value < len)
      {
        biggest_value = len;
        biggest_option = elem.options[i];
      }
    }

    document.getElementById('test').style.width = biggest_option.offsetWidth + 'px';

};
</script>

Полето за избор:

<select id="test">
 <option value="Hello">Hello</option>
 <option value="Hello Again">Hello Again</option>
 <option value="Hello Yet Again">Hello Yet Again</option>
</select>
person Sarfraz    schedule 18.12.2009
comment
Благодаря, използвам този пример, за да задам ширината на моето поле за избор с най-широката опция... добре е да знаете offsetWidth! - person kiev; 25.02.2010

Абсолютно най-лесният начин да се уверите, че списъците за избор винаги са точно толкова широки, колкото трябва, е да позволите на браузъра да задава тяхната ширина, т.е. не задавайте ширина сами. Този „метод“ (всъщност не-метод, тъй като включва неда се прави нещо) ще работи на всеки браузър, правен някога, дори IE6.

person Martha    schedule 07.01.2010

Имам решение, което работи за мен, така че реших да продължа и да го публикувам (с някои предупреждения в долната част). Това не е най-ефективното използване на jQuery, сигурен съм, но работи както искам. По принцип имам списък с часови зони, които (очевидно) са доста дълги текстови низове.

<!--[if IE]>
<script type="text/javascript">
    $(document).ready(function() {
        $("select.timeZone")
        .mouseover(function() {
            $(this)
                .data("origWidth", $(this).css("width"))
                .css("width", "auto")
                .focus();
        })
        .mouseout(function() {
            $(this)
                .blur(function() {
                    $(this).css("width", $(this).data("origWidth"));
                })
                .change(function() {
                    $(this).css("width", $(this).data("origWidth"));
                })
        });
    });
</script>
<![endif]-->

Описание:

  • Условно зададен само за браузъри IE.
  • Това решение е модифицирана версия на скрипт, предоставен от Chris Coyier (http://css-tricks.com/select-cuts-off-options-in-ie-fix/).
  • Също така, това решение предполага, че вие, като мен, всъщност не се интересувате толкова много от IE6. Основната функционалност е налице, така че браузърите IE6 все още могат да виждат повечето от опциите за избор, да изпращат формуляра и т.н., но не мога да губя повече време, опитвайки се да успокоя тази малка подгрупа.

Предупреждения:

  • Списъкът за избор има фиксирана ширина, преди да бъде фокусиран.
  • При излизане от мишката списъкът трябва да бъде замъглен или променен, преди размерът да бъде върнат на първоначалната фиксирана ширина. Причината, поради която се уверих, че списъкът за избор е замъглен или променен първо, е, че преди това onmouseout се задействаше веднага щом мишката напусне полето за избор (което означава, че можете да опитате да изберете опция, но те ще изчезнат, преди да можете да щракнете върху една ).
  • Обратно, при преминаване на мишката фокусът е зададен, за да се увери, че събитието за замъгляване се задейства правилно.
person 26design    schedule 21.01.2010

Ето друг подход, който работи за мен:

<style>
select.limited-width {
    width: 200px;
    position: static;
}

select.expanded-width {
    width: auto;
    position: absolute;
}
</style>

<select class="limited-width" 
        onMouseDown="if(document.all) this.className='expanded-width';"
        onBlur="if(document.all) this.className='limited-width';"
        onChange="if(document.all) this.className='limited-width';">

    <option>A normal option</option>
    <option>A really long option which messes everything up</option>
</select>

Като превключите към position:absolute, вие премахвате елемента от потока на страницата, което помага, ако откриете, че вашето поле за избор се движи, когато го разгънете.

Избрах да разчитам на надушването на document.all като проверка за IE, тъй като го поддържа компактен и избягва необходимостта от отделна функция. Ако това не работи за вас, дефинирайте функция в условните коментари на IE и я извикайте вместо това.

Една малка грешка, ако изберете същия елемент, той няма да се свие отново, докато не преместите фокуса върху друг елемент, аз го наричам функция ;-)

person simoncoggins    schedule 17.02.2010

for (i=1;i<=5;i++){
       idname = "Usert" + i;
       document.getElementById(idname).style.width = "100%";

}

Използвах този начин, за да покажа падащия списък, когато ширината не е показана правилно.

Работи за IE6, Firefox и Chrome.

person keong    schedule 04.05.2011
comment
Това не променя факта, че публикацията му може да помогне на някого. Знаете ли, хората все още могат да търсят в Google тази страница - дори след дълго време... - person biphobe; 22.08.2011

Имам select в клетките на таблицата и следният код свърши работа за мен:

.myClass{
   width: 100%;//most of browsers
   _width: auto;//ie6 hack
}

наздраве

person Damien Goor    schedule 31.08.2011

Най-доброто решение, описано тук: http://www.dougboude.com/blog/1/2008/05/Viewing-Option-Text-in-IE7-thats-Wider-than-the-Select-List.cfm

person Stud Muffler    schedule 23.10.2012
comment
Добре дошли в Stack Overflow! Въпреки че теоретично това може да отговори на въпроса, би било за предпочитане да включите основните части от отговора тук и да предоставите връзката за справка. - person Jack; 23.10.2012