# The “textbox” role is unnecessary for an “input” element that has no “list” attribute and whose type is “text”.

> Canonical HTML version: https://rocketvalidator.com/html-validation/the-textbox-role-is-unnecessary-for-an-input-element-that-has-no-list-attribute-and-whose-type-is-text
> Attribution: Rocket Validator (https://rocketvalidator.com)
> License: CC BY 4.0 (https://creativecommons.org/licenses/by/4.0/)

When you use semantic HTML elements, browsers automatically assign appropriate ARIA roles behind the scenes. An `<input type="text">` element without a `list` attribute is inherently recognized by browsers and assistive technologies as a textbox — a control that accepts free-form text input. Explicitly declaring `role="textbox"` on such an element repeats information that is already conveyed natively, which is what the validator flags.

The distinction about the `list` attribute matters because when an `<input type="text">` *does* have a `list` attribute (linking it to a `<datalist>`), its implicit role changes to `combobox` rather than `textbox`. In that scenario, a `role="textbox"` would not only be redundant — it would actually be incorrect. The validator's message specifically targets the case where there is no `list` attribute, meaning the implicit role is already `textbox`.

### Why this is a problem

- **Redundancy clutters your code.** Adding roles that elements already possess makes HTML harder to read and maintain without providing any benefit.
- **Potential for confusion.** Other developers (or your future self) may wonder if the explicit role was added intentionally to override some other behavior, leading to unnecessary investigation.
- **Standards compliance.** The W3C and WAI-ARIA authoring practices recommend against setting ARIA roles that duplicate the native semantics of an element. The first rule of ARIA use is: "If you can use a native HTML element or attribute with the semantics and behavior you require already built in, instead of re-purposing an element and adding an ARIA role, state or property to make it accessible, then do so."
- **No accessibility benefit.** Assistive technologies already understand that `<input type="text">` is a textbox. The explicit role adds no additional information for screen readers or other tools.

### How to fix it

Simply remove the `role="textbox"` attribute from your `<input type="text">` element. The native semantics of the element are sufficient.

If you've added the role because the input is styled or behaves differently, consider whether you actually need a different element or a different ARIA pattern instead.

## Examples

### ❌ Incorrect: redundant `role="textbox"`

```html
<label for="username">Username</label>
<input type="text" id="username" role="textbox">
```

The `role="textbox"` is unnecessary here because `<input type="text">` without a `list` attribute already has an implicit role of `textbox`.

### ✅ Correct: no explicit role needed

```html
<label for="username">Username</label>
<input type="text" id="username">
```

### ✅ Also correct: input with `list` attribute (different implicit role)

```html
<label for="color">Favorite color</label>
<input type="text" id="color" list="colors">
<datalist id="colors">
  <option value="Red">
  <option value="Green">
  <option value="Blue">
</datalist>
```

In this case, the `list` attribute changes the implicit role to `combobox`, so the validator warning about a redundant `textbox` role would not apply. Note that adding `role="textbox"` here would be *incorrect* rather than merely redundant, since it would override the proper `combobox` semantics.

### ❌ Incorrect: redundant role on implicit text input

```html
<label for="search-field">Search</label>
<input id="search-field" role="textbox">
```

When the `type` attribute is omitted, `<input>` defaults to `type="text"`, so the implicit role is still `textbox` and the explicit role remains redundant.

### ✅ Correct: let the default type handle semantics

```html
<label for="search-field">Search</label>
<input id="search-field">
```
