Поле зі списком 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.