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


83

У мене склалося враження, що ви можете ввести в поле зі списком, крім того, щоб вибрати будь-які значення, що вже є у списку. Однак я не можу знайти інформацію про те, як це зробити. Чи потрібно до нього додати властивість, щоб дозволити друкувати текст?


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Елемент призначений для забезпечення кращого механізму цієї концепції. У деяких веб-переглядачах, наприклад 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". Тепер знову відкрийте випадаюче меню: ТІЛЬКИ "А" відображається як варіант !! Це НЕ як працює зі списком; це не корисно як є. 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

Ви маєте рацію, однак я думаю, що це буде підтримано найближчим часом, оскільки це частина стандарту HTML5 (наразі кандидат). w3.org/TR/2012/CR-html5-20121217
Крістоф Шалай,

2
Відповідно до Чи можу я використовувати , Safari 8 не підтримує даталіст. 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
Хоча це посилання може відповісти на питання, краще включити сюди основні частини відповіді та надати посилання для довідки. Відповіді лише на посилання можуть стати недійсними, якщо пов’язана сторінка зміниться.
Джоель

6

dojoПриклад тут не працює стосовно до існуючого коду в більшості випадків. Тому мені довелося знайти альтернативу, знайдену тут - hxxp: //technologymantrablog.com/how-to-create-a-combo-box-with-text-input-jquery-autocomplete/ (тепер вказує на спам-сайт або гірше )

archive.org (не дуже корисно)

Ось jsfiddle - https://jsfiddle.net/ze7fgby7/


1
Це працює з Safari, на відміну від майже всього іншого.
Atte Juvonen

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 досі не підтримується повністю, альтернативним підходом, який я використав, є Dojo Toolkit ComboBox . Це було легше реалізувати та краще задокументовано, ніж інші варіанти, які я досліджував. Він також чудово грає з існуючими фреймворками. У моєму випадку я додав цей комбобокс до існуючого веб-сайту, який базується на Codeigniter та Bootstrap без проблем. Просто потрібно обов’язково застосувати тему Dojo (наприклад, class = "claro") до батьківського елемента комбо замість тегу 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>

Далі ви можете просто слідувати зразку коду Доджо або скористатися зразком нижче, щоб отримати працюючий комбобокс.

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


-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
Завжди корисно включити детальну інформацію чи пояснення, чому ваша відповідь працює.
Charlie Fish

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.
Ендрю
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.