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


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

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

Ответы:


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/


Это лучший способ, и он очищает значение в большинстве браузеров - спасибо.
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");

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

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


5

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

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

}); 



3

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

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

$("#selectID").attr('selectedIndex', '-1').children("option:selected").removeAttr("selected");



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

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


0

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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.