Modulo di selezione HTML con opzione per inserire un valore personalizzato


104

Vorrei avere un campo di input in cui gli utenti possono inserire un valore di testo personalizzato o scegliere dal menu a discesa. Un normale <select>offre solo opzioni a discesa.

Come posso impostare un <select>valore personalizzato di accettazione? Ad esempio: Ford?

<select>
  <option value="volvo">Volvo</option>
  <option value="saab">Saab</option>
  <option value="mercedes">Mercedes</option>
  <option value="audi">Audi</option>
</select>

È possibile utilizzare javascript per aggiungere dinamicamente un'opzione alla selezione, ma l'utilizzo di queste informazioni diventerebbe un vero problema.
— David

Non ho aggiunto questa opzione per i valori personalizzati sul mio sito web finnmglas.com/contact, tuttavia qualcuno mi ha contattato con un valore personalizzato. È così strano
— finnmglas

Risposte:


249

HTML5 ha una casella combinata incorporata. Crei un testo inpute un file datalist. Quindi aggiungi un listattributo a input, con un valore di iddi datalist.

Aggiornamento: a partire da marzo 2019 tutti i principali browser (ora inclusi Safari 12.1 e iOS Safari 12.3) supportano datalistil livello necessario per questa funzionalità. Vedere caniuse per il supporto dettagliato del browser.

Assomiglia a questo:

<input type="text" list="cars" />
<datalist id="cars">
  <option>Volvo</option>
  <option>Saab</option>
  <option>Mercedes</option>
  <option>Audi</option>
</datalist>


3
Questa funzione è supportata solo da circa il 50% dei browser. Solo gli ultimi Firefox, Chrome e Opera lo supportano; IE, Safari e browser mobili no. Vedi http://caniuse.com/
— markmarijnissen

2
È a metà del 2016 (più di 2 anni dopo) e la maggior parte dei browser non lo supporta ancora completamente, almeno senza bug significativi. Almeno qualcosa funzionerà sulle versioni recenti di quasi tutto tranne Safari / Safari iOS, ma devi testare per assicurarti che i tuoi casi d'uso funzionino correttamente. È ancora la migliore risposta.
— Michael Gaskill

1
Funziona bene per me. In molti casi non è necessario supportare i vecchi browser. Ho aggiunto solo l'immagine "freccia giù" sullo sfondo del campo di input per dare agli utenti un suggerimento che è espandibile. Codice (è necessario un file immagine effettivo):<input type="text" list="cars" style="background:url('images/arrow_down.png') no-repeat right center">
— Eugene Kardash

4
Ho appena provato nelle versioni recenti di IE, Firefox e Chrome e tutto funziona bene. Penso che questa sia un'ottima soluzione semplice a questo problema comune per molti casi.
— Kerl

3
Volevo davvero usarlo ma avevo bisogno di impostare un valore predefinito. L'utente vede solo il valore predefinito nel menu a discesa rispetto a tutte le opzioni (perché sono filtrate). Avrebbero bisogno di sapere per cancellare il campo di input prima di vedere tutte le opzioni.
— Justin

26

L'ultimo JSFiddle di Alen Saqe non si è attivato per me su Firefox, quindi ho pensato di fornire una semplice soluzione html / javascript che funzionerà bene all'interno dei moduli (per quanto riguarda l'invio) fino al giorno in cui il tag datalist sarà accettato da tutti i browser / dispositivi. Per maggiori dettagli e vederlo in azione, vai su: http://jsfiddle.net/6nq7w/4/ Nota: non consentire spazi tra fratelli e sorelle!

<!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>


Vorrei rivivere quell'agitazione! La versione Witch di Firefox non era supportata lì! L'ho provato con qualche versione che non ricordo! Kudos!
— Alen Saqe

Non so su quale versione di FF mi trovassi. Ho appena dato un'occhiata a FF34.0 e sto ottenendo funzionalità ora, quindi non preoccuparti. Tuttavia, l'opzione di commutazione predefinita "Altro" può essere deselezionata. Quando rimuovo "Altro" modificando il valore, il menu a discesa non offre un valore intuitivo da selezionare (per accedere alla funzione di modifica). Penso che questo dipenda dalle preferenze personali. Poiché la freccia del menu a discesa è ancora presente quando il campo è modificabile, gli utenti potrebbero non rendersi conto che il campo è modificabile. Non ti sto prendendo in giro; solo qualche feedback. Il mio snippet considera anche la denominazione dei campi all'interno di un <form>.
— mickmackusa

Il risultato finale di questo ingegnoso ma indecifrabile (per me) script + html è allegare il valore dell'opzione selezionata, o il testo inserito, a un GET della stessa pagina come stringa di query. Qualcuno sa come convertire l'azione in un POST, quindi posso prendere il valore in un file php e fare qualcosa con esso lì?
— Han

Ho composto questo script con l'intenzione specifica che si comportasse in conformità con l'invio del modulo html. Stai usando il metodo post come attributo nel tag del modulo? @ Han, se crei un link 3v4l.org del tuo frammento isolato, posso dare una rapida occhiata ed eventualmente consigliare.
— mickmackusa

1
Ragazzo, mi sento stupido. Ho dimenticato di inserire un metodo nel tag del form. Ha funzionato come pubblicato con questa piccola modifica: <form name = "BrowserSurvey" method = "post" action = "/ gotThis.php"> ... Bella sceneggiatura, mickmackusa. Grazie per il tuo suggerimento di follow-up!
— Han

16

jQuery Solution!

Demo: http://jsfiddle.net/69wP6/2/

Un'altra demo qui sotto (aggiornata!)

Avevo bisogno di qualcosa di simile in un caso in cui avevo alcune opzioni fisse e volevo che un'altra opzione fosse modificabile! In questo caso ho creato un input nascosto che si sarebbe sovrapposto all'opzione di selezione e sarebbe stato modificabile e utilizzato jQuery per far funzionare tutto senza problemi.

Condivido il violino con tutti voi!

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();
}
});

Modifica: aggiunti alcuni semplici tocchi di design, in modo che le persone possano vedere chiaramente dove finisce l'input!

JS Fiddle: http://jsfiddle.net/69wP6/4/


11

Non puoi davvero. Dovrai avere sia il menu a discesa che la casella di testo e fargli scegliere o compilare il modulo. Senza javascript potresti creare un set di pulsanti radio separato in cui scelgono il menu a discesa o l'immissione di testo, ma questo mi sembra disordinato. Con alcuni javascript potresti disattivare l'uno o l'altro a seconda di quale scelgono, ad esempio, avere un'opzione "altro" nel menu a discesa che attiva il campo di testo.


9

Se l'opzione datalist non soddisfa i tuoi requisiti, dai un'occhiata alla libreria Select2 e alla " Creazione dell'opzione dinamica "

$(".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>


0

Utilizzando una delle soluzioni di cui sopra (@mickmackusa), ho realizzato un prototipo funzionante in React 16.8+ usando Hooks.

https://codesandbox.io/s/heuristic-dewdney-0h2y2

Spero che aiuti qualcuno.


Sono onorato. Ho appena controllato i miei record e questo è stato il 12 ° post che ho scritto qui su Stack Overflow - sembra un milione di anni fa.
— mickmackusa

Ho appena giocato con il tuo link demo e sembra che tu abbia perso l'effetto per passare indefinitamente tra i due tipi di campi.
— mickmackusa
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.