2008-11-05 9 views
40

Chciałbym utworzyć pole tekstowe z listą rozwijaną, która pozwala użytkownikowi wybrać pewne predefiniowane wartości. Użytkownik powinien również mieć możliwość wpisania nowej wartości lub wyboru predefiniowanego z listy rozwijanej. Wiem, że mogę użyć dwóch widgetów do tego, ale w mojej aplikacji byłoby bardziej ergonomiczne, gdyby było zunifikowane w jednym widżecie.Jak utworzyć edytowalną listę rozwijaną w HTML?

Czy istnieje standardowy widget lub czy muszę używać zewnętrznego javascript?

Co z przenośnością przeglądarki?

Odpowiedz

15

Najlepszym sposobem na zrobienie tego jest prawdopodobnie użycie biblioteki innej firmy.

Istnieje implementacja tego, czego szukasz w jQuery UI i dojo. jQuery jest bardziej popularny, ale dojo pozwala na deklaratywne definiowanie widgetów w HTML, co brzmi bardziej jak to, czego szukasz.

Który z nich będzie używany, zależy od Twojego stylu, ale oba są opracowane do pracy w różnych przeglądarkach i oba będą aktualizowane częściej niż kopiowanie i wklejanie kodu.

+0

inny zestaw danych polyfill tutaj https://github.com/wet-boew/wet-boew – kofifus

1

Nie jestem pewien, czy jest sposób, aby zrobić to automatycznie bez JavaScriptu.

To, czego potrzebujesz, to coś, co działa po stronie przeglądarki, aby przesłać formularz do serwera, gdy użytkownik dokona wyboru - stąd javascript.

Upewnij się, że masz alternatywne środki (to znaczy przycisk przesyłania) dla tych, którzy mają wyłączony javascript.

Dobrym przykładem: Combo-Box Viewer

miałem nawet bardziej wyrafinowane combo-box wczoraj, z tym dhtmlxCombo, używając ajax pobrać stosowne wartości amongst dużej ilości danych.

8

Znacznik <select> zezwala tylko na użycie wstępnie zdefiniowanych wpisów. Typowym rozwiązaniem problemu jest umieszczenie jednego wpisu o nazwie "Inne" i wyłączone pole edycji (<input type="text"). Dodaj trochę kodu JavaScript, aby włączyć pole edycyjne tylko po wybraniu "Inne".

Możliwe może być utworzenie menu rozwijanego, które umożliwia bezpośrednią edycję, ale IMO nie jest warte wysiłku. Gdyby tak było, Amazon, Google lub Microsoft by to robili ;-) Po prostu załatwiaj sprawę za pomocą najmniej skomplikowanego rozwiązania. Jest szybszy (twój szef może to lubić) i zwykle łatwiejszy w utrzymaniu (możesz to lubić).

+0

Google Reader faktycznie ma to teraz, w rozwijanym w pobliżu pola wyszukiwania. –

1

Comobox jest niestety czymś, co zostało pominięte w specyfikacjach HTML.

Jedynym sposobem na to, aby zarządzać, raczej niestety, jest rolowanie własnych lub używanie gotowych. This one wygląda dość prosto. Używam aplikacji this one do aplikacji open source, chociaż niestety musisz płacić za wykorzystanie komercyjne.

83

Możesz to zrobić, używając tagu <datalist> w HTML5.

<input type="text" name="product" list="productName"/> 
<datalist id="productName"> 
    <option value="Pen">Pen</option> 
    <option value="Pencil">Pencil</option> 
    <option value="Paper">Paper</option> 
</datalist> 

Po dwukrotnym kliknięciu na tekst wejściowy w przeglądarce pojawi się lista z określoną opcją.

+9

Tag datalist jest [jeszcze nie obsługiwany przez wszystkie przeglądarki] (http://caniuse.com/datalist) –

+4

@JamesNewton Ale to wciąż właściwy sposób na zrobienie tego IMO. Możesz użyć [** some plugin **] (https://miketaylr.com/code/datalist.html), więc twoja implementacja będzie przeglądarką i będzie odporna na przyszłość :) – cvsguimaraes

+1

@JamesNewton zbliżamy się do 2017 - to jest doskonałe rozwiązanie teraz. –

1

Trochę CSS i gotowe fiddle

<div style="position: absolute;top: 32px; left: 430px;" id="outerFilterDiv"> 
<input name="filterTextField" type="text" id="filterTextField" tabindex="2" style="width: 140px; 
    position: absolute; top: 1px; left: 1px; z-index: 2;border:none;" /> 
     <div style="position: absolute;" id="filterDropdownDiv"> 
<select name="filterDropDown" id="filterDropDown" tabindex="1000" 
    onchange="DropDownTextToBox(this,'filterTextField');" style="position: absolute; 
    top: 0px; left: 0px; z-index: 1; width: 165px;"> 
    <option value="-1" selected="selected" disabled="disabled">-- Select Column Name --</option> 
</select> 

+0

Interesujący hack :) Ale twoje skrzypce właściwie nie pozwala wybrać czegoś z listy. To zdecydowanie potrzebuje trochę javascript do pracy. –

+1

wymaga pracy javascript? TAK – atom217

+4

Należy zdefiniować funkcję "DropDownTextToBox". Ale nie zdefiniowałeś tego w swoim skrzypcach. –

6

Bardzo prosta implementacja (tylko podstawowa funkcjonalność) oparta na CSS i jedna linia kodu JS

<div class="dropdown"> 
    <input type="text" /> 
    <select onchange="this.previousElementSibling.value=this.value; this.previousElementSibling.focus()"> 
     <option>This is option 1</option> 
     <option>Option 2</option> 
    </select> 
</div> 

Uwaga: używa previousElementSibling który nie jest obsługiwany in older browsers (below IE9)

.dropdown { 
    position: relative; 
    width: 200px; 
} 
.dropdown select 
{ 
    width: 100%; 
} 
.dropdown > * { 
    box-sizing: border-box; 
    height: 1.5em; 
} 
.dropdown select { 
} 
.dropdown input { 
    position: absolute; 
    width: calc(100% - 20px); 
} 

tutaj jest na JSFiddle

+2

Kod należy również uwzględnić w odpowiedzi, abyśmy nie musieli odwiedzać innej witryny, która mogłaby zniknąć. – titanofold

+0

Link rot to cancer! – jpaugh

+0

Po co używać 'this.previousElementSibling', a nie' document.getElementById() '?? To sprawi, że będzie obsługiwany przez kilka starszych przeglądarek. – WuerfelDev

17

ten może zostać osiągnięty za pomocą zwykły HTML, CSS i JQuery. Stworzyłem stronę próbną:

$(document).ready(function(){ 
 
    
 
    $(".editableBox").change(function(){   
 
     $(".timeTextBox").val($(".editableBox option:selected").html()); 
 
    }); 
 
});
.editableBox { 
 
    width: 75px; 
 
    height: 30px; 
 
} 
 

 
.timeTextBox { 
 
    width: 54px; 
 
    margin-left: -78px; 
 
    height: 25px; 
 
    border: none; 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<div class="wrapper"> 
 
    <select class="editableBox">   
 
     <option value="1">01:00</option> 
 
     <option value="2">02:00</option> 
 
     <option value="3">03:00</option> 
 
     <option value="4">04:00</option> 
 
     <option value="5">05:00</option> 
 
     <option value="6">06:00</option> 
 
     <option value="7">07:00</option> 
 
     <option value="8">08:00</option> 
 
     <option value="9">09:00</option> 
 
     <option value="10">10:00</option> 
 
     <option value="11">11:00</option> 
 
     <option value="12">12:00</option> 
 
     <option value="13">13:00</option> 
 
     <option value="14">14:00</option> 
 
     <option value="15">15:00</option> 
 
     <option value="16">16:00</option> 
 
     <option value="17">17:00</option> 
 
     <option value="18">18:00</option> 
 
     <option value="19">19:00</option> 
 
     <option value="20">20:00</option> 
 
     <option value="21">21:00</option> 
 
     <option value="22">22:00</option> 
 
     <option value="23">23:00</option> 
 
     <option value="24">24:00</option> 
 
    </select> 
 
    <input class="timeTextBox" name="timebox" maxlength="5"/> 
 
</div>

+2

Pamiętaj, że dla każdego, kto to skanuje, jQuery jest właśnie używany do kopiowania wyboru z listy rozwijanej do pola tekstowego; "tajny sos" (zaimplementowany [gdzie indziej na tej stronie] (http://stackoverflow.com/a/31474567/3229684)) to tylko 20px gap, aby zobaczyć/kliknąć strzałkę rozwijaną. –