# A “script” element with a “type” attribute whose value is neither a JavaScript MIME type, “module”, “importmap”, nor “speculationrules” (i.e., a data block) must not have a “defer” attribute.

> Canonical HTML version: https://rocketvalidator.com/html-validation/a-script-element-with-a-type-attribute-whose-value-is-neither-a-javascript-mime-type-module-importmap-nor-speculationrules-i-e-a-data-block-must-not-have-a-defer-attribute
> Attribution: Rocket Validator (https://rocketvalidator.com)
> License: CC BY 4.0 (https://creativecommons.org/licenses/by/4.0/)

The `defer` attribute is invalid on a `<script>` element whose `type` marks it as a data block, because browsers never execute data blocks.

When the `type` attribute is anything other than a JavaScript MIME type, `module`, `importmap`, or `speculationrules`, the browser treats the element as a data block: inline content that other scripts on the page can read, but that is never fetched or run. The most common example is `application/ld+json` structured data. Since nothing executes, there is nothing to defer, and the attribute is invalid.

This usually happens when a template or a performance plugin adds `defer` to every `<script>` tag on the page, including the data blocks.

## Examples

### Invalid: `defer` on a data block

```html
<script type="application/ld+json" defer>
  {
    "@context": "https://schema.org",
    "@type": "Organization",
    "name": "Example"
  }
</script>
```

### Valid: data block without `defer`

```html
<script type="application/ld+json">
  {
    "@context": "https://schema.org",
    "@type": "Organization",
    "name": "Example"
  }
</script>
```

Remove the `defer` attribute. If the script was actually meant to run, fix the `type` value instead: use a JavaScript MIME type, `module`, or omit the attribute entirely.
