Как создать ComboBox в HTML?

Укороченная версия

Как я могу создать ComboBox в HTML?

Длинная версия

Как создать редактируемый раскрывающийся список с текстом по умолчанию в HTML?

То есть:

  • текстовое поле, которое пользователь может ввести
  • или они могут нажать (или Alt+Down), чтобы отобразить раскрывающийся список.
  • и выберите заранее определенный текст
  • в то время как текстовое поле по умолчанию имеет какое-то полезное значение по умолчанию, которое (обязательно) не отображается в списке

Что-то вроде стандартного элемента управления Windows Combo Box или WinForms ComboBox:

Исследовательская работа

Я попробовал следующий HTML:

<input id = "edPhrase" list = "phrases" value = "Hello, world!">
<datalist id = "phrases">
  <option value = "Good morning Vietnam">Good morning Vietnam</option>
  <option value = "Stay classy San Francisco">Stay classy San Francisco</option>
  <option value = "Cleaveland Rocks">Cleaveland Rocks</option>
  <option value = "I see dead people">I see dead people</option>
  <option value = "Guess who's drunk">Guess who's drunk</option>
</datalist>

но раскрывающийся список не появляется:

Если пользователь удалит существующий текст, появится раскрывающийся список:

Таким образом, разрушается вся цель раскрывающегося списка.

Какие существа нам на вопрос:

Как я могу создать ComboBox в HTML?

Полный минимально воспроизводимый пример (CRME)

Итак, вы можете попробовать поэкспериментировать с ним, чтобы он работал в вашей песочнице:

так? jsfiddle.net/nwH8A

Roadman1991 11.04.2024 16:01

@ Roadman1991 Почти; за исключением того, что нет текста по умолчанию.

Ian Boyd 11.04.2024 16:16

Список данных предназначен для автозаполнения, по умолчанию он не отображает все параметры.

0stone0 11.04.2024 16:17

@0stone0 Это означает, что мои исследовательские усилия с использованием входных данных и списка данных ни к чему не приведут. Это возвращает меня к моему вопросу: как создать ComboBox в HTML.

Ian Boyd 11.04.2024 16:20

Для автозаполнения потребуется некоторый JS, есть несколько инструментов, которые предоставляют такие поля. Если вам не нужны внешние библиотеки, используйте select с пользовательским JS, чтобы включить автозаполнение.

0stone0 11.04.2024 16:23

@0stone0 Кажется, ответ такой: «Вы не можете сделать это в HTML». Это нормально. Это может быть ответом. Если HTML просто не может воспроизвести один из наиболее часто используемых виджетов пользовательского интерфейса за последние 34 года: так оно и есть. Напишите это в форме ответа и он будет принят.

Ian Boyd 11.04.2024 16:32
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Введение в CSS
Введение в CSS
CSS является неотъемлемой частью трех основных составляющих front-end веб-разработки.
Как выровнять Div по центру?
Как выровнять Div по центру?
Чтобы выровнять элемент <div>по горизонтали и вертикали с помощью CSS, можно использовать комбинацию свойств и значений CSS. Вот несколько методов,...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Travel Booking Angular Template один из лучших Travel & Tour booking template in the world. 30+ валидированных HTML5 страниц, которые помогут...
1
6
77
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вам нужен JavaScript, чтобы удалить фокус ИЛИ и выбрать, и они смогут начать печатать, что откроет раскрывающийся список для того, что они печатают, при условии, что введенная буква появляется в списке данных.

document.getElementById('edPhrase').addEventListener('click', (e) => {
  const input = e.target;
  input.value = "";
});
/* Perhaps not
document.getElementById('edPhrase').addEventListener('blur', (e) => {
  const input = e.target;
  if (input.value.trim() === "") input.value=input.defaultValue;
});
*/
document.getElementById('edPhrase').addEventListener('change', (e) => {
  const input = e.target;
  if (input.value.trim() !== "") input.defaultValue=input.value;
});
<input id = "edPhrase" list = "phrases" value = "Hello, world!">
<datalist id = "phrases">
  <option value = "Good morning Vietnam">Good morning Vietnam</option>
  <option value = "Stay classy San Francisco">Stay classy San Francisco</option>
  <option value = "Cleaveland Rocks">Cleaveland Rocks</option>
  <option value = "I see dead people">I see dead people</option>
  <option value = "Guess who's drunk">Guess who's drunk</option>
</datalist>

document.getElementById('edPhrase').addEventListener('click', (e) => {
  const input = e.target;
  input.focus();
  input.select();
})
<input id = "edPhrase" list = "phrases" value = "Hello, world!">
<datalist id = "phrases">
  <option value = "Good morning Vietnam">Good morning Vietnam</option>
  <option value = "Stay classy San Francisco">Stay classy San Francisco</option>
  <option value = "Cleaveland Rocks">Cleaveland Rocks</option>
  <option value = "I see dead people">I see dead people</option>
  <option value = "Guess who's drunk">Guess who's drunk</option>
</datalist>

Альтернативно ищите виджеты

Раскрывающийся список не появляется (jsfiddle.net/1e8v3tgk)

Ian Boyd 11.04.2024 16:10

Это происходит, как только вы вводите букву, которая появляется в списке данных.

mplungjan 11.04.2024 16:20

Но он не появляется, когда пользователь нажимает раскрывающийся список ▼; в этом вся суть. Пересмотренный фрагмент удаляет текст, когда пользователь щелкает раскрывающийся список.

Ian Boyd 11.04.2024 16:22

Смотрите обновление. Вы можете очистить поле и восстановить его

mplungjan 11.04.2024 16:28
Ответ принят как подходящий

Не существует собственного HTML-способа добиться этого, вам понадобится специальный Javascript, чтобы <datalist> отображал все параметры, или реализовать автозаполнение в <select>.


Использование placeholder на <input> гарантирует, что все параметры будут показаны внутри <datalist>, это сохранит фильтр при вводе функций, но вы не сможете «выбрать» заполнитель.

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

Есть несколько приемов, позволяющих datalist всегда показывать все доступные входные данные, используя (например) события blur(), если placeholder недостаточно:

Другие вопросы по теме