Поле со списком HTML с возможностью ввода записи

83

У меня создалось впечатление, что вы можете вводить текст в поле со списком помимо выбора любых значений, уже имеющихся в списке. Однако я не могу найти информацию о том, как это сделать. Есть ли свойство, которое мне нужно добавить к нему, чтобы разрешить ввод текста?

Birdus
источник
4
Нет, вы не сможете сделать это без какого-либо JavaScript или другой магии. Сам по себе <select>элемент не может этого сделать.
j08691
Спасибо. Может, тогда я поищу элемент управления jQuery.
birdus
Рассмотрите возможность изменения принятого ответа, если вы считаете, что listатрибут HTML5 выполняет свою работу.
laggingreflex
Я понимаю, что это было много лет назад, но все равно озадачен. Какой код вы использовали для создания чего-то, что якобы является полем со списком?
Стюарт
@Stewart - Спекуляция: формулировка OP предполагает размытие концепции dropdownс combo box. Предположительно использовалось <select>с <option>и началось с пустым выбранным параметром. Он содержит список значений и «выглядит как поле со списком»; ему просто не хватает возможности печатать в текстовой области.
ToolmakerSteve

Ответы:

116

Раньше datalist(см. Примечание ниже) вы должны были предоставить дополнительный inputэлемент, чтобы люди могли ввести свой вариант.

<select name="example">
  <option value="A">A</option>
  <option value="B">B</option>
  <option value="-">Other</option>
</select>

<input type="text" name="other">

Этот механизм работает во всех браузерах и не требует JavaScript .

Вы можете использовать небольшой JavaScript, чтобы показать, только inputесли выбрана опция «Другое».

Элемент datalist

Этот datalistэлемент призван обеспечить лучший механизм реализации этой концепции. В некоторых браузерах, например iOS Safari <12.2, это не поддерживалось или при реализации были проблемы. Проверьте страницу Могу ли я использовать, чтобы увидеть текущую поддержку списка данных .

<input type="text" name="example" list="exampleList">
<datalist id="exampleList">
  <option value="A">  
  <option value="B">
</datalist>

Фентон
источник
Старая школа, но практичная.
Maqs
4
(Chrome в Windows, текущая версия) Имейте в виду, что как только пользователь начинает вводить текст в текстовое поле, этот текст становится фильтром по элементам, отображаемым в раскрывающемся списке. Неприемлемая ошибка: как только элемент был выбран, этот выбор становится фильтром! Во фрагменте кода выберите «A». Теперь снова откройте раскрывающийся список: ТОЛЬКО "A" отображается как опция !! Это не как работает со списком; это бесполезно как есть. AFAIK, для исправления этого требуется, чтобы JS очистил текстовую область при открытии раскрывающегося списка. (Все остальные ответы «даталистов» здесь имеют тот же фатальный недостаток, AFAIK.)
ToolmakerSteve
... в случае непонятности комментирую второе решение, основанное на datalist.
ToolmakerSteve
60

в HTML вы делаете это наоборот: вы определяете ввод текста:

<input type="text" list="browsers" />

и прикрепите к нему список данных. (обратите внимание на атрибут списка ввода).

<datalist id="browsers">
  <option value="Internet Explorer">
  <option value="Firefox">
  <option value="Chrome">
  <option value="Opera">
  <option value="Safari">
</datalist> 
Кристоф Салай
источник
10
Это не поддерживается в Safari.
trpt4him 03
Вы правы, однако я думаю, что в ближайшем будущем он будет поддерживаться, поскольку он является частью стандарта HTML5 (кандидат на данный момент). w3.org/TR/2012/CR-html5-20121217
Szalay
2
Согласно Can I Use , Safari 8 не поддерживает datalist. MDN говорит то же самое.
Даррен Гриффит
2
И Safari 9 тоже. Что случилось, Apple?
Сэм Уошберн,
3
Как это ухудшается с Safari?
Уильям Энтрикен,
22

Эта ссылка может вам помочь: http://www.scriptol.com/html5/combobox.php

У вас есть два примера. Один в html4, а другой в html5

HTML5

<input type="text" list="browsers"/>
 <datalist id="browsers">
    <option>Google</option>
    <option>IE9</option>
 </datalist>

HTML4

 <input type="text" id="theinput" name="theinput" />
 <select name="thelist" onChange="combo(this, 'theinput')">
   <option>one</option>
   <option>two</option>
   <option>three</option>
 </select>
 function combo(thelist, theinput) {
     theinput = document.getElementById(theinput);
     var idx = thelist.selectedIndex;
     var content = thelist.options[idx].innerHTML;
     theinput.value = content;
 }
Селсо Соарес
источник
6
Хотя эта ссылка может дать ответ на вопрос, лучше включить сюда основные части ответа и предоставить ссылку для справки. Ответы, содержащие только ссылки, могут стать недействительными, если ссылка на страницу изменится.
Joel
6

В dojo здесь пример в большинстве случаев не работает при применении к существующему коду. Поэтому мне пришлось найти альтернативу, найденную здесь - hxxp: //technologymantrablog.com/how-to-create-a-combo-box-with-text-input-jquery-autocomplete/ (теперь указывает на спам-сайт или хуже )

archive.org (не очень полезно)

Вот jsfiddle - https://jsfiddle.net/ze7fgby7/

PeakGen
источник
1
Это работает с Safari, в отличие от почти всего остального.
Атте
1
Это чертовски крутой человек! .. Я бы дал ему 10 лайков, если бы мог .. Управляет всем, ох, так прекрасно ...
Абхишек Джебарадж
1
К сожалению, ссылка больше не работает (знаете ли вы о новой ссылке?), Но jsfiddle очень полезен.
Андре
@Andre: Извините, я не знаю о новой ссылке. Надеюсь, JSFiddle поможет вам.
PeakGen
4

Что ж, сейчас 2016 год, и до сих пор нет простого способа сделать комбо ... конечно, у нас есть список данных, но без поддержки сафари / ios его действительно нельзя использовать. По крайней мере, у нас есть ES6. Ниже представлена ​​попытка создания комбо-класса, который обертывает div или span, превращая его в комбо, помещая поле ввода поверх select и привязывая соответствующие события.

см. код по адресу: https://github.com/kofifus/Combo

(код основан на шаблоне класса с https://github.com/kofifus/New )

Создать комбо очень просто! просто передайте div конструктору:

let mycombo=Combo.New(document.getElementById('myCombo'));
mycombo.options(['first', 'second', 'third']);

mycombo.onchange=function(e, combo) {
  let val=combo.value;
  // let val=this.value; // same as above
  alert(val);
 }
<script src="https://rawgit.com/kofifus/New/master/new.min.js"></script>
<script src="https://rawgit.com/kofifus/Combo/master/combo.min.js"></script>

<div id="myCombo" style="width:100px;height:20px;"></div>

кофифус
источник
Привет! Ваш фрагмент кода не запускается в iOS или Edge через StackOverflow.
PeakGen
3

Мое решение очень простое, выглядит точно как родное редактируемое поле со списком и все же работает даже в IE6 (некоторые ответы здесь требуют большого количества кода или внешних библиотек, и результат таков, например, текст в текстовом поле находится за выпадающим значком часть поля со списком или он вообще не похож на редактируемое поле со списком).

Дело в том, чтобы вырезать из поля со списком только значок раскрывающегося списка, который будет виден над текстовым полем. И текстовое поле немного шире под частью поля со списком, поэтому вы не видите его правый конец - визуально продолжается со списком: https://jsfiddle.net/dLsx0c5y/2/

select#programmoduleselect
{
    clip: rect(auto auto auto 331px);
    width: 351px;
    height: 23px;
    z-index: 101; 
    position: absolute;
}

input#programmodule
{
    width: 328px;
    height: 17px;
}

<table><tr>
<th>Programm / Modul:</th>
<td>
    <select id="programmoduleselect"
        onchange="var textbox = document.getElementById('programmodule'); textbox.value = (this.selectedIndex == -1 ? '' : this.options[this.selectedIndex].value); textbox.select(); fireEvent2(textbox, 'change');"
        onclick="this.selectedIndex = -1;">
        <option value=RFEM>RFEM</option>
        <option value=RSTAB>RSTAB</option>
        <option value=STAHL>STAHL</option>
        <option value=BETON>BETON</option>
        <option value=BGDK>BGDK</option>
    </select>
    <input name="programmodule" id="programmodule" value="" autocomplete="off"
        onkeypress="if (event.keyCode == 13) return false;" />
</td>
</tr></table>

(Используется изначально, например, здесь, но не отправляйте форму: old.dlubal.com/WishedFeatures.aspx)

РЕДАКТИРОВАТЬ: стили должны быть немного разными для macOS: Ch ​​в порядке, для FF увеличить высоту поля со списком, Safari и Opera игнорируют высоту поля со списком, поэтому увеличьте размер шрифта (имеет верхний предел, поэтому уменьшите текстовое поле '' высота немного): https://i.stack.imgur.com/efQ9i.png

Ладислав Зима
источник
Это сработало очень хорошо, и мне не пришлось беспокоиться о различиях в браузерах
cycle4passion
1

Учитывая, что тег HTML datalist до сих пор полностью не поддерживается, я использовал альтернативный подход - Dojo Toolkit ComboBox. . Это было проще реализовать и лучше задокументировать, чем другие варианты, которые я изучал. Он также хорошо работает с существующими фреймворками. В моем случае я без проблем добавил это поле со списком к существующему веб-сайту, основанному на Codeigniter и Bootstrap. Вам просто нужно обязательно применить тему Dojo (например, class = "correo") к родительскому элементу комбо вместо тега body. чтобы избежать конфликтов стилей.

Во-первых, включите CSS для одной из тем Dojo (например, «Claro»). Важно, чтобы файл CSS был включен до файлов JS ниже.

<link rel="stylesheet" href="https://ajax.googleapis.com/ajax/libs/dojo/1.9.6/dijit/themes/claro/claro.css" />

Затем подключите jQuery и Dojo Toolkit через CDN.

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/dojo/1.10.3/dojo/dojo.js"></script>

Затем вы можете просто следовать образцу кода Dojo или использовать образец ниже, чтобы получить работающее поле со списком.

<body>
    <!-- Dojo Dijit ComboBox with 'Claro' theme -->
    <div class="claro"><input id="item_name_1" class=""/></div>

    <script type="text/javascript">
        $(document).ready(function () {
            //In this example, dataStore is simply an array of JSON-encoded id/name pairs
            dataStore = [{"id":"43","name":"Domain Name Renewal"},{"id":"42","name":"Hosting Renewal"}];

            require(
                [ "dojo/store/Memory", "dijit/form/ComboBox", "dojo/domReady!"], 
                function (Memory, ComboBox) {
                    var stateStore = new Memory({
                        data: dataStore
                    });

                    var combo = new ComboBox({
                        id: "item_name_1",
                        name: "desc_1",
                        store: stateStore,
                        searchAttr: "name"},                        
                        "item_name_1"
                        ).startup();

                });

        });

    </script>
</body>
Flareman2020
источник
-1

Посмотрите ComboBox или Combo на этом сайте: http://www.jeasyui.com/documentation/index.php#

км
источник
1
Это не настоящее поле со списком, потому что вы не можете добавлять новые данные.
Arnout
Комбо на этой странице хуже, чем стандартный выбор HTML.
webzy
-2
    <html>
<head>
    <title></title>
    <script src="jquery-3.1.0.js"></script>
    <script>
        $(function () {
            $('#selectnumber').change(function(){
                alert('.val() = ' + $('#selectnumber').val() + '  AND  html() = ' + $('#selectnumber option:selected').html() + '  AND .text() = ' + $('#selectnumber option:selected').text());
            })
        });
    </script>
</head>
<body>
       <div>
        <select id="selectnumber">
            <option value="1">one</option>
            <option value="2">two</option>
            <option value="3">three</option>
            <option value="4">four</option>
        </select>

    </div>
   </body>
</html>

Нажмите, чтобы увидеть экран OutPut

Благодаря...:)

Бхану Пратап
источник
1
Всегда полезно включить некоторые детали или объяснения, почему ваш ответ работает.
Чарли Фиш,
1
Хотя этот фрагмент кода может решить вопрос, включение объяснения действительно помогает улучшить качество вашего сообщения. Помните, что вы отвечаете на вопрос читателей в будущем, и эти люди могут не знать причин вашего предложения кода. Также постарайтесь не загромождать свой код пояснительными комментариями, так как это снижает удобочитаемость как кода, так и пояснений!
Прощай, StackExchange
-2

Ни один из других ответов не был удовлетворительным, в основном потому, что пользовательский интерфейс все еще выглядит плохо. Я нашел это , которое выглядит хорошо и очень близко к совершенству, а также настраивается.

Полный список примеров и вариантов можно найти здесь , но вот базовая демонстрация:

$('#editable-select').editableSelect();
<link href="https://cdn.jsdelivr.net/npm/jquery-editable-select@2.2.5/dist/jquery-editable-select.min.css" rel="stylesheet"/>

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/jquery-editable-select@2.2.5/dist/jquery-editable-select.min.js"></script>

<select id="editable-select">
	<option>Alfa Romeo</option>
	<option>Audi</option>
	<option>BMW</option>
	<option>Citroen</option>
</select>

Андрей
источник
@maqs Я много оглядывался, когда нашел эту библиотеку, и ни одна из других библиотек или решений не имела полноценных решений, которые хорошо работали и выглядели одинаково независимо от платформы. На некоторых распространенных платформах многие решения выглядели совершенно ужасно.
Эндрю
@maqs Причина, по которой это не такая простая задача, заключается в том, что HTML не поддерживает ее из коробки, и поэтому каждый ее аспект, от внешнего вида до функциональности до обработки событий и конфигурации, должен быть как бы взломан вместе, чтобы работать вокруг ограничений HTML.
Эндрю