Me gustaría tener un campo de entrada en el que los usuarios puedan ingresar un valor de texto personalizado o elegir entre el menú desplegable. Un regular <select>
solo ofrece opciones desplegables.
¿Cómo puedo <select>
aceptar un valor personalizado? Por ejemplo: ¿Ford?
<select>
<option value="volvo">Volvo</option>
<option value="saab">Saab</option>
<option value="mercedes">Mercedes</option>
<option value="audi">Audi</option>
</select>
Respuestas:
HTML5 tiene un cuadro combinado integrado. Creas un texto
input
y undatalist
. Luego agrega unlist
atributo alinput
, con un valor delid
dedatalist
.Actualización: a partir de marzo de 2019, todos los principales navegadores (que ahora incluyen Safari 12.1 y iOS Safari 12.3) admiten
datalist
el nivel necesario para esta funcionalidad. Consulte caniuse para obtener información detallada sobre el soporte del navegador.Se parece a esto:
<input type="text" list="cars" /> <datalist id="cars"> <option>Volvo</option> <option>Saab</option> <option>Mercedes</option> <option>Audi</option> </datalist>
fuente
<input type="text" list="cars" style="background:url('images/arrow_down.png') no-repeat right center">
El último JSFiddle de Alen Saqe no se alteró para mí en Firefox, por lo que pensé en proporcionar una solución alternativa html / javascript simple que funcionará bien dentro de los formularios (con respecto al envío) hasta el día en que la etiqueta de la lista de datos sea aceptada por todos los navegadores / dispositivos. Para obtener más detalles y verlo en acción, vaya a: http://jsfiddle.net/6nq7w/4/ Nota: ¡No permita ningún espacio entre hermanos alternos!
<!DOCTYPE html> <html> <script> function toggleField(hideObj,showObj){ hideObj.disabled=true; hideObj.style.display='none'; showObj.disabled=false; showObj.style.display='inline'; showObj.focus(); } </script> <body> <form name="BrowserSurvey" action="#"> Browser: <select name="browser" onchange="if(this.options[this.selectedIndex].value=='customOption'){ toggleField(this,this.nextSibling); this.selectedIndex='0'; }"> <option></option> <option value="customOption">[type a custom value]</option> <option>Chrome</option> <option>Firefox</option> <option>Internet Explorer</option> <option>Opera</option> <option>Safari</option> </select><input name="browser" style="display:none;" disabled="disabled" onblur="if(this.value==''){toggleField(this,this.previousSibling);}"> <input type="submit" value="Submit"> </form> </body> </html>
fuente
¡Solución jQuery!
Demostración: http://jsfiddle.net/69wP6/2/
Otra demostración a continuación (¡actualizada!)
¡Necesitaba algo similar en un caso en el que tenía algunas Opciones fijas y quería que otra opción fuera editable! En este caso, hice una entrada oculta que se superpondría a la opción de selección y sería editable y usé jQuery para que todo funcione sin problemas.
¡Estoy compartiendo el violín con todos ustedes!
HTML
<div id="billdesc"> <select id="test"> <option class="non" value="option1">Option1</option> <option class="non" value="option2">Option2</option> <option class="editable" value="other">Other</option> </select> <input class="editOption" style="display:none;"></input> </div>
CSS
body{ background: blue; } #billdesc{ padding-top: 50px; } #test{ width: 100%; height: 30px; } option { height: 30px; line-height: 30px; } .editOption{ width: 90%; height: 24px; position: relative; top: -30px }
jQuery
var initialText = $('.editable').val(); $('.editOption').val(initialText); $('#test').change(function(){ var selected = $('option:selected', this).attr('class'); var optionText = $('.editable').text(); if(selected == "editable"){ $('.editOption').show(); $('.editOption').keyup(function(){ var editText = $('.editOption').val(); $('.editable').val(editText); $('.editable').html(editText); }); }else{ $('.editOption').hide(); } });
Editar: ¡Se agregaron algunos toques simples en el diseño, para que la gente pueda ver claramente dónde termina la entrada!
JS Fiddle: http://jsfiddle.net/69wP6/4/
fuente
Realmente no puedes. Tendrá que tener tanto el menú desplegable como el cuadro de texto, y pedirles que elijan o completen el formulario. Sin javascript, podría crear un conjunto de botones de opción separado donde elijan el menú desplegable o la entrada de texto, pero esto me parece complicado. Con algunos javascript, puede desactivar uno u otro dependiendo de cuál elijan, por ejemplo, tener una opción 'otro' en el menú desplegable que activa el campo de texto.
fuente
Si la opción de lista de datos no cumple con sus requisitos, eche un vistazo a la biblioteca Select2 y la " Creación de opciones dinámicas ".
$(".js-example-tags").select2({ tags: true });
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <link href="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.6-rc.0/css/select2.min.css" rel="stylesheet"/> <script src="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.6-rc.0/js/select2.min.js"></script> <select class="form-control js-example-tags"> <option selected="selected">orange</option> <option>white</option> <option>purple</option> </select>
fuente
Usando una de las soluciones anteriores (@mickmackusa), hice un prototipo funcional en React 16.8+ usando Hooks.
https://codesandbox.io/s/heuristic-dewdney-0h2y2
Espero que esto ayude a alguien.
fuente