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?

Réponses:


348

Utilisez removeAttr ...

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

Ou Prop

$("option:selected").prop("selected", false)

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.


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/


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 .


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

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


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


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

}); 


3
$(option).removeAttr('selected') //replace 'option' with selected option's selector

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


2

Un autre moyen simple:

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


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.


0

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

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

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.