Tenho uma solução simples e flexível, um pouco semelhante à de Will (mas com a vantagem adicional de ser um HTML válido):
Dê ao elemento do corpo uma classe de "jsOff". Remova (ou substitua) por JavaScript. Tenha CSS para ocultar qualquer elemento com uma classe "jsOnly" com um elemento pai com uma classe "jsOff".
Isso significa que se o JavaScript estiver habilitado, a classe "jsOff" será removida do corpo. Isso significa que os elementos com uma classe "jsOnly" não terão um pai com uma classe "jsOff" e, portanto, não corresponderão ao seletor CSS que os oculta, portanto, eles serão mostrados.
Se o JavaScript estiver desabilitado, a classe "jsOff" não será removida do corpo. Elementos com "jsOnly" terão um pai com "jsOff" e assim terá corresponderão ao seletor CSS que os oculta, portanto, serão ocultados.
Aqui está o código:
<html>
<head>
<!-- put this in a separate stylesheet -->
<style type="text/css">
.jsOff .jsOnly{
display:none;
}
</style>
</head>
<body class="jsOff">
<script type="text/javascript">
document.body.className = document.body.className.replace('jsOff','jsOn');
</script>
<noscript><p>Please enable JavaScript and then refresh the page.</p></noscript>
<p class="jsOnly">I am only shown if JS is enabled</p>
</body>
</html>
É html válido. É simples. É flexível.
Basta adicionar a classe "jsOnly" a qualquer elemento que você deseja exibir apenas quando JS está ativado.
Observe que o JavaScript que remove a classe "jsOff" deve ser executado o mais cedo possível dentro da tag body. Não pode ser executado antes, pois a tag do corpo ainda não estará lá. Não deve ser executado posteriormente, pois significa que os elementos com a classe "jsOnly" podem não ser visíveis imediatamente (pois eles corresponderão ao seletor CSS que os oculta até que a classe "jsOff" seja removida do elemento do corpo).
Isso também pode fornecer um mecanismo para estilo somente js (por exemplo .jsOn .someClass{}
) e estilo somente no-js (por exemplo .jsOff .someOtherClass{}
). Você pode usá-lo para fornecer uma alternativa a <noscript>
:
.jsOn .noJsOnly{
display:none;
}