# 자동완성 적용 사례

### combobox = input + listbox

![](https://3414272834-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LL2w96d4fwoeh4NDyDr%2F-LRV_SAissHQKtND9Uon%2F-LRV_Yeli6AO-VI9iiZv%2Fimage.png?alt=media\&token=3da662b0-07cf-4223-8965-6aea47d3dbfa)

출도착 도시 및 공항을 선택할 때 자동완성 기능을 사용할 수 있으며 키보드로 사용이 가능하다. 자동완성 컨테이너는`role="combobox"`를 가지게 되고, 검색결과가 표출되는 영역은 `role="listbox"`를 가진다.&#x20;

combobox는 input과 listbox의 조합으로 각 위젯의 키보드 인터랙션 방법으로 사용할 수 있어야 한다. 또한 자동완성 기능이 포함되어 있으므로 검색결과를 스크린리더에서도 읽을 수 있어야 한다.

### role="combobox"

상단 input에는 `role="combobox"`를 삽입하고 aria-autocomplete는 list를 삽입한다.\
하단 listbox가 펼쳐질 때는 `aria-expanded="true"`, 닫혀졌을 때는 false가 삽입된다.  검색된 결과를 읽어줄 수 있게 비어있는 \<div>요소에 `role="status"`와 `aria-live="polite"`를 삽입한다.

![](https://3414272834-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LL2w96d4fwoeh4NDyDr%2F-LSmK5kYuX6kv1Acn2ud%2F-LSmKQdZXt1epFhaJfoW%2Fimage.png?alt=media\&token=b20ffab7-f04b-41d5-bf46-db6b1de6791d)

```markup
<input type="text" role="combobox" aria-autocomplete="list" aria-expanded="false" 
 aria-owns="결과 리스트박스 id" aria-activedescentant="선택된 리스트박스의 옵션 id">
 //검색결과 읽는 영역
 <div role="status" aria-live="polite"></div>
```

#### aria-owns (나와 내 아이들과의 연결고리)

aria-owns 속성은 시각적으로는 어떤 하위 메뉴가 상위 메뉴 근처에 배치되어 있지만, DOM 상위 항목의 바로 하위 항목일 수는 없는 경우에는 `aria-owns`를 사용하여 하위 메뉴를 상위 메뉴의 하위 메뉴로 스크린 리더에 알려줄 때 사용할 수 있다.

#### aria-activedescendant (현재 선택된 내 아이)

input 에 현재 하위 항목 중 선택된 값을 스크린리더에게 알려줄 때 aria-activedescendant 를 사용할 수 있다. 현재 선택한 목록 항목에 맞춰 계속 업데이트된 상태로 나타낼 수 있으며 스크린리더는 현재 선택한 항목이 마치 포커스된 항목인 것처럼 나타나게 할 수 있습니다.

### role="listbox"

![](https://3414272834-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LL2w96d4fwoeh4NDyDr%2F-LSmhLfmku1eskXBQF8e%2F-LSmhMbaeLZCxu-3dXhC%2Fimage.png?alt=media\&token=729c3051-d0df-44c0-adfe-5ddfd620c02f)

하위 영역 컨테이너는 `role="listbox"`와 상위 input의 aria-owns와 연결되는 id 값을 가지고, 각각의 하위 리스트는 `role="option"` 과 선택되었을 때는 `aria-selected="true"`와 상위 input에 삽입된 aria-activedescendant 속성과와 연결되는 id값을 가지게 되고, 선택되지 않았을 때는 `aria-selected="false"`를 가진다.

```markup
<ul role="listbox" id="xxx">
    <li role="option" aria-selected="true">A Coruna(LCG)</li>
    <li role="option" aria-selected="false">Dallas/Love Field(DAL), TX</li>
    <li role="option" aria-selected="false">Gran Canaria(LPA)</li>
    <li role="option" aria-selected="false">La Crosse(LSE),WI</li>
    <li role="option" aria-selected="false">Lafayette(LFT),LA</li>
</ul>
```

### 복잡한 키보드 인터랙션

`role="combobox"`는 스크린리더 사용자가 일반적으로 기대하고 있는 키보드 인터랙션이 있으며 아래와 같다.&#x20;

* **Alt + 아래 방향키** : 비어있는 input에서 리스트가 닫혀있을 때 열린다.
* **Enter or Space bar** : 리스트에서 Enter와 Space bar를 누르면 항목은 선택되고 리스트는 닫힌다.
* **상하 방향키** : 리스트 내에서 위아래로 탐색한다.
* **ESC** : 리스트박스가 닫히고 input 내의 텍스트는 삭제된다.
* 비어있는 input에 알파벳을 한 개씩 누르면 매칭되는 결과값만 리스트에 남는다. (Native 셀렉트박스와 동일한 기능)

스크린리더로 LAX (로스앤젤레스)을 한 글자씩 입력하다가 리스트를 탐색해보면 아래와 같이 들린다.

> 출발지 combobox 닫혀짐\
> 편집창 자동완성\
> &#xNAN;_**L**_\
> 24개의 검색 결과가 있습니다.\
> 펼쳐짐\
> &#xNAN;_**A**_ \
> 6개의 검색 결과가 있습니다.\
> La Crosse(LSE), WI\
> Lafayette(LFT), LA\
> Lansing(LAN), MI\
> Las Vegas(LAS), NV, McCarran\
> Los Angeles(LAX), CA\
>

{% embed url="https://youtu.be/5NYGkMG36mA" %}

#### <mark style="color:orange;">AOA동영강 강의</mark>

{% embed url="https://youtu.be/uZ5ttPknnJw" %}
