항목 입력 옵션이있는 HTML 콤보 상자


82

이미 목록에있는 값을 선택하는 것 외에 콤보 상자에 입력 할 수 있다는 인상을 받았습니다. 그러나이 작업을 수행하는 방법에 대한 정보를 찾을 수없는 것 같습니다. 텍스트를 입력 할 수 있도록 추가해야하는 속성이 있습니까?


4
아니, 당신은 자바 스크립트 나 다른 마법 없이는 이것을 할 수 없습니다. 그 자체로는 <select>요소가 그렇게 할 수 없습니다.
j08691

감사합니다. 어쩌면 나는 jQuery 컨트롤을 찾을 것입니다.
birdus

고려 변화 는 HTML5를 생각하면 허용 대답을 list속성이 작업을 수행합니다.
laggingreflex

나는 이것이 몇 년 전이라는 것을 알고 있지만 여전히 어리둥절합니다. 콤보 상자로 알려진 것을 만들기 위해 어떤 코드를 사용 했습니까?
Stewart

@Stewart - 사색 : OP의 표현 개념의 흔들림 제안 dropdown과 함께 combo box. <select>과 함께 사용 되며 <option>빈 옵션이 선택된 상태로 시작됩니다. 여기에는 값 목록이 있으며 "콤보 상자처럼 보입니다"; 텍스트 영역에 입력하는 기능이 부족합니다.
ToolmakerSteve

답변:


113

이전에 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 요소

datalist요소는이 개념에 더 나은 메커니즘을 제공하기위한 것입니다. 일부 브라우저 (예 : iOS Safari <12.2)에서는 지원되지 않거나 구현에 문제가 있습니다. Can I Use 페이지를 확인하여 현재 데이터 목록 지원을 확인하십시오 .

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


구식이지만 실용적입니다.
maqs

1
(Windows의 Chrome, 현재 버전) 사용자가 텍스트 상자에 입력을 시작하면 해당 텍스트가 드롭 다운에 표시되는 항목에 대한 필터 가 됩니다. 용납 할 수없는 문제 : 항목이 선택되면 해당 선택 항목이 필터가됩니다! 코드 조각에서 "A"를 선택합니다. 이제 드롭 다운을 다시 엽니 다. "A"만 옵션으로 표시됩니다 !! 그것은 콤보 상자가 작동하는 방식 이 아닙니다 . 있는 그대로 유용하지 않습니다. AFAIK,이를 수정하려면 드롭 다운을 열 때 JS가 텍스트 영역을 지우도록해야합니다. (여기에있는 다른 모든 "데이터 목록"답변에는 동일한 치명적인 결함 인 AFAIK가 있습니다.)
ToolmakerSteve

... 명확하지 않은 경우을 기반으로 두 번째 솔루션에 대해 언급하고 datalist있습니다.
ToolmakerSteve

59

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
크리스토프 Szalay

2
Can I Use 에 따르면 Safari 8은 데이터 목록을 지원하지 않습니다. MDN도 마찬가지입니다.
Darren Griffith

2
그리고 Safari 9도 마찬가지입니다. What 's up Apple?
Sam Washburn

3
이것은 Safari에서 어떻게 저하됩니까?
William Entriken

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
이 링크가 질문에 답할 수 있지만 여기에 답변의 필수 부분을 포함하고 참조 용 링크를 제공하는 것이 좋습니다. 링크 된 페이지가 변경되면 링크 전용 답변이 무효화 될 수 있습니다.
Joel

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

@Andre : 죄송합니다. 새 링크에 대한 정보가 없습니다. JSFiddle이 당신을 위해 트릭을 수행하기를 바랍니다.
레몬 주스

4

음, 2016 년이고 콤보를 할 수있는 쉬운 방법이 아직 없습니다 ... 확실히 데이터 목록이 있지만 safari / ios 지원 없이는 실제로 사용할 수 없습니다. 적어도 우리는 ES6 ..을 가지고 있습니다. 아래는 div 또는 span을 래핑하는 콤보 클래스에 대한 시도입니다. 입력 상자를 선택 위에 놓고 관련 이벤트를 바인딩하여 콤보로 전환합니다.

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>


안녕하세요, 귀하의 코드 스니퍼는 StackOverflow를 통해 iOS 또는 Edge에서 실행되지 않습니다.
레몬 주스


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")를 적용해야합니다. 스타일 충돌을 방지합니다.

먼저 Dojo 테마 중 하나에 대한 CSS를 포함합니다 (예 : 'Claro'). CSS 파일이 아래의 JS 파일보다 먼저 포함되는 것이 중요합니다.

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

다음으로 CDN을 통해 jQuery 및 Dojo Toolkit 포함

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

다음으로 Dojo의 샘플 코드를 따르 거나 아래 샘플을 사용하여 작동하는 콤보 상자를 얻을 수 있습니다.

<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
이 코드 스 니펫은 질문을 해결할 수 있지만 설명을 포함하면 게시물의 품질을 향상시키는 데 큰 도움이됩니다. 미래에 독자를 위해 질문에 답하고 있으며 해당 사용자는 코드 제안 이유를 모를 수 있습니다. 코드와 설명의 가독성을 떨어 뜨리므로 설명 주석으로 코드를 혼잡하게 만들지 마십시오!
Goodbye StackExchange

-2

다른 답변 중 어느 것도 만족스럽지 않았습니다. 주로 UI가 여전히 나빠 보이기 때문입니다. 나는 이것이 좋아 보이고 완벽하고 사용자 정의가 가능한 것에 매우 가깝다는 것을 발견 했습니다 .

예제 및 옵션의 전체 목록은 여기 에서 찾을 수 있지만 기본 데모는 다음과 같습니다.

$('#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 나는 많은 주위를 둘러 보았다 것도 잘 작용하고 플랫폼에 관계없이 같은 모습 전체 솔루션은 거기에서 다른 라이브러리 나 솔루션. 일부 공통 플랫폼에서는 많은 솔루션이 절대적으로 끔찍해 보였습니다.
Andrew

@maqs 작업이 그렇게 간단하지 않은 이유는 HTML이 즉시 지원하지 않기 때문입니다. 따라서 외관에서 기능, 이벤트 처리 및 구성에 이르기까지 모든 측면을 함께 해킹해야 작동합니다. HTML의 한계에 대해.
Andrew
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.