Si tenía muchas opciones, o si este código necesitaba ejecutarse con mucha frecuencia, entonces debería considerar usar un DocumentFragment en lugar de modificar el DOM muchas veces innecesariamente. Sin embargo, solo por un puñado de opciones, diría que no vale la pena.
DocumentFragmentes una buena opción para mejorar la velocidad, pero no podemos crear elementos opcionales document.createElement('option')ya que IE6 e IE7 no lo admiten.
Lo que podemos hacer es crear un nuevo elemento de selección y luego agregar todas las opciones. Una vez que finalice el ciclo, agréguelo al objeto DOM real.
Los parámetros del método son un poco engañosos, la función (val, texto) debería ser función (índice, opción) por ejemplo. Funciona bien de lo contrario.
mbillard 01 de
14
@Crossbrowser: no estoy de acuerdo, valy en textrealidad describo las variables y su uso.
nickf
1
solo para ese ejemplo, sin embargo, como método de propósito general, esas variables son engañosas (no me dio idea de cómo usar ese método). Sin embargo, daré por sentado que la respuesta no fue sobre el uso del método $ .each.
mbillard
1
Estaba usando anteriormente mySelect.append(new Option(text, val));, que no funcionaba en IE8. Tuve que cambiar a @ nickf'smySelect.append($('<option></option>').val(val).html(text));
Matthew Clark
55
@briansol:.attr('selected', true|false)
nickf
167
Sin complementos, esto puede ser más fácil sin usar tanta jQuery, en lugar de ir un poco más a la vieja escuela:
var myOptions ={
val1 :'text1',
val2 :'text2'};
$.each(myOptions,function(val, text){
$('#mySelect').append(newOption(text,val));});
Si desea especificar si la opción a) es el valor seleccionado por defecto yb) debe seleccionarse ahora, puede pasar dos parámetros más:
var defaultSelected =false;var nowSelected =true;
$('#mySelect').append(newOption(text,val,defaultSelected,nowSelected));
Si usa comillas dobles dentro de los parámetros de su opción, cerrarán la función y romperán el script. Cambiar .prepend("...") / $("...")a .prepend('...') / $('...')arreglaría el fragmento.
Heraldmonkey
4
Nota de Pease La solución de @ Phrogz no funciona en IE 8, mientras que @ nickf funciona en todos los principales navegadores. Otro enfoque es:
Necesitaba agregar tantas opciones a los menús desplegables como había menús desplegables en mi página. Entonces lo usé de esta manera:
function myAppender(obj,value, text){
obj.append($('<option></option>').val(value).html(text));}
$(document).ready(function(){var counter =0;var builder =0;// Get the number of dropdowns
$('[id*="ddlPosition_"]').each(function(){
counter++;});// Add the options for each dropdown
$('[id*="ddlPosition_"]').each(function(){var myId =this.id.split('_')[1];// Add each option in a loop for the specific dropdown we are onfor(var i=0; i<counter; i++){
myAppender($('[id*="ddlPosition_'+myId+'"]'), i, i+1);}
$('[id*="ddlPosition_'+myId+'"]').val(builder);
builder++;});});
Esto configuró dinámicamente los menús desplegables con valores como 1 a n, y seleccionó automáticamente el valor para el orden en que estaba el menú desplegable (es decir, el segundo menú desplegable obtuvo "2" en el cuadro, etc.).
Era ridículo que no pudiera usar thiso this.Objecto$.obj ni nada de eso en mi segundo .each(), aunque --- que en realidad tenía que obtener el ID específico de ese objeto y luego agarrar y pasar todo ese objeto a la función antes de que sería añadir. Afortunadamente, la identificación de mi menú desplegable estaba separada por una "_" y pude tomarla. No creo que debería haber tenido que hacerlo, pero de otra manera me daba excepciones jQuery. Algo que otros que luchan con lo que yo era podría disfrutar sabiendo.
¿Por qué estás incrementando el contador en cada uno? ¿Eres nuevo en jquery? var counter = $ ('[id * = "ddlPosition _"]'). length es menos detallado y más eficiente. Creo que necesita un poco más de experiencia antes de comenzar a publicar su código. Este no es un código de calidad de producción, ya que está mal escrito y es demasiado complejo para una tarea tan trivial. Sin ofender, pero hay una razón por la que tiene 58 respuestas y ningún voto positivo.
Athens Holloway
Obviamente entendiste mal lo que estaba creando. El contador es para incrementar el valor publicado en el menú desplegable, y tuve varios con la misma ID, solo con un "_ ##" diferente al final, por lo que .length () habría sido inexacto. Esa es la razón para el "id * =" en el selector.
vapcguy
En cuanto a mis otras respuestas, generalmente abogo por métodos más simples siempre que sea posible, y si las personas no fueran tan esotéricas con su codificación y escribieran cosas que fueran más simplificadas, mis respuestas probablemente tendrían más votos. Pero las personas quieren verse inteligentes y no elegirán algo tan simple. No me hace equivocarme por querer simplemente la industria. Tampoco disfruto solucionar problemas o construir sobre el código de otras personas que es ridículamente más complejo de lo que debe ser.
vapcguy
También podría tener más confianza en $ (this) .length () en ese ciclo más si alguien pudiera explicar por qué enviar "$ (this)" en lugar del objeto a myAppender no funcionó.
vapcguy
0
Pensemos que su respuesta es "successData". Contiene una lista que debe agregar como opciones en un menú desplegable.
success:function(successData){var sizeOfData = successData.length;if(sizeOfData ==0){// NO DATA, throw an alert ...
alert ("No Data Found");}else{
$.each(successData,function(val, text){
mySelect.append(
$('<option></option>').val(val).html(text));});}}
Respuestas:
Sin usar complementos adicionales,
Si tenía muchas opciones, o si este código necesitaba ejecutarse con mucha frecuencia, entonces debería considerar usar un DocumentFragment en lugar de modificar el DOM muchas veces innecesariamente. Sin embargo, solo por un puñado de opciones, diría que no vale la pena.
------------------------------- Adicional ------------------ --------------
DocumentFragment
es una buena opción para mejorar la velocidad, pero no podemos crear elementos opcionalesdocument.createElement('option')
ya que IE6 e IE7 no lo admiten.Lo que podemos hacer es crear un nuevo elemento de selección y luego agregar todas las opciones. Una vez que finalice el ciclo, agréguelo al objeto DOM real.
¡De esta manera modificaremos DOM solo una vez!
fuente
val
y entext
realidad describo las variables y su uso.mySelect.append(new Option(text, val));
, que no funcionaba en IE8. Tuve que cambiar a @ nickf'smySelect.append($('<option></option>').val(val).html(text));
.attr('selected', true|false)
Sin complementos, esto puede ser más fácil sin usar tanta jQuery, en lugar de ir un poco más a la vieja escuela:
Si desea especificar si la opción a) es el valor seleccionado por defecto yb) debe seleccionarse ahora, puede pasar dos parámetros más:
fuente
"<option></option>"
método; Eso parece sucio.Con el complemento: jQuery Selection Box . Puedes hacerlo:
fuente
Es posible que desee borrar su DropDown primero $ ('# DropDownQuality'). Empty ();
Hice que mi controlador en MVC devolviera una lista de selección con solo un elemento.
fuente
Agregar elemento a la lista al principio
Agregar elemento a la lista al final
Operación desplegable común (Obtener, Establecer, Agregar, Eliminar) usando jQuery
fuente
.prepend("...") / $("...")
a.prepend('...') / $('...')
arreglaría el fragmento.Nota de Pease La solución de @ Phrogz no funciona en IE 8, mientras que @ nickf funciona en todos los principales navegadores. Otro enfoque es:
fuente
U puede usar directo
$"(.ddlClassName").Html("<option selected=\"selected\" value=\"1\">1</option><option value=\"2\">2</option>")
-> Aquí puedes usar cadena directa
fuente
Y también, use .prepend () para agregar la opción al inicio de la lista de opciones. http://api.jquery.com/prepend/
fuente
usando jquery puedes usar
donde " myid " es la identificación de la lista desplegable y newvalue es el texto que desea insertar.
fuente
Necesitaba agregar tantas opciones a los menús desplegables como había menús desplegables en mi página. Entonces lo usé de esta manera:
Esto configuró dinámicamente los menús desplegables con valores como 1 a n, y seleccionó automáticamente el valor para el orden en que estaba el menú desplegable (es decir, el segundo menú desplegable obtuvo "2" en el cuadro, etc.).
Era ridículo que no pudiera usar
this
othis.Object
o$.obj
ni nada de eso en mi segundo.each()
, aunque --- que en realidad tenía que obtener el ID específico de ese objeto y luego agarrar y pasar todo ese objeto a la función antes de que sería añadir. Afortunadamente, la identificación de mi menú desplegable estaba separada por una "_" y pude tomarla. No creo que debería haber tenido que hacerlo, pero de otra manera me daba excepciones jQuery. Algo que otros que luchan con lo que yo era podría disfrutar sabiendo.fuente
Pensemos que su respuesta es "successData". Contiene una lista que debe agregar como opciones en un menú desplegable.
Esto funcionaría para ti ...
fuente
prueba esta función:
fuente