Ho una soluzione semplice e flessibile, in qualche modo simile a quella di Will (ma con l'ulteriore vantaggio di essere un HTML valido):
Assegna all'elemento body una classe di "jsOff". Rimuovilo (o sostituiscilo) con JavaScript. Avere CSS per nascondere tutti gli elementi con una classe "jsOnly" con un elemento genitore con una classe "jsOff".
Ciò significa che se JavaScript è abilitato, la classe "jsOff" verrà rimossa dal corpo. Ciò significa che gli elementi con una classe "jsOnly" non avranno un genitore con una classe "jsOff" e quindi non corrisponderanno al selettore CSS che li nasconde, quindi verranno visualizzati.
Se JavaScript è disabilitato, la classe "jsOff" non verrà rimossa dal corpo. Elementi con "jsOnly" dovranno avere un genitore con "jsOff" e così sarà abbinare il selettore CSS che nasconde loro, in tal modo essi vengono nascosti.
Ecco il codice:
<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>
È un HTML valido. È semplice. È flessibile.
Aggiungi semplicemente la classe "jsOnly" a qualsiasi elemento che desideri visualizzare solo quando JS è abilitato.
Tieni presente che JavaScript che rimuove la classe "jsOff" dovrebbe essere eseguito il prima possibile all'interno del tag body. Non può essere eseguito prima, poiché il tag body non sarà ancora lì. Non dovrebbe essere eseguito in seguito poiché significa che gli elementi con la classe "jsOnly" potrebbero non essere immediatamente visibili (poiché corrisponderanno al selettore CSS che li nasconde fino a quando la classe "jsOff" non viene rimossa dall'elemento body).
Questo potrebbe anche fornire un meccanismo per lo styling solo js (ad esempio .jsOn .someClass{}
) e per lo styling solo no-js (ad esempio .jsOff .someOtherClass{}
). Potresti usarlo per fornire un'alternativa a <noscript>
:
.jsOn .noJsOnly{
display:none;
}