Tôi có một giải pháp đơn giản và linh hoạt, hơi giống với của Will (nhưng với lợi ích bổ sung là html hợp lệ):
Cung cấp cho phần tử body một lớp "jsOff". Loại bỏ (hoặc thay thế) điều này bằng JavaScript. Có CSS để ẩn bất kỳ phần tử nào có lớp là "jsOnly" với phần tử mẹ có lớp là "jsOff".
Điều này có nghĩa là nếu JavaScript được bật, lớp "jsOff" sẽ bị xóa khỏi nội dung. Điều này có nghĩa là các phần tử có lớp "jsOnly" sẽ không có phần tử cha có lớp "jsOff" và do đó sẽ không khớp với bộ chọn CSS ẩn chúng, do đó chúng sẽ được hiển thị.
Nếu JavaScript bị tắt, lớp "jsOff" sẽ không bị xóa khỏi nội dung. Các phần tử có "jsOnly" sẽ có phần tử cha là "jsOff" và do đó sẽ khớp với bộ chọn CSS ẩn chúng, do đó chúng sẽ bị ẩn.
Đây là mã:
<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>
Đó là html hợp lệ. Nó đơn giản. Nó linh hoạt.
Chỉ cần thêm lớp "jsOnly" vào bất kỳ phần tử nào mà bạn muốn chỉ hiển thị khi JS được bật.
Xin lưu ý rằng JavaScript loại bỏ lớp "jsOff" phải được thực thi càng sớm càng tốt bên trong thẻ body. Nó không thể được thực thi sớm hơn, vì thẻ body sẽ chưa ở đó. Nó không nên được thực thi sau đó vì điều đó có nghĩa là các phần tử có lớp "jsOnly" có thể không hiển thị ngay lập tức (vì chúng sẽ khớp với bộ chọn CSS ẩn chúng cho đến khi lớp "jsOff" bị xóa khỏi phần tử body).
Điều này cũng có thể cung cấp một cơ chế để tạo kiểu chỉ js (ví dụ .jsOn .someClass{}
) và kiểu không chỉ js (ví dụ .jsOff .someOtherClass{}
). Bạn có thể sử dụng nó để cung cấp một giải pháp thay thế cho <noscript>
:
.jsOn .noJsOnly{
display:none;
}