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

Ошибка Chrome при выпадающем списке элементов, когда скрывается множество опций

Я ищу обходное решение для ошибки рендеринга в Chrome. Он появляется, когда элемент выбора имеет около 90% + скрытых элементов. В Chrome высота раскрывающегося списка становится слишком короткой для использования. Это не похоже на другие браузеры. Показать пример на jsFiddle.

img

HTML Example
Note: Some options were removed to keep the code brief.
The bug does not show up unless all options are present.

100 Options, 90% Hidden:<br>
<select>
<option value="">Select an Option</option>
<option value="0" style="display: none">Option 0</option>
<option value="1" style="display: none">Option 1</option>
<option value="2" style="display: none">Option 2</option>
<option value="3" style="display: none">Option 3</option>
<!-- Options removed for brevity. -->
<option value="86" style="display: none">Option 86</option>
<option value="87" style="display: none">Option 87</option>
<option value="88" style="display: none">Option 88</option>
<option value="89" style="display: none">Option 89</option>
<option value="90">Option 90</option>
<option value="91">Option 91</option>
<option value="92">Option 92</option>
<option value="93">Option 93</option>
<option value="94">Option 94</option>
<option value="95">Option 95</option>
<option value="96">Option 96</option>
<option value="97">Option 97</option>
<option value="98">Option 98</option>
<option value="99">Option 99</option>
</select>

Проверены браузеры:

  • Chrome 27 и 28 (Fail)
  • Firefox 21 (Pass)
  • IE 9 (Pass)
  • Opera 12 (Pass)
  • Safari 5.1 (Pass)

Показать пример в jsFiddle
Альтернативный пример ссылки

Обновление: Я читал по этому вопросу, и, видимо, варианты не должны быть скрыты в пределах выбора. Вы можете отключить опции, но они не исчезнут. Если вы не хотите, чтобы опция была вообще выбрана, вы должны полностью удалить node. Возможность скрыть параметры не работает полностью кросс-браузер, и в большинстве случаев вы можете продолжать выбирать "скрытые" параметры с помощью клавиш со стрелками. Мне нужно включать и выключать опции, что делает это неудобным для моей конкретной ситуации, но это, по-видимому, единственный метод, который будет работать до сих пор.

4b9b3361

Ответ 1

Добавление этого можно считать обходным путем:

 $(document).ready(function () {

    $('#ph2').mouseenter(function () {

      var html = '';

        $(this).find('option').each(function () {

            if ($(this).css('display') !== 'none') {

                html = html + '<option>' + $(this).text() + '</option>';   
            }
        });

        $(this).html(html);
    })
});

Здесь jsFiddle; Я использую jquery просто для простоты. В этом случае я просто переделываю HTML на mouseenter. Это не идеально, но это может заставить вас идти дальше. Также обратите внимание, что ph2 настроен как div в вашем HTML; Я думаю, вы должны установить его как элемент выбора с самого начала, и на скрипке вы увидите изменение, которое я сделал для html. Но в целом, пока ошибка не будет исправлена, я думаю, что что-то вроде этого будет так же близко, как и у вас есть рабочий вариант.

Ответ 2

У меня была эта проблема, и вот что я сделал:

var originalSelect = $("#the_select").clone();

function hideSomeOptions(){
  $('#the_select .hide_me').remove();
}

function restoreAllOptions(){
  $("#the_select").replaceWith(originalSelect[0]);
}

Вход для выбора цели имеет идентификатор "the_select", а опции или группы optgroups, которые нужно переключить, имеют класс "hide_me".

Ответ 3

Я обнаружил, что порядок скрытых/видимых параметров имеет значение. Это похоже на хромовые остановки, подсчитывающие высоту для раскрывающегося списка по первой скрытой опции. Один из способов - переместить показанные опции в начало выбора. Если вы используете jquery примерно так.

var select = "select#MySelect";
$(select).children("option").hide();  //hide all options
$(select).children("Selector for items to show").each(function(idx, elm) {
           $(elm).parent().prepend(elm);  //move item to the top of parent
});
$(select).children("Selector for items to show").show(); //show selected options

Ответ 4

В качестве обходного пути для этой ошибки я могу предложить следующее решение:

  • Чтобы скрыть параметр "конвертировать" его в какой-либо другой тег и скрыть его с помощью .hide().
  • Чтобы показать вариант "конвертировать" его обратно в option и показать его с помощью .show().

Для "преобразования" нам нужно что-то вроде этого: fooobar.com/questions/111486/....

Пример:

// some `replaceTagName` implementation here

// hiding options
$('.option-selector').replaceTagName('span').hide();

// showing options
$('.option-selector').replaceTagName('option').show();

Немного тяжело, но работает:)

Ответ 5

Я столкнулся с той же проблемой (Chrome 40) и обнаружил, что для меня хорошо работает следующий обходной путь.

var originalOptions = [];

$(document).ready(function(){
    originalOptions = $("yourSelect").children("option");

    $("someElement").someEvent(function(){
        $("yourSelect").children("option").remove();
        $(originalOptions).each(function(){
            if(/*criteria here*/){$("yourSelect").append($(this));}
        });
    });
});

Ответ 6

Лучшее решение - добавить в конце последнего

<option></option> в выбранном элементе. Добавьте этот код:

<optgroup></optgroup>

Это добавит пустой элемент группы, и на данный момент это лучший простой и быстрый FIX для этого редкого BUG.

Спасибо!