с дисплеем:нет; не работает на IE
у меня есть несколько style='display:none'
в элементе option он хорошо работает в Chrome, и я понимаю, что он не работает в IE.
<select>
<option style="display:none;">One</option>
<option>Two</option>
<option style="display:none;">Three</option>
<option>Four</option>
</select>
используя jQuery, как пройти через опцию, чтобы найти display:none
и удалить элементы <option>
?
5 ответов
это, кажется, работает для меня:
$('select option').each(function(){
if(this.style.display == 'none')
{
$(this).remove();
}
});
решение Джона Бокера является правильным для этого вопроса. Но у этого есть обратная сторона, что вы никогда не сможете получить эти параметры, как только вы их удалили.
одним из решений является сохранение полного HTML <select>
перед снятием <option>
теги.
var $s = $('select');
$s.data("originalHTML", $s.html());
теперь вы можете легко восстановить, изменив это:$s.html($s.data("originalHTML"));
полная информация об этом решении: https://stackoverflow.com/a/24439289/1766230
также пример:http://jsfiddle.net/luken/9CYjy/
у меня была та же проблема , но немного сложная, и да, нам нужно удалить опцию, чтобы скрыть в IE/Chrome/Safari.
но в некоторых случаях мы хотим просто скрыть группа опций на основе критериев / фильтра и remove()
просто удаляет. У меня есть следующее решение этой проблемы. Он удаляет параметры, но сохраняет удаленный параметр в атрибуте данных на том же select
элемент и при желании мы просто повторно заполнить в заданном порядке сортировки ( значение или метку).
допустим:
<select id='sorty' multiple=true>
<option value="1">Group A</option>
<option value="2">Group B</option>
<option value="3">Group c</option>
<option value="4">Group D</option>
<option value="5">Group D</option>
</select>
<button onclick="HideG('A')">Hide Group A</button>
<button onclick='HideG("B")'>Hide Group B</button>
<button onclick='HideG("C")'>Hide Group C</button>
<button onclick='HideG("D")'>Hide Group D</button>
<button onclick='ShowAll()'>Show ALL</button>
(требуется Jquery):
function selectOptionFilter(src,filter,sortBy)
{
if(!$(src).data('hiddenOpts'))
$(src).data('hiddenOpts',[]);
//re-insert while keeping sort order by value or label
$($(src).data('hiddenOpts')).each(function(){
var hiddenOpt=this;
var positioned=false;
$(src).find('option').each(function(i){
if((sortBy=='value' && $(this).attr('value')*1 > $(hiddenOpt).attr('value'))
||
(sortBy=='label' && $(this).text() > $(hiddenOpt).text())
){
$(this).before(hiddenOpt);
positioned=true;
//break
return false;
}
});
//else append
if(!positioned){
$(src).append(hiddenOpt);
}
});
//clean the hidden list
$(src).data('hiddenOpts',[]);
//apply the filter and remove options
if( typeof filter=='function'){
$(src).find('option').filter(filter).each(function(){
$(src).data('hiddenOpts').push($(this).remove());
});
}
}
function HideG(xname){
selectOptionFilter($('#sorty'),function(){
return ( $(this).text().indexOf(xname) > -1);
},'value');
}
function ShowAll(){
selectOptionFilter($('#sorty'),function(){ return false;},'value');
}
вы можете передать более сложную функцию фильтра, чтобы удалить нужные параметры.
сегодня у меня была такая же проблема. Без удаления нежелательных опций вы не получите ожидаемого результата. Но проблема в том, что вам нужно запомнить эти параметры, если вы хотите, чтобы отобразить их позже.
мое решение очень простое и работает во всех основных браузерах:
function filterList(oList, rxSearch)
{
// Create backup of the old option list (only once)
if(typeof(oList.tagOptions) === "undefined")
{
// Save current options
oList.tagOptions = [ ]; // Generate a dynamic property for this DOM object
for(var i = 0; i < oList.options.length; ++i)
oList.tagOptions.push(oList.options[i]);
}
// Clear the current option list
while(oList.options.length)
oList.options.remove(0);
// Add only those options which match the regular expression
for(var i = 0; i < oList.tagOptions.length; ++i)
{
if(rxSearch.test(oList.tagOptions[i].text))
oList.options.add(oList.tagOptions[i]);
}
}
фокус в том, что элементы option будут скопированы в динамически созданное свойство tagOptions при первом запуске. Поскольку все еще будут ссылки (в tagOptions) на эти удален параметр DOM-элементы, они не будут освобождены. Кроме того, для этого не нужны глобальные переменные. Позже видимые параметры (oList.опции) будут очищены и добавлены только те опции, которые соответствуют поисковому термину.
используя следующий HTML код:
<select id="myList" size="10">
<option>apple</option>
<option>advocado</option>
<option>banana</option>
<option>coconut</option>
</select>
вы бы назвали это так:
filterList(document.getElementById("myList"), /^a/i); // Display only those elements, which start with an a
alert("Display all with a");
filterList(document.getElementById("myList"), /^b/i); // Display only those elements, which start with an b
alert("Display all with b");
filterList(document.getElementById("myList"), /^/i); // Display only those elements, which start with an c
alert("Display all");
я протестировал это с Firefox, Internet Explorer 11, Chrome и Opera. Это отлично работает для моего цели.
function filterList(oList, rxSearch)
{
// Create backup of the old option list (only once)
if(typeof(oList.tagOptions) === "undefined")
{
// Save current options
oList.tagOptions = [ ]; // Generate a dynamic property for this DOM object
for(var i = 0; i < oList.options.length; ++i)
oList.tagOptions.push(oList.options[i]);
}
// Clear the current option list
while(oList.options.length)
oList.options.remove(0);
// Add only those options which match the regular expression
for(var i = 0; i < oList.tagOptions.length; ++i)
{
if(rxSearch.test(oList.tagOptions[i].text))
oList.options.add(oList.tagOptions[i]);
}
}
filterList(document.getElementById("myList"), /^a/i); // Display only those elements, which start with an a
alert("Display all with a");
filterList(document.getElementById("myList"), /^b/i); // Display only those elements, which start with an b
alert("Display all with b");
filterList(document.getElementById("myList"), /^/i); // Display only those elements, which start with an c
alert("Display all");
<select id="myList" size="10">
<option>apple</option>
<option>advocado</option>
<option>banana</option>
<option>coconut</option>
</select>
Display: none will not work foe IE11
I had same issue for search in select option
What I did is disabled the un matched options and the hide them.
After this I have sorted the options to show only enabled options on top.
The code I have written is pasted below - please try to understand the logic I hope it will work
чтобы отключить параметры, используйте
$("#addselect option")attr('disabled', 'disabled').hide
and to again enable it use
$("#addselect option").removeAttr('disabled').show();
sort by disabled options.
$("#addselect option").each(function (i, val) {
if ($(this)[i].disabled) {
moveDown("selectId");
}
else {
moveUp("selectId");
}
}
function moveUp(selectId) {
var selectList = document.getElementById(selectId);
var selectOptions = selectList.getElementsByTagName('option');
for (var i = 1; i < selectOptions.length; i++) {
var opt = selectOptions[i];
if (!opt.disabled) {
selectList.removeChild(opt);
selectList.insertBefore(opt, selectOptions[i - 1]);
}
}
}
function moveDown(selectId) {
var selectList = document.getElementById(selectId);
var selectOptions = selectList.getElementsByTagName('option');
for (var i = selectOptions.length - 2; i >= 0; i--) {
var opt = selectOptions[i];
if (opt.disabled) {
var nextOpt = selectOptions[i + 1];
opt = selectList.removeChild(opt);
nextOpt = selectList.replaceChild(opt, nextOpt);
selectList.insertBefore(nextOpt, opt);
}
}
}