¿Cuál es el mejor método para agregar opciones a un <select>
objeto JavaScript usando jQuery?
Estoy buscando algo para lo que no necesito un complemento, pero también me interesarían los complementos que están disponibles.
Esto es lo que hice:
selectValues = { "1": "test 1", "2": "test 2" };
for (key in selectValues) {
if (typeof (selectValues[key] == 'string') {
$('#mySelect').append('<option value="' + key + '">' + selectValues[key] + '</option>');
}
}
Una solución limpia / simple:
Esta es una versión limpia y simplificada de matdumsa :
$.each(selectValues, function(key, value) {
$('#mySelect')
.append($('<option>', { value : key })
.text(value));
});
Cambios de matdumsa: (1) eliminó la etiqueta de cierre para la opción dentro de append () y (2) movió las propiedades / atributos a un mapa como el segundo parámetro de append ().
javascript
jquery
arrays
html-select
Darryl Hein
fuente
fuente
value
es una cadena (y está codificada) que no necesita ser citada.Respuestas:
Lo mismo que otras respuestas, de manera jQuery:
fuente
$("#mySelect")
a un var, de lo contrario, llamar$("#mySelect")
cada vez dentro del ciclo es muy derrochador, al igual que actualizar el DOM. Vea los puntos 3 y 6 en artzstudio.com/2009/04/jquery-performance-rules/…var mySelect = $("#mySelect") outside of the
cada bucle. Eso sería mucho más eficiente. Vea la respuesta de Carl a continuaciónattr
ytext
en realidad son métodos de la$('<option/>')
-objetoDe esta manera, "toca el DOM" solo una vez.
No estoy seguro de si la última línea se puede convertir a $ ('# mySelect'). Html (output.join ('')) porque no conozco las partes internas de jQuery (tal vez hace algún análisis en el html () método)fuente
key
tiene algunas citas o>, <
en él.Esto es un poco más rápido y más limpio.
fuente
jQuery
JavaScript vainilla
fuente
Option
objeto antes. ¿Está integrado en todos los navegadores?new Option
, pero descubrí que no funcionaba en IE6 y 7. No tengo una razón para hacerlo, pero muchas de las opciones jQuery completas funcionaron.new Option('display', value, true)
new Option('display', value, true, true)
( javascriptkit.com/jsref/select.shtml )Si no tiene que admitir versiones antiguas de IE, usar el
Option
constructor es claramente el camino a seguir, una solución legible y eficiente :Es equivalente en funcionalidad a, pero más limpio que:
fuente
Esto se ve mejor, proporciona legibilidad, pero es más lento que otros métodos.
Si desea velocidad, la forma más rápida (¡probada!) Es usar matriz, no concatenación de cadenas, y usar solo una llamada anexa.
fuente
Un refinamiento de la respuesta de @ joshperry :
Parece que .append simple también funciona como se esperaba,
o más corto
fuente
$.weakmap
para permitir?GC
map()
construcción, combinada con la propiedad deappend()
agregar una matriz de objetos correctamente!Todas estas respuestas parecen innecesariamente complicadas. Todo lo que necesitas es:
Eso es completamente compatible con navegadores cruzados.
fuente
new Option(value, key);
? El orden de los parámetros es Opciones (text_visible_part, value_behind_the_scenes).Tenga cuidado ... Estoy usando jQuery Mobile 1.0b2 con PhoneGap 1.0.0 en un teléfono Android 2.2 (Cyanogen 7.0.1) (T-Mobile G2) y no pude conseguir que el método .append () funcionara. Tuve que usar .html () como sigue:
fuente
He hecho algunas pruebas y creo que esto hace el trabajo más rápido. :PAGS
fuente
Hay un enfoque que utiliza el enfoque de plantilla de Microsoft que actualmente se propone incluir en jQuery core. Hay más poder en el uso de plantillas, por lo que para el escenario más simple, puede no ser la mejor opción. Para obtener más detalles, consulte la publicación de Scott Gu que describe las características.
Primero incluya el archivo js de plantillas, disponible en github .
Siguiente configurar una plantilla
Luego, con sus datos, llame al método .render ()
He blogueado este enfoque con más detalle.
fuente
He hecho algo como esto, cargando un elemento desplegable a través de Ajax . La respuesta anterior también es aceptable, pero siempre es bueno tener la menor modificación de DOM posible para un mejor rendimiento.
Entonces, en lugar de agregar cada elemento dentro de un ciclo, es mejor recolectar elementos dentro de un ciclo y agregarlo una vez que se haya completado.
Añádelo,
o mejor
fuente
La forma simple es:
fuente
La mayoría de las otras respuestas usan la
each
función para iterar sobreselectValues
. Esto requiere que se invoque append para cada elemento y se active un reflujo cuando cada uno se agrega individualmente.La actualización de esta respuesta a un método funcional más idiomático (usando JS moderno) se puede formar para llamar
append
solo una vez, con una matriz deoption
elementos creados usando el mapa y unOption
constructor de elementos.El uso de un
Option
elemento DOM debería reducir la sobrecarga de llamadas a funciones, ya que eloption
elemento no necesita actualizarse después de la creación y la lógica de análisis de jQuery no necesita ejecutarse.Esto se puede simplificar aún más si realiza una función de utilidad de fábrica que renovará un objeto de opción:
Entonces esto se puede proporcionar directamente a
map
:Formulación previa
Debido a que
append
también permite pasar valores como un número variable de argumentos, podemos crear la lista deoption
elementos del mapa y agregarlos como argumentos en una sola llamada mediante el usoapply
.Parece que en versiones posteriores de jQuery,
append
también acepta un argumento de matriz y esto se puede simplificar de alguna manera:fuente
Funciona bien con jQuery 1.4.1.
Para ver el artículo completo sobre el uso de listas dinámicas con ASP.NET MVC y jQuery, visite:
Listas de selección dinámica con MVC y jQuery
fuente
Hay un problema de clasificación con esta solución en Chrome (jQuery 1.7.1) (¿Chrome ordena las propiedades de los objetos por nombre / número?) Entonces, para mantener el orden (sí, es abuso de objetos), cambié esto:
a esto
y luego $ .each se verá así:
fuente
En lugar de repetir el mismo código en todas partes, sugeriría que es más conveniente escribir su propia función jQuery como:
Luego, para agregar una opción, simplemente haga lo siguiente:
fuente
Puede iterar sobre su matriz json con el siguiente código
$('<option/>').attr("value","someValue").text("Option1").appendTo("#my-select-id");
fuente
Aunque las respuestas anteriores son todas respuestas válidas, puede ser aconsejable agregar todas estas a un documentFragmnet primero, luego agregar ese fragmento de documento como un elemento después de ...
Vea los pensamientos de John Resig al respecto ...
Algo en la línea de:
fuente
$.each
es más lento que unfor
bucle$("#mySelect").append();
Entonces la mejor solución es la siguiente
Si los datos JSON
resp
sonúsalo como
fuente
Otra forma de hacerlo:
fuente
$('#mySelect')
luego refacturaste la respuesta @rocktheroad ... lo que sea, esta es la solución más prácticaEsto manipula el DOM solo una vez después de construir primero una cadena gigante.
fuente
$("#myselect").empty().append(opts);
congetElementById('myselect').innerHtml = opts;
Eso es lo que hice con matrices bidimensionales: La primera columna es el elemento i, añadir a
innerHTML
la<option>
. La segunda columna es record_id i, agregue a lavalue
de<option>
:PHP
JavaScript / Ajax
fuente
Aquí se puede encontrar un complemento de jQuery: completar automáticamente los cuadros de selección con jQuery y AJAX .
fuente
Descubrí que esto es simple y funciona muy bien.
fuente
El formato JSON:
Y el código jQuery para completar los valores del menú desplegable en el éxito de Ajax:
fuente
Usando la función $ .map (), puede hacer esto de una manera más elegante:
fuente
fuente
Establezca su ID de selección HTML en la siguiente línea a continuación. Aquí
mySelect
se usa como id del elemento select.luego obtenga el objeto que es selectValues en este escenario y lo establece en jquery para cada ciclo. Utilizará el valor y el texto de los objetos en consecuencia y lo agregará a las selecciones de opciones de la siguiente manera.
Esto mostrará el texto como la lista de opciones cuando se seleccione la lista desplegable y una vez que se seleccione un texto, se usará el valor del texto seleccionado.
P.ej.
"1": "prueba 1", "2": "prueba 2",
Desplegable,
nombre para mostrar: prueba 1 -> el valor es 1 nombre para mostrar: prueba 2 -> el valor es 2
fuente
En realidad, para obtener un rendimiento mejorado, es mejor hacer una lista de opciones por separado y agregar la identificación.
http://learn.jquery.com/performance/append-outside-loop/
fuente