Как скрыть a в меню с помощью CSS?
я понял, что хром, похоже, не позволит мне спрятаться <option>
на <select>
. Firefox будет.
мне нужно скрыть <option>
s, которые соответствуют критериям поиска. В веб-инструментах Chrome я вижу, что они правильно настроены на display: none;
По моему JavaScript, но один раз тогда <select>
меню нажата они показаны.
как я могу сделать эти <option>
s, которые соответствуют моим критериям поиска, не отображаются при нажатии меню? Спасибо!
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>