У мене є просте і гнучке рішення, дещо схоже на те, що у Вілла (але з додатковою перевагою, що є дійсним html):
Дайте елементу тіла клас "jsOff". Видаліть (або замініть) це за допомогою JavaScript. Потрібно CSS приховати будь-які елементи з класом "jsOnly" з батьківським елементом з класом "jsOff".
Це означає, що якщо JavaScript увімкнено, клас "jsOff" буде видалений з тіла. Це означатиме, що елементи з класом "jsOnly" не матимуть батьків з класом "jsOff" і тому не будуть відповідати селектору CSS, який їх приховує, таким чином вони будуть показані.
Якщо JavaScript відключений, клас "jsOff" не буде видалений з тіла. Елементи з "jsOnly" матимуть батьків з "jsOff", і так вони відповідають селектору CSS, який їх приховує, таким чином вони будуть приховані.
Ось код:
<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. Це просто. Це гнучко.
Просто додайте клас "jsOnly" до будь-якого елемента, який потрібно відображати лише тоді, коли JS увімкнено.
Зауважте, що JavaScript, який видаляє клас "jsOff", повинен бути виконаний якомога раніше всередині тегу body. Його не можна виконати раніше, оскільки тег body ще не буде. Він не повинен бути виконаний пізніше, оскільки це означатиме, що елементи з класом "jsOnly" можуть бути не видно відразу (оскільки вони будуть відповідати селектору CSS, який їх приховує, поки клас "jsOff" не буде видалений з елемента тіла).
Це також може забезпечити механізм стилів лише для js (наприклад .jsOn .someClass{}
) та стилів, які не є js (наприклад .jsOff .someOtherClass{}
). Ви можете використовувати його для надання альтернативи <noscript>
:
.jsOn .noJsOnly{
display:none;
}