¿La mejor manera de deseleccionar un <select> en jQuery?

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

¿Cuál es la mejor manera, usando jQuery, para deseleccionar elegantemente la opción?

usuario198729
fuente

Respuestas:

347

Utilice removeAttr ...

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

O apoyo

$("option:selected").prop("selected", false)
Ei Maung
fuente
3
No funciona bajo IE 8. Ver stackoverflow.com/questions/7960773/…
Clinton Pierce
6060
Esta respuesta no es la forma de hacer las cosas (y no funciona universalmente para arrancar). Los enfoques correctos son .val([])o .prop("selected", false)- desplácese hacia abajo.
Jon
1
JQuery debe haber solucionado esto. Funciona perfecto para mí en IE8 usando JQuery 1.7.2.
Mikey G
2
O .val (['']) para seleccionar el valor vacío si lo hay.
Mark
2
$("option:selected").prop("selected", false)A veces no funciona. (no funciona en el navegador Chrome con jquery v1.4.2)
Rohit Goyani
163

Hay un montón de respuestas aquí, pero por desgracia todos ellos son bastante antiguos y por lo tanto se basan en attr/ removeAttrque en realidad no es el camino a seguir.

@coffeeyesplease menciona correctamente que una buena solución para varios navegadores es usar

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

Otra buena solución de navegador cruzado es

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

Puedes verlo ejecutar una autocomprobación aquí . Probado en IE 7/8/9, FF 11, Chrome 19.

Jon
fuente
1
Mucho mejor que la respuesta de selección, (funciona en varios navegadores y no implica jugar con los conjuntos de atributos)
Timothy Groote
1
Respuesta perfecta para anular la selección de todas las opciones. Pero en realidad no se puede usar para anular la selección de opciones específicas, mientras que removeAttr sí.
Mikey G
2
@MikeyG: Esto , teniendo en cuenta que Array.indexOfnecesita un polyfill para IE <9 (o puede usar cualquier método equivalente que proporcionan muchas bibliotecas JS).
Jon
1
¿Revisaste el HTML después $('#select').val([]);? Desafortunadamente, esto no elimina el selected="selected"atributo. Eso puede terminar publicando datos incorrectos. ¡No recomiendo este enfoque!
Viernes04 de
1
@ Fr0zenFyr: si comienza con una opción preseleccionada y la desmarca manualmente con un clic del mouse, eso tampoco elimina el atributo, y, sin embargo, el envío del formulario garantiza la publicación de los datos correctos. Hay un mundo de diferencia entre los atributos HTML (que determinan el estado inicial) y las propiedades DOM (que determinan qué se muestra y qué se envía). De hecho, esta es la razón por la cual las soluciones que se centran en el atributo son incorrectas. El atributo determina el valor inicial de la propiedad, pero eso es todo lo posible.
Jon
24

Ha pasado un tiempo desde la pregunta, y no he probado esto en navegadores antiguos, pero me parece que una respuesta mucho más simple es

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

.val () funciona para select también http://api.jquery.com/val/

café síplease
fuente
Esta es la mejor manera y en realidad borra el valor en la mayoría de los navegadores, gracias.
Sagive SEO
Esto solo funciona para selecciones múltiples. $("select option").prop("selected", false);funciona universalmente (en selecciones múltiples y simples).
splashout
23

Método más simple

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

Simplemente usé esto en la selección en sí y funcionó.

Estoy en jQuery 1.7.1 .

Joshua Pinter
fuente
1
Acabo de enfrentar un problema con esta solución. La etiqueta de opción seguirá teniendo el atributo "seleccionado"
Tamara
@Tamara ¿En serio? No lo comprobé. ¿Estás usando "seleccionado" para algo y esto te confunde?
Joshua Pinter
19

Las respuestas hasta ahora solo funcionan para selecciones múltiples en IE6 / 7; para la selección no múltiple más común, debe usar:

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

Esto se explica en la publicación vinculada por flyfishr64. Si lo miras, verás cómo hay 2 casos: múltiple / no múltiple. No hay nada que lo detenga buscando ambas para una solución completa:

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

Oh jquery

Como todavía existe un enfoque de JavaScript nativo, siento la necesidad de proporcionar 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

Y solo para mostrarle cuánto más rápido es esto: punto de referencia

Blaine Kasten
fuente
¡Gracias por esta respuesta sin jQuery! :)
Saromase
6
$("#selectID option:selected").each(function(){
  $(this).removeAttr("selected");
});

Esto iteraría por cada elemento y deseleccionaría solo los que están marcados

DinoMyte
fuente
5

Un rápido google encontró esta publicación que describe cómo hacer lo que desea para las listas de selección única y múltiple en IE. La solución también parece bastante elegante:

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

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

Muchas gracias por la solución.

La solución para la lista combinada de opción única funciona perfectamente. Encontré esto después de buscar en muchos sitios.

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

Otra forma simple:

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

Rafael
fuente
1

Por lo general, cuando uso un menú de selección, cada opción tiene un valor asociado. Por ejemplo

<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

Ahora, esto no elimina el atributo seleccionado de la opción, pero todo lo que realmente quiero es el valor.

jtaz
fuente
0

Establezca una identificación en su selección, como:
<select id="foo" size="2">

Entonces puedes usar:
$("#foo").prop("selectedIndex", 0).change();

TheAlphaGhost
fuente