Pole kombi HTML z opcją wpisania wpisu

83

Wydawało mi się, że można wpisać w polu kombi oprócz wyboru wartości znajdujących się już na liście. Jednak nie mogę znaleźć informacji, jak to zrobić. Czy jest jakaś właściwość, którą muszę dodać, aby umożliwić wpisywanie tekstu?

birdus
źródło
4
Nie, nie możesz tego zrobić bez jakiegoś JavaScript lub innej magii. Sam <select>element nie może tego zrobić.
j08691
Dziękuję Ci. Może wtedy poszukam kontrolki jQuery.
birdus
Rozważ zmianę zaakceptowanej odpowiedzi, jeśli uważasz, że listatrybut HTML5 spełnia swoje zadanie.
laggingreflex
Zdaję sobie sprawę, że to było lata temu, ale nadal jestem zdziwiony. Jakiego kodu użyłeś do stworzenia czegoś, co jest rzekomo polem kombi?
Stewart
@Stewart - spekulacje: sformułowanie OP sugeruje zacieranie się pojęcia dropdownz combo box. Prawdopodobnie używany <select>z <option>wybraną pustą opcją. Zawiera listę wartości i „wygląda jak pole kombi”; po prostu brakuje mu możliwości wpisywania w polu tekstowym.
ToolmakerSteve

Odpowiedzi:

116

Wcześniej datalist(patrz uwaga poniżej) należałoby zapewnić dodatkowy inputelement, aby ludzie mogli wpisać własną opcję.

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

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

Ten mechanizm działa we wszystkich przeglądarkach i nie wymaga JavaScript .

Możesz użyć trochę JavaScript, aby sprytnie pokazać tylko inputopcję „Inne”.

Element datalist

datalistElementem jest zapewnienie lepszego mechanizmu tej koncepcji. W niektórych przeglądarkach, np. IOS Safari <12.2, nie było to obsługiwane lub implementacja miała problemy. Sprawdź stronę Can I Use, aby zobaczyć aktualne wsparcie dla datalist .

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

Fenton
źródło
Stara szkoła, ale praktyczna.
maqs
4
(Chrome w systemie Windows, aktualna wersja) Należy pamiętać, że gdy użytkownik zacznie pisać w polu tekstowym, tekst ten stanie się filtrem elementów wyświetlanych na liście rozwijanej. Niedopuszczalny błąd: po wybraniu elementu ten wybór staje się filtrem! We fragmencie kodu wybierz „A”. Teraz otwórz ponownie menu: TYLKO „A” jest wyświetlane jako opcja !! To jest nie jak działa pole kombi; nie jest użyteczne w obecnej postaci. AFAIK, naprawienie tego wymaga od JS wyczyszczenia obszaru tekstowego po otwarciu listy rozwijanej. (Wszystkie inne odpowiedzi „datalist” mają tę samą fatalną wadę, AFAIK.)
ToolmakerSteve
... jeśli nie jest to jasne, komentuję drugie rozwiązanie, oparte na datalist.
ToolmakerSteve
60

w HTML robisz to od tyłu: definiujesz wejście tekstu:

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

i dołącz do niego datalist. (zwróć uwagę na atrybut listy wejścia).

<datalist id="browsers">
  <option value="Internet Explorer">
  <option value="Firefox">
  <option value="Chrome">
  <option value="Opera">
  <option value="Safari">
</datalist> 
Kristóf Szalay
źródło
10
Nie jest to obsługiwane w przeglądarce Safari.
trpt4him
Masz rację, ale myślę, że będzie to obsługiwane w najbliższej przyszłości, ponieważ jest częścią standardu HTML5 (obecnie kandydat). w3.org/TR/2012/CR-html5-20121217
Kristóf Szalay
2
Zgodnie z Can I Use Safari 8 nie będzie obsługiwać danych. MDN mówi to samo.
Darren Griffith
2
Safari też nie działa. Co słychać Apple?
Sam Washburn
3
Jak to się pogarsza w Safari?
William Entriken
22

Ten link może Ci pomóc: http://www.scriptol.com/html5/combobox.php

Masz dwa przykłady. Jeden w html4, a drugi w 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;
 }
Celso Soares
źródło
6
Chociaż ten link może odpowiedzieć na pytanie, lepiej jest zawrzeć tutaj zasadnicze części odpowiedzi i podać link do odniesienia. Odpowiedzi zawierające tylko łącze mogą stać się nieprawidłowe, jeśli połączona strona ulegnie zmianie.
Joel
6

dojoPrzykład tutaj nie działają, gdy stosowane do istniejącego kodu w większości przypadków. Dlatego musiałem znaleźć alternatywę, znalezioną tutaj - hxxp: //technologymantrablog.com/how-to-create-a-combo-box-with-text-input-jquery-autocomplete/ (teraz wskazuje na stronę ze spamem lub gorzej )

archive.org (niezbyt przydatne)

Oto jsfiddle - https://jsfiddle.net/ze7fgby7/

PeakGen
źródło
1
Działa to z Safari, w przeciwieństwie do prawie wszystkiego innego.
Atte Juvonen
1
To jest cholernie niesamowite człowieka .. I dałoby to 10 upvotes gdybym mógł .. Uchwyty wszystko oh tak doskonale ..!
Abhishek Jebaraj
1
Link już niestety nie działa (czy znasz nowy link?), Ale jsfiddle jest bardzo przydatny.
Andre
@Andre: Przepraszamy, nie mam pojęcia o nowym linku. Mam nadzieję, że JSFiddle załatwi sprawę za Ciebie.
PeakGen
4

Cóż, jest rok 2016 i nadal nie ma łatwego sposobu na zrobienie kombinacji ... na pewno mamy datalist, ale bez obsługi safari / ios nie jest to naprawdę użyteczne. Przynajmniej mamy ES6 .. poniżej jest próbą zastosowania klasy combo, która zawija element div lub span, zamieniając go w combo, umieszczając pole wejściowe na górze selekcji i wiążąc odpowiednie zdarzenia.

zobacz kod na: https://github.com/kofifus/Combo

(kod opiera się na wzorcu klasy z https://github.com/kofifus/New )

Tworzenie combo jest łatwe! po prostu przekaż element div do jego konstruktora:

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>

kofifus
źródło
Cześć, Twój snipper kodu nie działa w iOS lub Edge przez StackOverflow.
PeakGen
3

Moje rozwiązanie jest bardzo proste, wygląda dokładnie jak natywny edytowalny combobox, a jednak działa nawet w IE6 (niektóre odpowiedzi tutaj wymagają dużej ilości kodu lub zewnętrznych bibliotek i wynik jest taki, np. Tekst w polu tekstowym znajduje się za rozwijaną ikoną części combobox lub w ogóle nie wygląda jak edytowalny combobox).

Chodzi o to, aby przyciąć combobox tylko ikonę rozwijaną, aby była widoczna nad polem tekstowym. Pole tekstowe jest nieco szersze pod częścią combobox, więc nie widać jego właściwego końca - wizualnie kontynuuje combobox: 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>

(Używany pierwotnie np. Tutaj, ale nie wysyłaj formularza: old.dlubal.com/WishedFeatures.aspx)

EDYCJA: Style muszą być trochę inne dla macOS: Ch ​​jest ok, dla FF zwiększ wysokość combobox, Safari i Opera ignorują wysokość combobox, więc zwiększ rozmiar czcionki (ma górny limit, więc zmniejsz pole tekstowe) wysokość): https://i.stack.imgur.com/efQ9i.png

Ladislav Zima
źródło
To działało bardzo dobrze, ponieważ nie
musiałem
1

Biorąc pod uwagę, że znacznik datalist HTML nadal nie jest w pełni obsługiwany, alternatywnym podejściem, którego użyłem, jest Dojo Toolkit ComboBox . Było łatwiejsze do wdrożenia i lepiej udokumentowane niż inne opcje, które badałem. Dobrze współpracuje również z istniejącymi frameworkami. W moim przypadku dodałem ten zestaw do istniejącej witryny internetowej opartej na Codeigniter i Bootstrap bez żadnych problemów. Wystarczy upewnić się, że zastosowałeś motyw Dojo (np. Class = "claro") do elementu nadrzędnego combo zamiast tagu body aby uniknąć konfliktów stylizacji.

Najpierw dołącz CSS dla jednego z motywów Dojo (np. „Claro”). Ważne jest, aby plik CSS był dołączony przed poniższymi plikami JS.

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

Następnie dołącz jQuery i Dojo Toolkit przez 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>

Następnie możesz po prostu śledzić za przykładowym kodem Dojo lub skorzystać z przykładu poniżej, aby uzyskać działający combobox.

<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
źródło
-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>

Kliknij, aby zobaczyć ekran OutPut

Dzięki...:)

Bhanu Pratap
źródło
1
Zawsze dobrze jest dołączyć jakieś szczegóły lub wyjaśnienie, dlaczego twoja odpowiedź działa.
Charlie Fish
1
Chociaż ten fragment kodu może rozwiązać problem, dołączenie wyjaśnienia naprawdę pomaga poprawić jakość Twojego posta. Pamiętaj, że odpowiadasz na pytanie do czytelników w przyszłości, a osoby te mogą nie znać powodów, dla których zaproponowałeś kod. Prosimy również starać się nie wypełniać kodu komentarzami wyjaśniającymi, ponieważ zmniejsza to czytelność zarówno kodu, jak i wyjaśnień!
Goodbye StackExchange
-2

Żadna z pozostałych odpowiedzi nie była satysfakcjonująca, głównie dlatego, że interfejs użytkownika nadal wygląda źle. Znalazłem to , które wygląda dobrze i jest bardzo bliskie doskonałości, a także możliwości dostosowania.

Pełną listę przykładów i opcji i takich można znaleźć tutaj , ale tutaj jest podstawowe demo:

$('#editable-select').editableSelect();
<link href="https://cdn.jsdelivr.net/npm/[email protected]/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/[email protected]/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>

Andrzej
źródło
@maqs Dużo się rozglądałem, kiedy znalazłem tę bibliotekę i żadna z innych bibliotek ani rozwiązań nie zawierała pełnych rozwiązań, które działały dobrze i wyglądały tak samo niezależnie od platformy. Na niektórych popularnych platformach wiele rozwiązań wyglądało okropnie.
Andrew
@maqs Powodem, dla którego nie jest to takie proste w zadaniu, jest to, że HTML nie obsługuje go od razu po wyjęciu z pudełka, więc każdy jego aspekt, od wyglądu po funkcjonalność, po obsługę zdarzeń i konfigurację, musi być trochę zhakowany, aby działał wokół ograniczeń HTML.
Andrew