我有一个简单而灵活的解决方案,有点类似于 Will 的解决方案(但具有有效 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 时才显示的任何元素。
请注意,删除“jsOff”类的 JavaScript 应尽早在 body 标记内执行。它不能更早地执行,因为body标签还没有。它不应稍后执行,因为这意味着具有“jsOnly”类的元素可能不会立即可见(因为它们将匹配隐藏它们的 CSS 选择器,直到从 body 元素中删除“jsOff”类)。
这也可以为仅 js 样式(例如 .jsOn .someClass{})和非仅 js 样式(例如 .jsOff .someOtherClass{})提供一种机制。您可以使用它来提供<noscript> 的替代方案:
.jsOn .noJsOnly{
display:none;
}