¿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?

Respuestas:


347

Utilice removeAttr ...

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

O apoyo

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


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.


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/


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 .


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

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


¡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


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

}); 


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

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


2

Otra forma simple:

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


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.


0

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

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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.