HTML-форма выбора с возможностью ввода пользовательского значения


104

Я хотел бы иметь поле ввода, в которое пользователи могут вводить пользовательское текстовое значение или выбирать из раскрывающегося списка. Обычный <select>предлагает только выпадающие варианты.

Как я могу <select>принять индивидуальное значение? Например: Форд?

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

Вы можете использовать javascript для динамического добавления опции к выбору, но тогда использование этой информации станет настоящей проблемой.
Дэвид

Я не добавлял эту опцию для пользовательских значений на моем веб-сайте finnmglas.com/contact, однако кто-то связался со мной с пользовательским значением. Это так странно
finnmglas

Ответы:


249

HTML5 имеет встроенное поле со списком. Вы создаете текст inputи файл datalist. Затем добавить listатрибут к input, со значением из idиз datalist.

Обновление: по состоянию на март 2019 года все основные браузеры (теперь включая Safari 12.1 и iOS Safari 12.3) поддерживают datalistуровень, необходимый для этой функции. См. Caniuse для подробной поддержки браузера.

Выглядит это так:

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


3
Эта функция поддерживается только примерно 50% браузеров. Только последние версии Firefox, Chrome и Opera поддерживают это; IE, Safari и мобильные браузеры - нет. См http://caniuse.com/
markmarijnissen

2
Прошла половина 2016 года (более 2 лет спустя), и большинство браузеров все еще не полностью поддерживают это, по крайней мере, без серьезных ошибок. По крайней мере, что-то будет работать в последних версиях практически всего, кроме Safari / Safari iOS, но вы должны протестировать, чтобы убедиться, что ваши варианты использования работают правильно. Это по-прежнему лучший ответ.
Michael Gaskill

1
У меня это хорошо работает. Во многих случаях нам не нужно поддерживать старые браузеры. Я только добавил изображение «стрелка вниз» на фоне поля ввода, чтобы дать пользователям подсказку, что его можно расширить. Код (вам нужен реальный файл изображения):<input type="text" list="cars" style="background:url('images/arrow_down.png') no-repeat right center">
Евгений Кардаш

4
Я только что протестировал последние версии IE, Firefox и Chrome, и все они работают нормально. Я думаю, что это отличное простое решение этой распространенной проблемы для многих случаев.
kerl

3
Я действительно хотел использовать это, но мне нужно было установить значение по умолчанию. Пользователь видит только значения по умолчанию в раскрывающемся списке, а не все варианты (потому что они отфильтрованы). Им нужно знать, чтобы очистить поле ввода, прежде чем они увидят все варианты.
Джастин

26

Последний JSFiddle от Алена Саке не переключался для меня в Firefox, поэтому я подумал, что предоставлю простой обходной путь html / javascript, который будет хорошо работать в формах (относительно отправки) до того дня, когда тег datalist будет принят всеми браузерами / устройствами. Для получения дополнительных сведений и ознакомления с этим в действии перейдите по адресу : http://jsfiddle.net/6nq7w/4/ Примечание. Не допускайте пробелов между переключаемыми братьями и сестрами!

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


Я бы хотел снова пройти через эту скрипку! Ведьма версия Firefox там не поддерживалась! Я тестировал его с какой-то версией, которую не помню! Престижность!
Alen Saqe

Я не знаю, на какой версии FF я был. Я только что взглянул на FF34.0, и теперь у меня появляется функциональность, так что не беспокойтесь. Однако опцию переключения по умолчанию "Другое" можно отключить. Когда я удаляю «Другое», редактируя значение, раскрывающееся меню не предлагает интуитивно понятного значения для выбора (для доступа к функции редактирования). Я думаю, это зависит от личных предпочтений. Поскольку стрелка раскрывающегося меню все еще присутствует, когда поле доступно для редактирования, пользователи могут не осознавать, что поле доступно для редактирования. Не клянусь на тебя; просто обратная связь. В моем фрагменте также рассматривается именование полей внутри <form>.
mickmackusa

Конечным результатом этого гениального, но не поддающегося расшифровке (для меня) сценария + html является присоединение выбранного значения параметра или введенного текста к GET той же страницы, что и строка запроса. Кто-нибудь знает, как преобразовать действие в POST, чтобы я мог получить значение в файле php и что-то с ним сделать там?
Хан

Я написал этот скрипт с особым намерением, чтобы он вел себя в соответствии с отправляемыми HTML-формами. Вы используете метод post в качестве атрибута в теге формы? @Han, если вы создадите ссылку 3v4l.org на свой изолированный фрагмент, я могу быстро взглянуть и, возможно, посоветовать.
mickmackusa

1
Боже, я чувствую себя тупым. Я забыл указать метод в теге формы. Он работал так, как было написано, с этой очень небольшой модификацией: <form name = "BrowserSurvey" method = "post" action = "/ gotThis.php"> ... Прекрасный скрипт, mickmackusa. Спасибо за подсказку!
Хан

16

Решение jQuery!

Демо: http://jsfiddle.net/69wP6/2/

Еще одна демонстрация ниже (обновлена!)

Мне нужно было что-то подобное в случае, когда у меня были фиксированные параметры, и я хотел, чтобы еще один вариант можно было редактировать! В этом случае я сделал скрытый ввод, который перекрывал бы опцию выбора и был бы редактируемым, и использовал jQuery, чтобы все это работало без проблем.

Я делюсь со всеми вами скрипкой!

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

Изменить: добавлено несколько простых штрихов в дизайн, чтобы люди могли четко видеть, где заканчивается ввод!

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


11

Вы действительно не можете. Вам нужно будет иметь как раскрывающийся список, так и текстовое поле, и они должны выбрать или заполнить форму. Без javascript вы можете создать отдельный набор переключателей, где они выбирают раскрывающийся список или ввод текста, но мне это кажется беспорядочным. С помощью некоторого javascript вы можете отключить один или другой в зависимости от того, какой из них они выберут, например, в раскрывающемся списке есть вариант «другой», который запускает текстовое поле.


9

Если опция datalist не соответствует вашим требованиям, обратите внимание на библиотеку Select2 и « Создание динамической опции »

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

Используя одно из вышеперечисленных решений (@mickmackusa), я сделал рабочий прототип в React 16.8+ с помощью хуков.

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

Надеюсь, это кому-то поможет.


Я имею честь. Я только что проверил свои записи, и это был 12-й пост, который я сделал здесь, на Stack Overflow - похоже, миллион лет назад.
mickmackusa

Я только что поиграл с вашей демонстрационной ссылкой, и похоже, что вы потеряли эффект бесконечного переключения между двумя типами полей.
mickmackusa
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.