# Bad value “” for attribute “name” on element “a”: An ID must not be the empty string.

> Canonical HTML version: https://rocketvalidator.com/html-validation/bad-value-for-attribute-name-on-element-a-an-id-must-not-be-the-empty-string
> Attribution: Rocket Validator (https://rocketvalidator.com)
> License: CC BY 4.0 (https://creativecommons.org/licenses/by/4.0/)

The `name` attribute on `<a>` elements was historically used to create named anchors — fragment targets that could be linked to with `href="#anchorName"`. In modern HTML (the WHATWG living standard), the `name` attribute on `<a>` is considered obsolete for this purpose. The `id` attribute is now the standard way to create fragment targets, and it can be placed on any element, not just `<a>` tags.

Regardless of whether you use `name` or `id`, the value must be a non-empty string. The W3C validator enforces this rule because an empty identifier serves no functional purpose — it cannot be referenced by a fragment link, it cannot be targeted by JavaScript, and it creates invalid markup. Browsers may silently ignore it, but it pollutes the DOM and signals a likely mistake in the code.

Empty `name` attributes often appear in content migrated from older CMS platforms or WYSIWYG editors that inserted placeholder anchors like `<a name=""></a>`. They can also result from templating systems where a variable intended to populate the attribute resolved to an empty string.

### Why this matters

- **Standards compliance:** Both the WHATWG HTML living standard and the W3C HTML specification require that identifier-like attributes (`id`, `name`) must not be empty strings.
- **Accessibility:** Screen readers and assistive technologies may attempt to process named anchors. Empty identifiers create noise without providing any navigational value.
- **Functionality:** An empty `name` or `id` cannot be used as a fragment target, so the element is effectively useless as a link destination.

### How to fix it

1. **Remove the element entirely** if the empty anchor serves no purpose — this is the most common fix.
2. **Replace `name` with `id`** and provide a meaningful, non-empty value if you need a fragment target.
3. **Move the `id` to a nearby semantic element** instead of using a standalone empty `<a>` tag. For example, place the `id` directly on a heading, section, or paragraph.
4. **Ensure uniqueness** — every `id` value in a document must be unique.

## Examples

### ❌ Empty `name` attribute triggers the error

```html
<a name=""></a>
<h2>Introduction</h2>
<p>Welcome to the guide.</p>
```

### ❌ Empty `name` generated by a template

```html
<a name=""></a>
<p>This anchor was meant to be a target but the value is missing.</p>
<a href="#">Jump to section</a>
```

### ✅ Remove the empty anchor if it's unnecessary

```html
<h2>Introduction</h2>
<p>Welcome to the guide.</p>
```

### ✅ Use `id` on the target element directly

```html
<h2 id="introduction">Introduction</h2>
<p>Welcome to the guide.</p>

<!-- Link to the section from elsewhere -->
<a href="#introduction">Go to Introduction</a>
```

### ✅ Use `id` on a standalone anchor if needed

If you need a precise anchor point that doesn't correspond to an existing element, use an `<a>` tag with a valid, non-empty `id`:

```html
<a id="section-start"></a>
<p>This paragraph follows the anchor point.</p>

<a href="#section-start">Jump to section start</a>
```

### ✅ Migrate legacy `name` to `id`

If your existing code uses the obsolete `name` attribute with a valid value, update it to use `id` instead:

```html
<!-- Before (obsolete but was valid in HTML4) -->
<a name="contact"></a>

<!-- After (modern HTML) -->
<a id="contact"></a>

<!-- Even better: put the id on a semantic element -->
<h2 id="contact">Contact Us</h2>
```
