A melhor maneira de desmarcar um <select> no jQuery?


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

Qual é a melhor maneira, usando o jQuery, para desmarcar a opção com elegância?

Respostas:


347

Use removeAttr ...

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

Or Prop

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

3
Não funciona no IE 8. Consulte stackoverflow.com/questions/7960773/…
Clinton Pierce

60
Esta resposta não é a maneira de fazer as coisas (e não funciona universalmente para inicializar). As abordagens corretas são .val([])ou .prop("selected", false)- role para baixo.
Jon

1
O JQuery deve ter corrigido isso. Está funcionando perfeitamente para mim no IE8 usando o JQuery 1.7.2.
Mikey G

2
OU .val (['']) para selecionar o valor vazio, se houver.
Mark

2
$("option:selected").prop("selected", false)às vezes não está funcionando. (não funciona no Chrome navegador com v1.4.2 jquery)
Rohit Goyani

163

Existem muitas respostas aqui, mas infelizmente todas elas são bastante antigas e, portanto, dependem attr/ o removeAttrque realmente não é o caminho a percorrer.

@coffeeyesplease menciona corretamente que uma boa solução entre navegadores deve usar

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

Outra boa solução entre navegadores é

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

Você pode vê-lo executar um autoteste aqui . Testado no IE 7/8/9, FF 11, Chrome 19.


1
Muito melhor do que a resposta de seleção, (funciona cross browser e não envolve mexer com os conjuntos de atributos)
Timothy Groote

1
Resposta perfeita para desmarcar todas as opções. Mas ele realmente não pode ser usado para desmarcar opções específicas, enquanto removeAttr pode.
Mikey G

2
@ MikeyG: Isso , observando que Array.indexOfprecisa de um polyfill para o IE <9 (ou você pode usar qualquer método equivalente fornecido por muitas bibliotecas JS).
18713 Jon

1
Você checou o HTML depois $('#select').val([]);? Infelizmente, isso não remove o selected="selected"atributo. Isso pode acabar postando dados incorretos. Eu não recomendo esta abordagem!
Fr0zenFyr

1
@ Fr0zenFyr: Se você inicia com uma opção pré-selecionada e a desmarca manualmente com um clique do mouse, isso também não remove o atributo - e, é claro, o envio do formulário garante a publicação de dados corretos. Há um mundo de diferença entre os atributos HTML (que determinam o estado inicial) e as propriedades DOM (que determinam o que é exibido e o que é enviado). Essa é, de fato, a razão pela qual as soluções focadas no atributo estão incorretas. O atributo determina o valor inicial da propriedade, mas é o mais longe possível.
21415 Jon

24

Já faz um tempo que pedimos, e eu não testei isso em navegadores antigos, mas me parece uma resposta muito mais simples:

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

.val () também funciona para select http://api.jquery.com/val/


Esta é a melhor maneira e, na verdade, limpa o valor na maioria dos navegadores - obrigado.
Sagive SEO

Isso funciona apenas para seleções múltiplas. $("select option").prop("selected", false);funciona universalmente (em seleções múltiplas e únicas).
splashout 22/10/19

23

Método mais simples

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

Simplesmente usei isso no próprio select e ele fez o truque.

Estou no jQuery 1.7.1 .


1
Acabei de enfrentar um problema com esta solução. Tag opção irá ainda ter atributo "selecionado"
Tamara

@Tamara Really? Eu não verifiquei. Você está usando "selecionado" para algo e isso atrapalha as coisas para você?
Joshua Pinter

19

Até agora, as respostas funcionam apenas para várias seleções no IE6 / 7; para a seleção não múltipla mais comum, você precisa usar:

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

Isso é explicado no post vinculado por flyfishr64. Se você olhar para ele, verá como existem 2 casos - multi / não-multi. Não há nada que o impeça de procurar uma solução completa:

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

7

Oh jquery.

Como ainda existe uma abordagem nativa de javascript, sinto a necessidade de fornecer uma.

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 apenas para mostrar o quanto mais rápido isso é: referência


Obrigado por esta resposta sem jQuery! :)
Saromase

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

Isso iria percorrer cada item e desmarcar apenas os que estão marcados


5

Um rápido google encontrou este post que descreve como fazer o que você deseja para listas de seleção únicas e múltiplas no IE. A solução também parece bastante 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

Muito obrigado pela solução.

A solução para a lista de combinação de escolha única funciona perfeitamente. Encontrei isso depois de pesquisar em muitos sites.

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


2

Outra maneira simples:

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


1

Normalmente, quando eu uso um menu de seleção, cada opção tem um valor associado. Por exemplo

<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

Agora, isso não remove o atributo selecionado da opção, mas tudo o que realmente quero é o valor.


0

Defina um ID no seu select, como:
<select id="foo" size="2">

Então você pode usar:
$("#foo").prop("selectedIndex", 0).change();

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.