У меня есть простое и гибкое решение, чем-то похожее на Уилла (но с дополнительным преимуществом валидности HTML):
Присвойте элементу body класс 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{}
) и стиля no-js (например .jsOff .someOtherClass{}
). Вы можете использовать его как альтернативу <noscript>
:
.jsOn .noJsOnly{
display:none;
}