Il modo migliore per deselezionare un <select> in jQuery?


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

Qual è il modo migliore, usando jQuery, per deselezionare elegantemente l'opzione?

Risposte:


348

Usa removeAttr ...

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

O Prop

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


60
Questa risposta non è il modo di fare le cose (e non funziona universalmente per l'avvio). Gli approcci corretti sono .val([])o .prop("selected", false)- scorrere verso il basso.
Jon,

1
JQuery deve aver risolto questo problema, funziona perfettamente per me in IE8 usando JQuery 1.7.2.
Mikey G,

2
O .val (['']) per selezionare l'eventuale valore vuoto.
Segna il

2
$("option:selected").prop("selected", false)a volte non funziona. (non funziona nel browser Chrome con jquery v1.4.2)
Rohit Goyani,

163

Ci sono molte risposte qui, ma sfortunatamente tutte sono piuttosto vecchie e quindi fanno affidamento su attr/ removeAttrche non è davvero la strada da percorrere.

@coffeeyesplease menziona correttamente che deve essere utilizzata una buona soluzione cross-browser

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

Un'altra buona soluzione cross-browser è

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

Puoi vederlo eseguire un test automatico qui . Testato su IE 7/8/9, FF 11, Chrome 19.


1
Molto meglio della risposta selezionata, (funziona su più browser e non comporta problemi con i set di attributi)
Timothy Groote

1
Risposta perfetta per deselezionare tutte le opzioni. Ma non può davvero essere utilizzato per deselezionare opzioni specifiche, mentre removeAttr può.
Mikey G,

2
@MikeyG: questo , notando che ha Array.indexOfbisogno di un polyfill per IE <9 (oppure puoi usare qualsiasi metodo equivalente fornito da molte librerie JS).
Jon,

1
Hai controllato l'HTML dopo $('#select').val([]);? Sfortunatamente, questo non rimuove l' selected="selected"attributo. Ciò potrebbe finire con la pubblicazione di dati errati. Non consiglio questo approccio!
Fr0zenFyr

1
@ Fr0zenFyr: se inizi con un'opzione preselezionata e la deselezioni manualmente con un clic del mouse, anche questo non rimuove l'attributo - e ovviamente l'invio del modulo è garantito per pubblicare i dati corretti. Esiste un mondo di differenza tra gli attributi HTML (che determinano lo stato iniziale) e le proprietà DOM (che determinano ciò che viene visualizzato e ciò che viene inviato). Questo è in effetti il ​​motivo per cui le soluzioni incentrate sull'attributo sono errate. L'attributo determina il valore iniziale della proprietà, ma è il massimo.
Jon,

24

È da un po 'che non lo chiedo, e non l'ho ancora testato su browser più vecchi, ma mi sembra che una risposta molto più semplice sia

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

.val () funziona anche con select http://api.jquery.com/val/


Questo è il modo migliore e cancella il valore nella maggior parte dei browser, grazie.
Sagive SEO,

Funziona solo con le selezioni multiple. $("select option").prop("selected", false);funziona universalmente (su selezioni multiple e singole).
splashout

23

Metodo più semplice

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

Ho semplicemente usato questo sulla selezione stessa e ha fatto il trucco.

Sono su jQuery 1.7.1 .


1
Ho appena affrontato un problema su questa soluzione. Il tag opzione avrà ancora l'attributo "selezionato"
Tamara

@Tamara Davvero? Non ho controllato. Stai usando "selezionato" per qualcosa e questo ti rovina le cose?
Joshua Pinter

19

Le risposte funzionano finora solo per selezioni multiple in IE6 / 7; per la selezione multipla più comune, è necessario utilizzare:

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

Questo è spiegato nel post collegato da flyfishr64. Se lo guardi, vedrai come ci sono 2 casi: multi / non-multi. Non c'è niente che ti impedisce di cantare entrambi per una soluzione completa:

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

7

Oh jquery.

Poiché esiste ancora un approccio javascript nativo, sento la necessità di fornirne uno.

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

E solo per mostrarti quanto è più veloce: benchmark


Grazie per questa risposta senza jQuery! :)
Saromase,

6
$("#selectID option:selected").each(function(){
  $(this).removeAttr("selected");
});

Ciò provocherebbe l'iterazione di ogni elemento e deselezionerebbe solo quelli selezionati


5

Un rapido google ha trovato questo post che descrive come fare ciò che desideri sia per gli elenchi a selezione singola che per quelli multipli in IE. Anche la soluzione sembra piuttosto elegante:

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

}); 

4
$("#select_id option:selected").prop("selected", false);

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

3

Grazie mille per la soluzione.

La soluzione per l'elenco combinato a scelta singola funziona perfettamente. L'ho trovato dopo aver cercato su molti siti.

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


2

Un altro modo semplice:

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


1

Di solito quando uso un menu di selezione, ogni opzione ha un valore associato. Per esempio

<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

Ora questo non rimuove l'attributo selezionato dall'opzione ma tutto ciò che voglio davvero è il valore.


0

Imposta un ID nella tua selezione, come:
<select id="foo" size="2">

Quindi puoi usare:
$("#foo").prop("selectedIndex", 0).change();

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.