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?


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>


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> 

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

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/


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>


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


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>


-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...:)


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/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 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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.