Pareceu estranho não consegui encontrar este já perguntado, mas aqui vai!
Eu tenho um html da seguinte maneira:
<select id="select-meal-type" multiple="multiple">
<option value="1">Breakfast</option>
<option value="2">Lunch</option>
<option value="3">Dinner</option>
<option value="4">Snacks</option>
<option value="5">Dessert</option>
</select>
Como obtenho todos os valores (uma matriz?) Que o usuário selecionou em javascript?
Por exemplo, se o usuário selecionou Almoço e Lanches, quero uma matriz de {2, 4}.
Parece que deveria ser uma tarefa muito simples, mas não consigo fazer isso.
Obrigado.
javascript
jquery
html
Kyle
fonte
fonte
Respostas:
A maneira usual:
Dos documentos :
fonte
A menos que uma pergunta seja feita por JQuery, a pergunta deve ser respondida primeiro em javascript padrão, pois muitas pessoas não usam JQuery em seus sites.
De RobG Como obter todos os valores selecionados de uma caixa de seleção múltipla usando JavaScript? :
fonte
selectedOptions
? Não é cross-browser suficiente?Array.prototype.map.call(el.selectedOptions, function(x){ return x.value })
value
atributo, entãoopt.value
=opt.text
.Na verdade, descobri que a maneira melhor, mais sucinta, mais rápida e mais compatível de usar JavaScript puro (presumindo que você não precise dar suporte total ao IE lte 8) é a seguinte:
ATUALIZAÇÃO (14/02/2017):
Uma forma ainda mais sucinta usando ES6 / ES2015 (para os navegadores que o suportam):
fonte
Array.from(element.querySelectorAll("option:checked"),e=>e.value);
Array.from(element.selectedOptions).map(v=>v.value);
.checked
Isso funcionou para mim, em um menu suspenso de seleção múltipla, mas deve funcionar para todos os menus suspensos também$(".multiple_select > option:checked").each(function(){ console.log(this.value) });
Se você quiser seguir o caminho moderno, pode fazer o seguinte:
O
...
operador mapeia iterable (HTMLOptionsCollection
) para a matriz.Se você está interessado apenas nos valores, pode adicionar uma
map()
chamada:fonte
Primeiro, use
Array.from
para converter oHTMLCollection
objeto em uma matriz.fonte
$('#select-meal-type :selected')
irá conter uma matriz de todos os itens selecionados.
fonte
Atualização de outubro de 2019
O seguinte deve funcionar "autônomo" em todos os navegadores modernos sem quaisquer dependências ou transpilação.
fonte
Experimente isto:
Demo
rabeca
fonte
se quiser como expressou com intervalos após cada valor;
fonte
Se você precisar responder às mudanças, pode tentar o seguinte:
O
[].slice.call(e.target.selectedOptions)
é necessário porquee.target.selectedOptions
retorna umHTMLCollection
, não umArray
. Essa chamada o converte emArray
para que possamos então aplicar amap
função, que extrai os valores.fonte
Array.prototype.slice.call(field.querySelectorAll(':checked'))
Algo como o seguinte seria minha escolha:
É curto, é rápido em navegadores modernos e não nos importamos se é rápido ou não em navegadores de 1% do mercado.
Observe que o selectedOptions tem um comportamento instável em alguns navegadores há cerca de 5 anos, então um user agent sniff não está totalmente fora de linha aqui.
fonte
Você pode usar
selectedOptions
fonte
Funciona em qualquer lugar sem jquery:
fonte
selectedOptiongs
não é compatível com o IE