Skip to main content
Validação HTML

Um elemento “script” com um atributo “src” não deve ter um atributo “type” cujo valor seja algo diferente de uma string vazia, um tipo MIME JavaScript, ou “module”.

Sobre este problema HTML

O elemento <script> serve dois propósitos distintos em HTML: carregar scripts executáveis e incorporar blocos de dados não-executáveis. Quando o atributo src está presente, o elemento está sempre a ser usado para carregar um script externo, por isso o atributo type deve refletir um tipo de script válido. Definir type como algo como "text/html", "text/plain", ou um valor inventado como "wrong" diz ao browser que isto não é JavaScript, o que significa que o ficheiro externo referenciado por src será carregado mas nunca executado — quase certamente não é o que o autor pretendia.

A especificação HTML restringe os valores type permitidos para <script src="..."> a três categorias:

  • Uma string vazia (type=""): Tratada da mesma forma que o padrão, que é JavaScript.
  • Um tipo MIME JavaScript: Isto inclui text/javascript, application/javascript, e outros tipos MIME JavaScript legados. Como text/javascript é o padrão, especificá-lo é redundante.
  • module: Indica que o script deve ser tratado como um módulo JavaScript, ativando a sintaxe import/export e execução diferida por padrão.

Qualquer valor fora destas categorias — como text/html, application/json, ou uma string inventada — é inválido quando src está presente.

Por que isto é importante

Funcionalidade quebrada: Um type não-JavaScript num <script> com src impede o browser de executar o ficheiro carregado. O script é efetivamente código morto que ainda custa um pedido de rede.

Conformidade com padrões: O padrão HTML living standard proíbe explicitamente esta combinação. Os validadores marcam-no porque quase sempre indica um erro — ou foi aplicado o type errado, ou o atributo src foi adicionado por acidente.

Manutenibilidade: Futuros programadores a ler o código podem ficar confusos sobre se o script deve executar ou servir como um bloco de dados inerte. Manter o markup válido torna a intenção clara.

Como corrigir

  1. Remover completamente o atributo type. Esta é a melhor abordagem para JavaScript clássico. O comportamento padrão é text/javascript, por isso não é necessário type.
  2. Usar type="module" se o script usa sintaxe de módulo ES (import/export).
  3. Se pretendia um bloco de dados (por exemplo, incorporar JSON ou um template), remover o atributo src e colocar o conteúdo inline dentro do elemento <script>. Blocos de dados com tipos não-JavaScript não podem usar src.

Exemplos

Inválido: tipos não-JavaScript com src

Todos estes desencadeiam o erro de validação porque o valor type não é um tipo MIME JavaScript, uma string vazia, ou "module":

<script type="text/html" src="template.html"></script>

<script type="application/json" src="data.json"></script>

<script type="text/plain" src="app.js"></script>

<script type="wrong" src="app.js"></script>

Válido: omitir o atributo type

A correção mais simples e recomendada para scripts clássicos — simplesmente remover type:

<script src="app.js"></script>

Válido: usar um tipo MIME JavaScript

Isto é válido mas redundante, uma vez que text/javascript já é o padrão. O validador pode sugerir omiti-lo:

<script type="text/javascript" src="app.js"></script>

Válido: usar type="module"

Use isto quando o script externo usa sintaxe de módulo ES:

<script type="module" src="app.js"></script>

Válido: usar um atributo type vazio

Uma string vazia é tratada como o padrão. É válido mas desnecessário, e o validador pode sugerir removê-lo:

<script type="" src="app.js"></script>

Válido: blocos de dados sem src

Se precisar de um type não-JavaScript para um bloco de dados inline, remover o atributo src e colocar o conteúdo diretamente dentro do elemento:

<script type="application/json" id="config">
  {
    "apiUrl": "https://example.com/api",
    "debug": false
  }
</script>

Encontre problemas como este automaticamente

O Rocket Validator analisa milhares de páginas em segundos, detetando problemas HTML em todo o seu site.

Ajude-nos a melhorar os nossos guias

Este guia foi útil?

Pronto para validar os seus sites?
Comece o seu teste gratuito hoje.