Как скрыть a в меню с помощью CSS?


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

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

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

13 90

13 ответов:

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

EDIT: О да, я уже реализовал это в 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;" />' );
    }
};

EDIT 2: Вот как бы вы использовали эту функцию:

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

EDIT 3: добавлена дополнительная проверка, предложенная @user1521986

для HTML5 можно использовать атрибут 'hidden'.

<option hidden>Hidden option</option>

Это не поддерживается IE

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

ссылка.

Я бы предложил вам сделать не используйте решения, которые используют <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/

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

    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;" />');
        }
    };

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

функция toggleOption не идеальна и представила неприятные ошибки в моем приложении. jQuery будет запутаться .вал и. 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>

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

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

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

вот демо:http://jsfiddle.net/jYWrH/

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

обновление

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

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

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

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

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

вот демо:http://jsfiddle.net/jYWrH/1/

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

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

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

в качестве альтернативы, если вы можете, полностью удалить option элемент.

// Simplest way

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

$('select').change(function() {
    $('select').html(originalContent); //Restore Original Content
    $('select option[myfilter=1]').remove(); // Filter my options
});

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

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

!!! Внимание !!!

заменить второй "если "на" Пока " или не работает !

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

вы должны удалить их с <select> с помощью JavaScript. Это единственный гарантированный способ заставить их уйти.

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

$("#selectid span option").unwrap();
$("#selectid option:not([filterattr=filtervalue])").wrap('<span/>');

опоздал на игру, но большинство из них кажутся довольно сложными.

вот как я сделал это:

var originalSelect = $('#select-2').html();

// filter select-2 on select-1 change
$('#select-1').change(function (e) {

    var selected = $(this).val();

    // reset select ready for filtering
    $('#select-2').html(originalCourseSelect);

    if (selected) {
        // filter
        $('#select-2 option').not('.t' + selected).remove();
    }

});

разметка select-1:

<select id='select-1'>
<option value=''>Please select</option>
<option value='1'>One</option>
<option value='2'>Two</option>
</select>

разметка select-2:

<select id='select-2'>
<option class='t1'>One</option>
<option class='t2'>Two</option>
<option>Always visible</option>
</select>