# ou javascript:void(0): o que escolher para links JS?

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

# ou javascript:void(0): o que escolher para links JavaScript? Explicação completa com código



Olá, colega desenvolvedor! Se você já escreveu links que não levam a uma nova página, mas executam código JavaScript (por exemplo, abrir uma janela modal, carregar conteúdo ou executar uma animação), certamente já enfrentou o dilema: qual valor do atributo href usar? href="#" ou href="javascript:void(0)"?



Esta pergunta é um verdadeiro sucesso no Stack Overflow (milhares de visualizações!), e não é à toa. Parece um detalhe, mas disso depende o comportamento da página: se ela vai rolar para cima, se um hash aparecerá na URL, se funcionará em navegadores antigos. Vamos entender de uma vez por todas qual abordagem é melhor e por que a resposta "correta" não é tão simples.



O problema: por que mudar o href?



Imagine: você escreve um botão que abre um menu:



<a href="#" onclick="openMenu(); return false;">Menu</a>


Ou assim:



<a href="javascript:void(0)" onclick="openMenu();">Menu</a>


Ambas as opções "funcionam", mas cada uma esconde surpresas. Vamos compará-las por critérios-chave.



Opção 1: href="#" — o clássico com pegadinha



# é um link para o "topo" da página. Se você simplesmente escrever <a href="#">, o navegador rolará a página para cima. Para evitar isso, é necessário adicionar return false; no manipulador:



<a href="#" onclick="doSomething(); return false;">Clique em mim</a>


Vantagens:

  • Acessibilidade: o link permanece focalizável (pode ser acessado com Tab).
  • Semântica: para leitores de tela, ainda é um link (embora não leve a lugar nenhum).
  • Simplicidade: fácil de lembrar, escreve-se rapidamente.


Desvantagens:

  • Rolagem para cima: se esquecer o return false, o usuário perderá a posição.
  • Alteração da URL: adiciona # na barra de endereços (às vezes indesejável).
  • Histórico do navegador: cria um registro no histórico (o botão "Voltar" levará à página anterior com "#").


Opção 2: href="javascript:void(0)" — um hack de tempos antigos



javascript:void(0) é um pseudoprotocolo JavaScript. Ele diz ao navegador: "execute o código void(0) e não siga o link". void(0) retorna undefined, então a página não se move.



<a href="javascript:void(0)" onclick="doSomething();">Clique em mim</a>


Vantagens:

  • Não rola a página — nenhum return false é necessário.
  • Não altera a URL — o hash não é adicionado.


Desvantagens:

  • Problemas de acessibilidade: alguns leitores de tela antigos podem "tropecar" no javascript: no href.
  • Violação dos princípios de melhoria progressiva: se o JavaScript do usuário estiver desabilitado, o link não funciona (leva ao vazio).
  • HTML inválido? Formalmente, javascript: é um protocolo não padrão, mas os navegadores o entendem. No entanto, o validador W3C pode reclamar.
  • Depuração mais difícil: se houver um erro no href, o navegador pode se comportar de forma imprevisível.


Comparação em tabela



Critério href="#"

Blogs

Book Recommendations