Найкращий спосіб зняти вибір <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.
Mikey G

2
АБО .val (['']), щоб вибрати порожнє значення, якщо воно є.
Марк

2
$("option:selected").prop("selected", false)іноді не працює. (не працює в хромованому браузері з jquery v1.4.2)
Rohit Goyani

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 може.
Mikey G

2
@MikeyG: Це , зауваживши, що Array.indexOfдля IE <9 потрібен поліфайл (або ви можете використовувати будь-який еквівалентний метод, який надає багато бібліотек JS).
Джон

1
Ви перевірили HTML після $('#select').val([]);? На жаль, цей selected="selected"атрибут не видаляється . Це може призвести до публікації неправильних даних. Я не рекомендую такий підхід!
Fr0zenFyr

1
@ Fr0zenFyr: Якщо ви почнете з попередньо вибраної опції і скасуєте її вручну за допомогою клацання миші, атрибут також не видалить - і, звичайно, подання форми гарантовано розмістить правильні дані. Існує різниця у світі між атрибутами HTML (які визначають початковий стан) та властивостями DOM (які визначають, що відображає та що надсилається). Це насправді причина, чому рішення, зосереджені на атрибуті, є неправильними. Атрибут визначає початкове значення властивості, але це настільки, наскільки це йде.
Джон

24

Минув час, коли я запитав, і я не перевіряв це на старих браузерах, але мені здається, набагато простішою відповіддю є

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

.val () працює і для вибору http://api.jquery.com/val/


Це найкращий спосіб і фактично очищує значення в більшості браузерів - дякую.
Пробачте SEO

Це працює лише для декількох виборів. $("select option").prop("selected", false);працює універсально (на мульти- та одиночному виборі).
плескіт

23

Найпростіший метод

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

Я просто використав це на селекції, і це зробило трюк.

Я на jQuery 1.7.1 .


1
Я просто зіткнувся з однією проблемою щодо цього рішення. Тег опціонів все одно матиме атрибут "вибрано"
Тамара

@Tamara Дійсно? Я не перевіряв. Чи використовуєте ви "вибране" для чогось, і це для вас псує речі?
Джошуа Пінтер

19

Поки відповіді працюють лише для декількох виборів у IE6 / 7; для більш розповсюдженого не-мультиселективного вибору потрібно використовувати:

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

Це пояснюється у посту, пов’язаному з flyfishr64. Якщо ви подивитесь на це, то побачите, як існує 2 випадки - мульти / не-мульти. Ніщо не заважає вам сканувати обидва на повне рішення:

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

7

О джикері.

Оскільки існує ще власний підхід до 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

Швидкий google знайшов цю публікацію, в якій описано, як робити те, що ви хочете, як для одиночних, так і для декількох списків вибору в 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.