Как скрыть <option>в <select>меню с помощью CSS? - PullRequest
96 голосов
/ 11 февраля 2012

Я понял, что Chrome, похоже, не позволит мне скрыть <option> в <select>.Firefox будет.

Мне нужно скрыть <option> s, которые соответствуют критериям поиска.В веб-инструментах Chrome я вижу, что они правильно устанавливаются на display: none; моим JavaScript, но как только после этого нажимается меню <select>, они отображаются.

Как мне сделать эти <option> s?которые соответствуют моим критериям поиска НЕ ​​отображаются при нажатии на меню?Спасибо!

Ответы [ 13 ]

69 голосов
/ 11 февраля 2012

Вы должны реализовать два метода сокрытия. display: none работает для FF, но не для Chrome или IE. Таким образом, второй метод заключает в себе <option> в <span> с display: none. FF не сделает этого (технически недопустимый HTML, согласно спецификации), но Chrome и IE сделают это, и он скроет эту опцию.

РЕДАКТИРОВАТЬ: Ах да, я уже реализовал это в jQuery:

jQuery.fn.toggleOption = function( show ) {
    jQuery( this ).toggle( show );
    if( show ) {
        if( jQuery( this ).parent( 'span.toggleOption' ).length )
            jQuery( this ).unwrap( );
    } else {
        if( jQuery( this ).parent( 'span.toggleOption' ).length == 0 )
            jQuery( this ).wrap( '<span class="toggleOption" style="display: none;" />' );
    }
};

РЕДАКТИРОВАТЬ 2: Вот как бы вы использовали эту функцию:

jQuery(selector).toggleOption(true); // show option
jQuery(selector).toggleOption(false); // hide option

РЕДАКТИРОВАТЬ 3: Добавлена ​​дополнительная проверка, предложенная @ user1521986

57 голосов
/ 01 июля 2014

Для HTML5 вы можете использовать атрибут «скрытый».

<option hidden>Hidden option</option>

Это не поддерживается IE <11. Но если вам нужно только скрыть несколько элементов, может быть, было бы лучше просто установить скрытый атрибут в сочетании с отключенным по сравнению с добавлением / удалением элементы или не семантически правильные конструкции. </p>

<select>  
  <option>Option1</option>
  <option>Option2</option>
  <option hidden>Hidden Option</option>
</select>

Reference .

34 голосов
/ 27 июня 2014

Я бы посоветовал вам , а не использовать решения, использующие оболочку <span>, поскольку это недопустимый HTML, который может вызвать проблемы в будущем Я думаю, что предпочтительным решением является удаление любых параметров, которые вы хотите скрыть, и восстановление их по мере необходимости. Используя jQuery, вам понадобятся только эти 3 функции:

Первая функция сохранит исходное содержимое , выбрав . На всякий случай, вы можете вызвать эту функцию при загрузке страницы.

function setOriginalSelect ($select) {
    if ($select.data("originalHTML") == undefined) {
        $select.data("originalHTML", $select.html());
    } // If it's already there, don't re-set it
}

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

function removeOptions ($select, $options) {
    setOriginalSelect($select);
    $options.remove();
 }

Последняя функция может использоваться всякий раз, когда вы хотите «сбросить» все исходные параметры.

function restoreOptions ($select) {
    var ogHTML = $select.data("originalHTML");
    if (ogHTML != undefined) {
        $select.html(ogHTML);
    }
}

Обратите внимание, что все эти функции ожидают, что вы передаете элементы jQuery. Например:

// in your search function...
var $s = $('select.someClass');
var $optionsThatDontMatchYourSearch= $s.find('options.someOtherClass');
restoreOptions($s); // Make sure you're working with a full deck
removeOptions($s, $optionsThatDontMatchYourSearch); // remove options not needed

Вот рабочий пример: http://jsfiddle.net/9CYjy/23/

18 голосов
/ 26 декабря 2012

Ответ Райана П должен быть изменен на:

    jQuery.fn.toggleOption = function (show) {
        $(this).toggle(show);
        if (show) {
            if ($(this).parent('span.toggleOption').length)
                $(this).unwrap();
        } else {
            **if ($(this).parent('span.toggleOption').length==0)**
                $(this).wrap('<span class="toggleOption" style="display: none;" />');
        }
    };

В противном случае он будет заключен в слишком много тегов

9 голосов
/ 19 февраля 2013

Функция toggleOption не идеальна и привнесла неприятные ошибки в мое приложение. jQuery будет перепутан с .val () и .arraySerialize () Попробуйте выбрать варианты 4 и 5, чтобы понять, что я имею в виду:

<select id="t">
<option value="v1">options 1</option>
<option value="v2">options 2</option>
<option value="v3" id="o3">options 3</option>
<option value="v4">options 4</option>
<option value="v5">options 5</option>
</select>
<script>
jQuery.fn.toggleOption = function( show ) {
    jQuery( this ).toggle( show );
    if( show ) {
        if( jQuery( this ).parent( 'span.toggleOption' ).length )
            jQuery( this ).unwrap( );
    } else {
        jQuery( this ).wrap( '<span class="toggleOption" style="display: none;" />' );
    }
};

$("#o3").toggleOption(false); 
$("#t").change(function(e) {
    if($(this).val() != this.value) {
    console.log("Error values not equal", this.value, $(this).val());
    }
});
</script>
8 голосов
/ 11 февраля 2012

Выбрать входы сложно. Что же касается его отключения, это будет работать в кросс-браузерном режиме:

$('select').children(':nth-child(even)').prop('disabled', true);

Это отключит все остальные <option> элементы, но вы можете выбрать, какой из них вам нужен.

Вот демоверсия: http://jsfiddle.net/jYWrH/

Примечание: если вы хотите удалить свойство disabled элемента, вы можете использовать .removeProp('disabled').

Обновление

Вы можете сохранить элементы <option>, которые хотите скрыть, в скрытом элементе select:

$('#visible').on('change', function () {
    $(this).children().eq(this.selectedIndex).appendTo('#hidden');
});

Затем можно добавить элементы <option> обратно к исходному элементу выбора:

$('#hidden').children().appendTo('#visible');

В этих двух примерах ожидается, что видимый элемент select имеет идентификатор visible, а скрытый элемент select имеет идентификатор hidden.

Вот демоверсия: http://jsfiddle.net/jYWrH/1/

Обратите внимание, что .on() является новым в jQuery 1.7, и использование этого ответа такое же, как .bind(): http://api.jquery.com/on

6 голосов
/ 11 февраля 2012

Простой ответ: Вы не можете.Элементы формы имеют очень ограниченные возможности стилевого оформления.

Лучшей альтернативой будет установка опции disabled=true (и, возможно, серого цвета, поскольку только IE делает это автоматически), и это сделает эту опцию неактивной.

Либо, если можете, полностью удалите элемент option.

5 голосов
/ 30 июня 2014
// Simplest way

var originalContent = $('select').html();

$('select').change(function() {
    $('select').html(originalContent); //Restore Original Content
    $('select option[myfilter=1]').remove(); // Filter my options
});
4 голосов
/ 11 февраля 2012

Поскольку вы уже используете JS, вы можете создать скрытый элемент SELECT на странице, и для каждого элемента, который вы пытаетесь скрыть в этом списке, переместите его в скрытый список. Таким образом, они могут быть легко восстановлены.

Я не знаю способа сделать это в чистом CSS ... Я бы подумал, что отображение: ни один трюк не сработал бы.

2 голосов
/ 17 июля 2014

этот, кажется, работает для меня в Chrome

$("#selectid span option").unwrap();
$("#selectid option:not([filterattr=filtervalue])").wrap('<span/>');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...