Скрыть опцию выбора в IE, используя jQuery

49

В настоящее время я использую jQuery, чтобы скрыть/показать опции выбора, используя следующий код.

$("#custcol7 option[value=" + sizeValue + "]").hide();

Это отлично работает в Firefox, но не делает ничего хорошего в других браузерах. Как скрыть параметры от выбора в Chrome, Opera и IE?

  • 0
    Это хорошее прохождение решает проблему: fiddle.jshell.net/2tAqe
  • 1
    @Flo.:.: Это «работает», создавая недопустимую структуру DOM и надеясь, что браузер обрабатывает ее правильно. Плохой. Идея.
Показать ещё 2 комментария
Теги:
html-select

16 ответов

43

Я просто наткнулся на это и вместо того, чтобы клонировать весь выбор снова и снова, я просто заменил параметры, которые нужно скрывать с помощью элементов span и скрывать промежутки (хотя браузер не видел их в любом случае, я думаю) - вам может потребоваться изменить ваш код (если он сложный) для итерации по пролетам для сложной логики.

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

Этот код, очевидно, может быть рефакторирован и преувеличен.

http://fiddle.jshell.net/FAkEK/12/show/

РЕДАКТИРОВАТЬ № 2 (ИСПОЛЬЗУЙТЕ ЭТО ВМЕСТО): Мне пришло в голову, что вместо того, чтобы делать все это клонирование/ссылку/заменить дерьмо, просто оберните опцию с помощью span, скройте диапазон и нажмите покажите, просто замените диапазон с помощью опции снова.

http://fiddle.jshell.net/FAkEK/25/show/

  • 2
    Я могу подтвердить, что это решение! Хотя он не совместим с HTML5 , он действительно работает.
  • 0
    ты классный человек !! работает как шарм для меня! так что это означает, что show () на самом деле работает только hide () не работает в IE. Большое спасибо!
25

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

$.fn.optVisible = function( show ) {
    if( show ) {
        this.filter( "span > option" ).unwrap();
    } else {
        this.filter( ":not(span > option)" ).wrap( "<span>" ).parent().hide();
    }
    return this;
}

Протестировано с помощью (long live BrowserStack):

  • Windows XP: IE 6.0, Firefox 3.0, Safari 4.0, Opera 10.0, Chrome 14.0
  • Windows 8: IE 10.0 Metro
  • iOS 3.2 (iPad), iOS 6.0 (iPhone 5)
  • Android 1.6 (Sony Xperia X10)

jsfiddle

  • 4
    Будьте осторожны при использовании .val () в селекторе с этим методом, потому что он вернет скрытое значение вместо выбранного. jsfiddle
  • 2
    Упрощенно: fiddle.jshell.net/FAkEK/312
9

Нет, это не поддерживается в IE (и, предположительно, не в Chrome или Opera). Вам нужно будет удалить все варианты и добавить их позже, если вы хотите, чтобы они были действительно невидимыми. Но в большинстве случаев простой disabled="disabled" должен быть достаточным и сложнее, чем обработка удаления и добавления параметров.

  • 0
    IIRC, вы не можете отключить опции в IE6 или IE7 (было исправлено в IE8) webbugtrack.blogspot.com/2007/11/…
  • 31
    Duuummbbb !!! Я ненавижу IE со страстью. Они ничего не могут сделать правильно !! Наполненные текстовые поля и поля паролей по умолчанию даже не имеют одинаковую ширину без видимой причины !? Закругленные углы не работают? Ничто не выравнивается должным образом ... Я не понимаю !!
Показать ещё 4 комментария
8

попробуйте отсоединить(). вы можете повторно подключить его позже, если необходимо, с помощью append() или insertAfter()

  • 0
    интересно ... не знал об этой функциональности :-)
  • 1
    Проблема в том, что если вы хотите скрыть определенные параметры в середине меню, слишком много усилий, чтобы попытаться вставить их обратно в исходные места.
5

Для удаления параметров используйте:

var opt=$("option").detach();

Чтобы показать параметры, используйте:

opt.appendTo( "select" );
  • 0
    Кажется, это правильный HTML и простое элегантное решение. opt будет массивом элементов option которые могут быть добавлены обратно к элементу select с помощью appendTo. Я хотел бы, чтобы этот ответ мог быть увеличен или выбран как лучший ответ, так как другие решения там просто отбросили меня на некоторое время, и действительный или прямой. Спасибо Сачин.
3

Просто удалите его и сохраните в var в JavaScript. Вы можете просто создать новый объект, когда вам это понадобится позже.

В противном случае попробуйте атрибут disabled, упомянутый выше.

  • 0
    отключено не поддерживается в IE 7
  • 0
    IE 7 10 лет ... мы должны его поддержать?
Показать ещё 3 комментария
2

то, как вы это сделали, должно работать в chrome, но nvm.Here это другой способ

select = $('#custcol7');
select.find('option[value=["'+sizeValue +'"]').remove();

и если вы хотите снова показать его:

select.append('<option value="'+sizeValue+'"></option>');

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

var options = '<option value="'+sizeValue1+'"></option><option value="'+sizeValue2+'"></option><option value="'+sizeValue3+'"></option>';

select.append(options);

Таким образом, если вам нужно удалить/добавить несколько мест, вы только набрали параметры один раз. Надеюсь, я дал еще один интересный вариант. С наилучшими пожеланиями.

2
/**
* Change visibility of select list option elements
* @param  {boolean}   stateVal      show hidden options if true; hide it otherwise. If not setted then toggle visibility, based on it current state
*/
$.fn.toggleOptionVisibility = function (stateVal) {
    var isBool = typeof stateVal === "boolean";
    return this.each(function () {
         var $this = $(this);
         if (isBool) {
             if (stateVal) $this.filter("span > option").unwrap();
             else $this.filter(":not(span > option)").wrap("<span>").parent().hide();
         }
         else {
             $this.filter("span > option").toggleOptionVisibility(true);
             $this.filter(":not(span > option)").toggleOptionVisibility(false);
        }
    });
};
  • 0
    Это просто более точный плагин на основе @nrodic версии. Протестировано здесь: fiddle.jshell.net/HRMrB
  • 0
    Работает отлично. Спасибо!
Показать ещё 1 комментарий
1

Вы можете использовать комбинации var $opt=$('select>option').clone() и $('select option[value="'+val+'"').remove(). Есть еще один пример: попробуйте это. https://jsfiddle.net/sherali/jkw8fxzf/12/

var $secondOption= $('#second-choice>option').clone();

$("#first-choice").change(function() {
    var userSelected = $(this).val();

    $('#second-choice').html($secondOption);
    $('#second-choice option[value="'+userSelected+'"').remove()
});
1

Мой выбор немного отличается от других ответов.

Цель состоит не в том, чтобы скрывать параметры, а просто заставлять их отключать (чтобы поддерживать согласованный интерфейс).

Мой сценарий:

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

Решение:

Нагрузка:

Если браузер IE7, то при заполнении выбранных и отключенных уже выбранных параметров на других выбирает, я добавляю настраиваемый атрибут к опции ( "data-ie7-disabled" ), а также изменяя цвет отключенных опций до " #cccccc '(который является стандартным цветом для отключенных опций). Это делает пользовательский интерфейс одинаковым в браузерах.

Вкл. Изменение:

Я сохраняю предыдущий параметр в локальной переменной (это сохраняется в фокусе).

Когда пользователь пытается изменить параметр

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

  • Когда пользователь выбирает параметр, который уже выбран (параметр, который имеет серый цвет). Я проверяю, имеет ли этот параметр этот пользовательский атрибут. Если в нем есть > , я просто возвращаю вариант предыдущему с сообщением об ошибке "Этот параметр уже выбран или BLAH BLAH".

  • Когда пользователь изменяет свой существующий вариант на совершенно новую опцию, которая не выбрана ни в каком другом выпадающем меню. Я снова перебираю все остальные параметры выбора и удаляю цвет на нем, а также настраиваемый атрибут.

Надеюсь, это поможет.

1

Также существует метод .load:

s_parent.change(function(){
   s_child.load('./fetch_options.php",{'v',s_parent.val()});
}

"fetch_options.php" script будет просто печатать теги параметров на основе любого используемого источника данных и передаваемого родительского значения.

  • 0
    Эта техника AJAX, как я обнаружил, действительно очень хорошо работает и решает все проблемы несоответствия браузера (за небольшую плату за очередной вызов на сервер).
0

В IE 11 (Edge) работает следующий код.

 $("#id option[value='1']").remove();

и вернуться назад,

$('<option>').val('1').text('myText').appendTo('#id');
0

Вы также можете заменить html внутри select.

Html:

<input id="Button1" type="button" value="hide option" />

<select id="foo">
<option >stuff</option>
<option >stuff2</option>
</select>

Jquery:

    $("#Button1").change(function () {
       $('#foo').html('<option >stuff</option>');
    });

Не то, что вы хотите, но, возможно, это помогает. Для небольших выпадающих меню это определенно проще.

  • 0
    Вот рабочая jsfiddle для этого: - jsfiddle.net/bj5fqj11
0

используя решение, предоставленное AuthorProxy, оно отлично работает для IE, но когда я пытаюсь сделать .val() в раскрывающемся списке в firefox, я получаю некоторые фанковые значения, которые не имеют никакого смысла. Я изменил их вариант, чтобы включить специфические функции браузера, скрыть/показать работы для firefox.

$.fn.toggleOptionVisibility = function (stateVal) {
    var isBool = typeof stateVal === "boolean";
    return this.each(function () {
        var $this = $(this);
        if (navigator.userAgent.indexOf('MSIE') > -1 || navigator.userAgent.indexOf('Trident') > -1) {
            if (isBool) {
                if (stateVal) $this.filter("span > option").unwrap();
                else $this.filter(":not(span > option)").wrap("<span>").parent().hide();
            }
            else {
                $this.filter("span > option").toggleOptionVisibility(true);
                $this.filter(":not(span > option)").toggleOptionVisibility(false);
            }   
        }
        else {              
            if (isBool) {
                $this.show();
            }
            else {
                $this.hide();
            }
        }
    });
};
0

Вам нужно будет удалить его, а затем добавить его снова для Internet Explorer.

Чтобы удалить:

$("#custcol7 option[value=" + sizeValue + "]").remove();

Чтобы добавить:

$("#custcol7").append( "<option value='sizeValue'>sizeValue</option>" );

Обратите внимание, что вам нужно иметь sizeValue также в тексте опции, чтобы фактически увидеть что-то.

0

Вы можете использовать это:

$("#custcol7 option[value=" + sizeValue + "]").css({display:'none'});

Он отлично работает во всех браузерах, кроме Safari и Opera. Я ищу еще одно лучшее решение:)

  • 0
    Это не работает в IE тоже.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню