Qual é o melhor método para adicionar opções a um <select>
objeto JavaScript usando jQuery?
Estou procurando algo que não precise de um plug-in para fazer, mas também estaria interessado nos plug-ins disponíveis.
Isto é o que eu fiz:
selectValues = { "1": "test 1", "2": "test 2" };
for (key in selectValues) {
if (typeof (selectValues[key] == 'string') {
$('#mySelect').append('<option value="' + key + '">' + selectValues[key] + '</option>');
}
}
Uma solução limpa / simples:
Esta é uma versão limpa e simplificada do matdumsa's :
$.each(selectValues, function(key, value) {
$('#mySelect')
.append($('<option>', { value : key })
.text(value));
});
Alterações de matdumsa: (1) removeu a tag close da opção dentro de append () e (2) moveu as propriedades / atributos para um mapa como o segundo parâmetro de append ().
javascript
jquery
arrays
html-select
Darryl Hein
fonte
fonte
value
nisso, uma vez que é uma string (e codificada) que não precisa ser citada.Respostas:
O mesmo que as outras respostas, da maneira jQuery:
fonte
$("#mySelect")
a um var, caso contrário, chamar$("#mySelect")
toda vez que o loop for muito inútil, assim como atualizar o DOM. Veja os pontos 3 e 6 em artzstudio.com/2009/04/jquery-performance-rules/…var mySelect = $("#mySelect") outside of the
cada loop. Isso seria muito mais eficiente. Veja a resposta de Carl abaixoattr
etext
são realmente métodos da$('<option/>')
-objectDessa forma, você "toca no DOM" apenas uma vez.
Não tenho certeza se a última linha pode ser convertida em $ ('# mySelect'). Html (output.join ('')) porque não conheço elementos internos do jQuery (talvez faça alguma análise no html () método)fonte
key
houver algumas aspas ou>, <
nele.Isso é um pouco mais rápido e limpo.
fonte
jQuery
JavaScript de baunilha
fonte
Option
objeto antes. Isso está embutido em todos os navegadores?new Option
, mas descobri que não funcionava no IE6 e 7. Não tenho uma razão para isso, mas muitas das opções completas do jQuery funcionaram.new Option('display', value, true)
new Option('display', value, true, true)
( javascriptkit.com/jsref/select.shtml )Se você não precisa oferecer suporte a versões antigas do IE, usar o
Option
construtor é claramente o caminho a seguir, uma solução legível e eficiente :É uma funcionalidade equivalente a, mas mais limpa que:
fonte
Isso parece melhor, fornece legibilidade, mas é mais lento que outros métodos.
Se você deseja velocidade, a maneira mais rápida (testada!) É essa, usando a matriz, não a concatenação de cadeias e usando apenas uma chamada anexada.
fonte
Um refinamento da resposta de @ joshperry mais antiga :
Parece que .append simples também funciona conforme o esperado,
ou mais curto,
fonte
$.weakmap
para permitirGC
map()
construção, combinada com a propriedade deappend()
para adicionar uma matriz de objetos corretamente!Todas essas respostas parecem desnecessariamente complicadas. Tudo o que você precisa é:
Isso é completamente compatível com vários navegadores.
fonte
new Option(value, key);
? A ordem dos parâmetros é Opções (text_visible_part, value_behind_the_scenes).Esteja avisado ... estou usando o jQuery Mobile 1.0b2 com PhoneGap 1.0.0 em um telefone Android 2.2 (Cyanogen 7.0.1) (T-Mobile G2) e não consegui obter o método .append () para funcionar. Eu tive que usar .html () da seguinte maneira:
fonte
Fiz alguns testes e, acredito, isso faz o trabalho mais rápido. : P
fonte
Existe uma abordagem usando a abordagem Microsoft Templating que está atualmente sob proposta para inclusão no núcleo do jQuery. Há mais poder no uso do modelo; portanto, para o cenário mais simples, pode não ser a melhor opção. Para mais detalhes, consulte a publicação de Scott Gu, descrevendo os recursos.
Primeiro, inclua o arquivo js do modelo, disponível no github .
Próxima configuração de um modelo
Em seguida, com seus dados, chame o método .render ()
Eu escrevi sobre essa abordagem em mais detalhes.
fonte
Eu fiz algo parecido com isto, carregando um item suspenso via Ajax . A resposta acima também é aceitável, mas é sempre bom ter o mínimo de modificação do DOM possível para obter melhor desempenho.
Portanto, em vez de adicionar cada item dentro de um loop, é melhor coletar itens dentro de um loop e anexá-lo assim que estiver concluído.
Anexá-lo,
ou melhor ainda
fonte
A maneira mais simples é:
fonte
A maioria das outras respostas usa a
each
função para iterar sobre oselectValues
. Isso requer que o apêndice seja chamado para cada elemento e um reflow é acionado quando cada um é adicionado individualmente.A atualização dessa resposta para um método funcional mais idiomático (usando JS moderno) pode ser formada para chamar
append
apenas uma vez, com uma matriz deoption
elementos criados usando o mapa e umOption
construtor de elementos.O uso de um
Option
elemento DOM deve reduzir a sobrecarga da chamada de função, pois ooption
elemento não precisa ser atualizado após a criação e a lógica de análise do jQuery não precisa ser executada.Isso pode ser simplificado ainda mais se você criar uma função de utilitário de fábrica que atualizará um objeto de opção:
Então isso pode ser fornecido diretamente para
map
:Formulação anterior
Como
append
também permite a passagem de valores como um número variável de argumentos, podemos pré-criar a lista deoption
elementos mapeados e anexá-los como argumentos em uma única chamada usandoapply
.Parece que nas versões posteriores do jQuery,
append
também aceita um argumento de matriz e isso pode ser simplificado um pouco:fonte
Funciona bem com o jQuery 1.4.1.
Para obter o artigo completo sobre o uso de listas dinâmicas com o ASP.NET MVC e o jQuery, visite:
Listas de seleção dinâmica com MVC e jQuery
fonte
Há um problema de classificação com esta solução no Chrome (jQuery 1.7.1) (o Chrome classifica as propriedades do objeto por nome / número?) Então, para manter a ordem (sim, é um abuso de objeto), mudei isso:
para isso
e então o $ .each se parecerá com:
fonte
Em vez de repetir o mesmo código em todos os lugares, sugiro que seja mais desejável escrever sua própria função jQuery como:
Em seguida, para adicionar uma opção, faça o seguinte:
fonte
Você pode simplesmente iterar sua matriz json com o seguinte código
$('<option/>').attr("value","someValue").text("Option1").appendTo("#my-select-id");
fonte
Embora as respostas anteriores sejam todas válidas - pode ser aconselhável anexar todas elas a um documentFragmnet primeiro e depois anexar esse fragmento de documento como um elemento após ...
Veja os pensamentos de John Resig sobre o assunto ...
Algo ao longo das linhas de:
fonte
$.each
é mais lento que umfor
loop$("#mySelect").append();
Portanto, a melhor solução é a seguinte
Se os dados JSON
resp
foremuse-o como
fonte
Ainda outra maneira de fazer isso:
fonte
$('#mySelect')
resposta @rocktheroad então reformulado ... seja qual for, esta é a solução mais práticaIsso manipula o DOM apenas uma vez após a construção de uma cadeia gigante.
fonte
$("#myselect").empty().append(opts);
comgetElementById('myselect').innerHtml = opts;
Isso é o que eu fiz com matrizes bidimensionais: A primeira coluna é item i, adicione a
innerHTML
do<option>
. A segunda coluna é record_id i, adicione àvalue
do<option>
:PHP
JavaScript / Ajax
fonte
Um plugin do jQuery pode ser encontrado aqui: Preenchimento automático de caixas de seleção usando jQuery e AJAX .
fonte
Eu achei que isso é simples e funciona muito bem.
fonte
O formato JSON:
E o código jQuery para preencher os valores para o sucesso do menu suspenso no Ajax:
fonte
Usando a função $ .map (), você pode fazer isso de uma maneira mais elegante:
fonte
fonte
Defina seu ID de seleção HTML na seguinte linha abaixo. Aqui
mySelect
é usado como o ID do elemento de seleção.obtenha o objeto que é o selectValues neste cenário e o defina no jquery para cada loop. Ele usará o valor e o texto dos objetos de acordo e o anexará nas seleções de opções da seguinte maneira.
Isso exibirá o texto como a lista de opções quando a lista suspensa estiver selecionada e uma vez que o texto seja selecionado, o valor do texto selecionado será usado.
Por exemplo.
"1": "teste 1", "2": "teste 2",
Suspenso,
nome para exibição: teste 1 -> o valor é 1 nome para exibição: teste 2 -> o valor é 2
fonte
Na verdade, para obter o desempenho aprimorado, é melhor fazer a lista de opções separadamente e anexar para selecionar o ID.
http://learn.jquery.com/performance/append-outside-loop/
fonte