La meilleure façon de désélectionner un <select> dans jQuery?

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

Quelle est la meilleure façon, à l'aide de jQuery, de désélectionner élégamment l'option?

user198729
la source

Réponses:

348

Utilisez removeAttr ...

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

Ou Prop

$("option:selected").prop("selected", false)
Ei Maung
la source
3
Ne fonctionne pas sous IE 8. Voir stackoverflow.com/questions/7960773/…
Clinton Pierce
60
Cette réponse n'est pas la façon de faire les choses (et ne fonctionne pas universellement pour démarrer). Les bonnes approches sont soit .val([])ou .prop("selected", false)- faites défiler vers le bas.
Jon
1
JQuery a dû résoudre ce problème, cela fonctionne parfaitement pour moi dans IE8 en utilisant JQuery 1.7.2.
Mikey G
2
OU .val (['']) pour sélectionner la valeur vide le cas échéant.
Mark
2
$("option:selected").prop("selected", false)parfois ne fonctionne pas. (ne fonctionne pas dans le navigateur Chrome avec jquery v1.4.2)
Rohit Goyani
163

Il y a beaucoup de réponses ici, mais malheureusement toutes sont assez anciennes et s'appuient donc sur attr/removeAttr ce qui n'est vraiment pas la voie à suivre.

@coffeeyesplease mentionne correctement qu'une bonne solution multi-navigateur consiste à utiliser

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

Une autre bonne solution multi-navigateur est

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

Vous pouvez le voir exécuter un auto-test ici . Testé sur IE 7/8/9, FF 11, Chrome 19.

Jon
la source
1
Beaucoup mieux que la réponse choisie, (fonctionne sur plusieurs navigateurs et n'implique pas de jouer avec les jeux d'attributs)
Timothy Groote
1
Réponse parfaite pour désélectionner toutes les options. Mais il ne peut pas vraiment être utilisé pour désélectionner des options spécifiques, contrairement à removeAttr.
Mikey G
2
@MikeyG: Ceci , notant qu'il a Array.indexOfbesoin d'un polyfill pour IE <9 (ou vous pouvez utiliser n'importe quelle méthode équivalente fournie par de nombreuses bibliothèques JS).
Jon
1
Avez-vous vérifié le code HTML après $('#select').val([]);? Malheureusement, cela ne supprime pas l' selected="selected"attribut. Cela peut finir par afficher des données erronées. Je ne recommande pas cette approche!
Fr0zenFyr
1
@ Fr0zenFyr: Si vous commencez avec une option présélectionnée et que vous la désélectionnez manuellement avec un clic de souris, cela ne supprime pas l'attribut non plus - et pourtant, bien sûr, soumettre le formulaire est garanti pour publier des données correctes. Il existe un monde de différence entre les attributs HTML (qui déterminent l'état initial) et les propriétés DOM (qui déterminent ce qui s'affiche et ce qui est soumis). C'est en fait la raison pour laquelle les solutions axées sur l'attribut sont incorrectes. L'attribut détermine la valeur initiale de la propriété, mais c'est le plus loin possible.
Jon
24

Cela fait un moment qu'on ne m'a pas demandé, et je n'ai pas testé cela sur des navigateurs plus anciens mais il me semble qu'une réponse beaucoup plus simple

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

.val () fonctionne également pour select http://api.jquery.com/val/

coffeeyesplease
la source
C'est le meilleur moyen et efface réellement la valeur dans la plupart des navigateurs - merci.
Sagive SEO
Cela ne fonctionne que pour les sélections multiples. $("select option").prop("selected", false);fonctionne universellement (sur les sélections multiples et simples).
splashout
23

Méthode la plus simple

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

J'ai simplement utilisé cela sur la sélection elle-même et cela a fait l'affaire.

Je suis sur jQuery 1.7.1 .

Joshua Pinter
la source
1
Je viens de faire face à un problème avec cette solution. La balise d'option aura toujours l'attribut "sélectionné"
Tamara
@Tamara Vraiment? Je n'ai pas vérifié. Utilisez-vous "sélectionné" pour quelque chose et cela gâche les choses pour vous?
Joshua Pinter
19

Jusqu'à présent, les réponses ne fonctionnent que pour plusieurs sélections dans IE6 / 7; pour la sélection non multi plus courante, vous devez utiliser:

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

Ceci est expliqué dans le post lié par flyfishr64. Si vous le regardez, vous verrez comment il y a 2 cas - multi / non multi. Rien ne vous empêche de chanter les deux pour une solution complète:

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

Oh jquery.

Puisqu'il existe encore une approche javascript native, je ressens le besoin d'en fournir une.

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

Et juste pour vous montrer à quel point c'est plus rapide: benchmark

Blaine Kasten
la source
Merci pour cette réponse sans jQuery! :)
Saromase
6
$("#selectID option:selected").each(function(){
  $(this).removeAttr("selected");
});

Cela parcourrait chaque élément et désélectionnerait uniquement ceux qui sont cochés

DinoMyte
la source
5

Un rapide google a trouvé ce post qui décrit comment faire ce que vous voulez pour les listes de sélection simples et multiples dans IE. La solution semble également assez élégante:

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

}); 
Jeff Paquette
la source
4
$("#select_id option:selected").prop("selected", false);
premkumar
la source
3
$(option).removeAttr('selected') //replace 'option' with selected option's selector
Brandon Henry
la source
3

Merci beaucoup pour la solution.

La solution pour la liste combinée à choix unique fonctionne parfaitement. J'ai trouvé cela après avoir recherché sur de nombreux sites.

$("#selectID").attr('selectedIndex', '-1').children("option:selected").removeAttr("selected");
Madeswaran Govindan
la source
2
$("option:selected").attr("selected", false);
Charlie Brown
la source
2

Un autre moyen simple:

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

Rafael
la source
1

Habituellement, lorsque j'utilise un menu de sélection, chaque option a une valeur qui lui est associée. Par exemple

<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

Maintenant, cela ne supprime pas l'attribut sélectionné de l'option, mais tout ce que je veux vraiment, c'est la valeur.

jtaz
la source
0

Définissez un identifiant dans votre sélection, comme:
<select id="foo" size="2">

Ensuite, vous pouvez utiliser:
$("#foo").prop("selectedIndex", 0).change();

TheAlphaGhost
la source