Подтвердить что ты не робот

Нужен способ принудительного перерисовки <select> s в MSIE8

с (имитируемыми) медиа-запросами Меняю размер шрифта <select> на моей странице

У меня также проблемы с другими браузерами, но я решил временно отделить элементы от DOM и повторно подключить их через небольшое количество времени

но с MSIE8 у меня все еще есть проблемы с высотой <option>, которая равна максимальному набору fontSize, даже если он больше не применяется

http://fiddle.jshell.net/U3bzT/show/light/

ожидаемый результат:

font-size обновляется при переключении с большего размера шрифта на меньший

, но не строка-высота/высота <option> s

происходит как с select-multiple, так и с select-one

как я могу это исправить?

Примечание. <select> могут иметь прикрепленные события, поэтому Я не могу использовать копию

<script>

// just some code to simulate media query on/off state
var select;

setTimeout(function(){

    select = document.getElementsByTagName("select")[0];

    select.style.fontSize='40px';
    webkitFix();

    setTimeout(function(){
        select.style.fontSize='10px';
        webkitFix();
    },5000);

},5000);

function webkitFix(){
    document.body.removeChild(select);
    setTimeout(function(){ document.body.appendChild(select); }, 1);
}

</script>

<select multiple size="6" style="font-size:10px">
    <option>AAAAAA1</option>
    <option>BBBBBB2</option>
    <option>AAAAAA3</option>
    <option>BBBBBB4</option>
    <option>AAAAAA5</option>
    <option>BBBBBB6</option>
    <option>AAAAAA7</option>
    <option>BBBBBB8</option>
    <option>AAAAAA9</option>
</select>
4b9b3361

Ответ 1

Это и было большой головной болью для многих разработчиков на протяжении многих лет. Не существует обходного пути, который я когда-либо обнаружил, который исправил эту проблему, не используя альтернативную разметку вместе со смесями JS и CSS. Это связано с жесткостью дизайна окна выбора в Internet Explorer. После того как окно выбора было отображено с помощью <= IE8, изменение внешнего вида с помощью класса 'и/или JS на самом деле невозможно, как вы нашли. Даже изменение появления прямоугольников с CSS на рендеринге невероятно ограничено, и многие разработчики охотятся за альтернативами. К счастью, в более поздних версиях IE (из которых 8 намного лучше, чем 7, хотя все еще очень не хватает), выбор боксов намного более изменчив.

Я могу указать на несколько ресурсов, которые поддерживают это, ряд из которых находится в stackoverflow.

Множество вопросов, относящихся к этому, также остаются без ответа на SO, опять же по этой причине нет решения проблемы в том, как вы хотите ее решить.

Существует множество обходных решений, при условии, что все они включают в себя несколько следующих методов.

  • Использование <ul> 's, созданное для того, чтобы выглядеть как отдельные поля с javascript
  • Решения JS/jQuery, которые заменяют ящики выбора смесью вышеперечисленных и <div> решений

Для вашей конкретной проблемы вы окажетесь постоянно, стукнувшись головой о кирпичную стену, если вы не примете метод замены DOM для IE.

Некоторые ресурсы для вас, предлагающие решения, а также другие ответы здесь, в которых упоминается использование jQuery/javascript.

В заключение я боюсь, что вы проблема неразрешима без использования polyfill для IE или принятия общей стратегии замены блока выбора.

Ответ 2

(Примечание. Пожалуйста, проигнорируйте этот ответ, так как ваше изменение предполагает не использовать клон. Если кто-то сталкивается с этой проблемой и хочет пойти на клонирование, используйте это, поэтому я не удаляю свой ответ).

Если вам удастся поставить клон для выбора тега, даже если события привязаны, как только желаемый результат практически невозможен при текущей реализации. Вот подход с кодом.

Браузер отмечен: Chrome 28.0.0 Firefox 22.0 IE 7.0/8.0

  • Используется для выбора желаемого результата для клонирования.

CODE:

!DOCTYPE html>
<html>
<head>
  <meta http-equiv="content-type" content="text/html; charset=UTF-8">
  <title> - jsFiddle demo</title>

  <script type='text/javascript' src='/js/lib/dummy.js'></script> 

  <link rel="stylesheet" type="text/css" href="/css/result-light.css">

  <style type='text/css'>
  </style>    

<script type='text/javascript'>

window.onload=function(){
var select;

function webkitFix(){
    document.body.removeChild(select);
    setTimeout(function(){ document.body.appendChild(select); }, 1);
}

setTimeout(function(){
    select = document.getElementsByTagName("select")[0];        
    select.style.fontSize='40px';       
    webkitFix();


    setTimeout(function(){
    select.style.visibility = 'hidden';
    select1 = document.getElementsByTagName("select")[0];
    select1.style.visibility = 'visible';    
    select1.style.fontSize='10px';
    webkitFix();
    },5000);

},5000);
}     
</script>  

</head>
<body>
  <select id="one" multiple size="6" style="font-size:10px;">
    <option value="AAAAAA1">AAAAAA1</option>
    <option value="BBBBBB2">BBBBBB2</option>
    <option>AAAAAA3</option>
    <option>BBBBBB4</option>
    <option>AAAAAA5</option>
    <option>BBBBBB6</option>
    <option>AAAAAA7</option>
    <option>BBBBBB8</option>
    <option>AAAAAA9</option>
</select>

<select id="two" multiple size="6" style="font-size:10px; position:absolute; visibility:hidden;">
    <option value="AAAAAA1">AAAAAA1</option>
    <option value="BBBBBB2">BBBBBB2</option>
    <option>AAAAAA3</option>
    <option>BBBBBB4</option>
    <option>AAAAAA5</option>
    <option>BBBBBB6</option>
    <option>AAAAAA7</option>
    <option>BBBBBB8</option>
    <option>AAAAAA9</option>
</select>      
</body>  

Снимок экрана 1:

enter image description here

Снимок экрана 2:

enter image description here

Снимок экрана 3:

enter image description here

Ответ 3

Я пробовал так много вещей, height, line-height, offsetHeight, padding, margin, word-spacing, letter-spacing, white-space, text-indent, -ms-word-break, -ms-word-wrap, line-break и многие другие.. даже пытался понять IE hasLayout свойство и как сделайте некоторое обходное решение, эта ошибка/проблема IE8 кажется нефиксируемой.

Если вы не хотите использовать плагин, как это предлагал @DavidBarker, ни вы не хотите клонировать/копировать исходный раскрывающийся список, как то, что @Akki619, вот самое лучшее, что я мог бы придумать:

if($isIE8) {// alternative solution for IE8


    setTimeout(function() {
        var w = parseInt(select.style.width, 10);
        var h = parseInt(select.style.height, 10);
        // change select zoom rather than changing the font-size (since font-size is buggy)
        //select.style.fontSize = '40px';
        select.style.zoom = '400%';// almost equal to '40px'
        var longestOptionText = 1;
        // for the below, I used jquery to get the longest option text, you might replace it with some javascript
        $('select option').each(function() {
            var txtlen = $(this).text().length;
            if(txtlen > longestOptionText) {
                longestOptionText = txtlen;
            }
        });
        // -------- end of jquery usage
        select.style.width = (parseInt(select.style.fontSize, 10) * longestOptionText) + 'px';
        select.style.height = (parseInt(select.style.fontSize, 10) * longestOptionText) + 'px';
        setTimeout(function() {
            //select.style.fontSize = '10px';
            select.style.zoom = '100%';
            select.style.width = w + 'px';
            select.style.height = h + 'px';
        }, 5000);
    }, 5000);


} else {// all other browsers

    // keep your original code here..

}

Результат будет похож на то, что вы ожидаете, но теперь есть небольшая проблема, если масштаб увеличен до 100%, вертикальная панель скроллера не будет видна. Решение. Увеличьте высоту выбора, чтобы просмотреть все параметры.

Ответ 4

Попробуйте получить значение offsetHeight при выборе. Это заставляет перерисовать.