Лучший способ отменить выбор <select> в jQuery?

219
<select size="2">
<option selected="selected">Input your option</option>
<option>Input your option</option>
</select>

Как лучше всего использовать jQuery, чтобы элегантно отменить выбор опции?

user198729
источник

Ответы:

348

Используйте removeAttr ...

$("option:selected").removeAttr("selected");

Или опора

$("option:selected").prop("selected", false)
Эй Маунг
источник
3
Не работает под IE 8. См. Stackoverflow.com/questions/7960773/…
Клинтон Пирс,
60
Этот ответ не способ делать вещи (и не работает универсально для загрузки). Правильные подходы либо .val([])или .prop("selected", false)- прокрутки вниз.
Джон
1
JQuery, должно быть, исправил это, он отлично работает для меня в IE8 с использованием JQuery 1.7.2.
Мики Г
2
ИЛИ .val (['']), чтобы выбрать пустое значение, если оно есть.
Марк
2
$("option:selected").prop("selected", false)иногда не работает. (не работает в браузере Chrome с JQuery v1.4.2)
Рохит Гояни
163

Здесь есть много ответов, но, к сожалению, все они довольно старые и поэтому полагаются на attr/ removeAttrчто на самом деле это не тот путь.

@coffeeyesplease правильно упоминает, что хорошим кросс-браузерным решением является использование

$("select").val([]);

Еще одно хорошее кросс-браузерное решение

// Note the use of .prop instead of .attr
$("select option").prop("selected", false);

Вы можете увидеть это запустить самопроверку здесь . Проверено на IE 7/8/9, FF 11, Chrome 19.

Джон
источник
1
Гораздо лучше, чем выборочный ответ, (работает в кросс-браузерном режиме и не требует работы с наборами атрибутов)
Тимоти Гроот
1
Идеальный ответ для отмены выбора всех вариантов. Но он не может быть использован для отмены выбора определенных опций, тогда как removeAttr может.
Майки Дж
2
@MikeyG: Это , учитывая, что Array.indexOfдля IE <9 требуется полифил (или вы можете использовать любой эквивалентный метод, который предоставляют многие библиотеки JS).
Джон
1
Вы проверяли HTML после $('#select').val([]);? К сожалению, это не удаляет selected="selected"атрибут. Это может в конечном итоге опубликовать неправильные данные. Я не рекомендую такой подход!
Fr0zenFyr
1
@ Fr0zenFyr: Если вы начнете с предварительно выбранной опции и отмените ее выбор вручную, щелкнув мышью, это также не удалит атрибут - и все же, конечно, отправка формы гарантирует публикацию правильных данных. Существует большая разница между атрибутами HTML (которые определяют начальное состояние) и свойствами DOM (которые определяют, что отображается и что отправляется). Это на самом деле причина, почему решения, ориентированные на атрибут, являются неправильными. Атрибут определяет начальное значение свойства, но это далеко не так.
Джон
24

Прошло много времени с тех пор, как меня спросили, и я не проверял это на старых браузерах, но мне кажется, что гораздо более простой ответ

$("#selectID").val([]);

.val () также работает для select http://api.jquery.com/val/

coffeeyesplease
источник
Это лучший способ, и он очищает значение в большинстве браузеров - спасибо.
Sagive SEO
Это работает только для множественного выбора. $("select option").prop("selected", false);работает универсально (на множественных и одиночных выборках).
выплеск
23

Самый простой метод

$('select').val('')

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

Я на jQuery 1.7.1 .

Джошуа Пинтер
источник
1
Я только столкнулся с одной проблемой об этом решении. Опциональный тег все еще будет иметь атрибут «выбранный»
Тамара
@ Тамара Правда? Я не проверял. Вы используете "выбранный" для чего-то, и это портит вам жизнь?
Джошуа Пинтер
19

Ответы пока работают только для множественного выбора в IE6 / 7; для более распространенного не множественного выбора вам нужно использовать:

$("#selectID").attr('selectedIndex', '-1');

Это объясняется в посте, связанном с flyfishr64. Если вы посмотрите на это, вы увидите, что есть 2 случая - мульти / не мульти. Ничто не останавливает вас от того, что вы хотите получить полное решение:

$("#selectID").attr('selectedIndex', '-1').find("option:selected").removeAttr("selected");
thetoolman
источник
7

Ой JQuery.

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

var select = document.querySelector('select'); //hopefully you'll use a better selector query
select.selectedIndex = 0; // or -1, 0 sets it to first option, -1 selects no options

И просто, чтобы показать вам, насколько это быстрее: бенчмарк

Блейн Кастен
источник
Спасибо за этот ответ без JQuery! :)
Саромаза
6
$("#selectID option:selected").each(function(){
  $(this).removeAttr("selected");
});

Это будет перебирать каждый элемент и отменять выбор только тех, которые отмечены

DinoMyte
источник
5

Быстрый гугл нашел этот пост, в котором описывается, как делать то, что вы хотите для одного и нескольких списков выбора в IE. Решение кажется довольно элегантным:

$('#clickme').click(function() {
        $('#selectmenu option').attr('selected', false);

}); 
Джефф Пакетт
источник
4
$("#select_id option:selected").prop("selected", false);
Premkumar
источник
3
$(option).removeAttr('selected') //replace 'option' with selected option's selector
Брэндон Генри
источник
3

Большое спасибо за решение.

Решение для комбинированного списка с одним выбором работает отлично. Я нашел это после поиска на многих сайтах.

$("#selectID").attr('selectedIndex', '-1').children("option:selected").removeAttr("selected");
Мадесваран Говиндан
источник
2
$("option:selected").attr("selected", false);
Чарли Браун
источник
2

Еще один простой способ:

$("#selectedID")[0].selectedIndex = -1

Рафаэль
источник
1

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

<select id="nfl">
  <option value="Bears Still...">Chicago Bears</option>
  <option selected="selected" value="Go Pack">Green Bay Packers</option>
</select>
console.log($('#nfl').val()) logs "Go Pack" to the console
Set the value to an empty string $('#nfl').val("")
console.log($('#nfl').val()) logs "" to the console

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

jtaz
источник
0

Установите идентификатор на ваш выбор, например:
<select id="foo" size="2">

Тогда вы можете использовать:
$("#foo").prop("selectedIndex", 0).change();

TheAlphaGhost
источник