关于javascript:HTML”no js”类的目的是什么?

What is the purpose of the HTML “no-js” class?

我注意到在许多模板引擎中,在HTML5样板文件、各种框架和普通的PHP站点中,都有添加到标记上的no-js类。

为什么要这样做?是否有某种默认浏览器行为对此类做出反应?为什么总是包括它?如果没有"no-js"案例和HTML可以直接寻址,那么这不会使类本身过时吗?

以下是html5样板文件index.html中的示例:

1
2
3
4
5
<!--[if lt IE 7 ]> <html lang="en" class="no-js ie6"> <![endif]-->
<!--[if IE 7 ]>    <html lang="en" class="no-js ie7"> <![endif]-->
<!--[if IE 8 ]>    <html lang="en" class="no-js ie8"> <![endif]-->
<!--[if IE 9 ]>    <html lang="en" class="no-js ie9"> <![endif]-->
<!--[if (gt IE 9)|!(IE)]><!--> <html lang="en" class="no-js"> <!--<![endif]-->

如您所见,元素将始终具有此类。有人能解释为什么经常这样做吗?


当modernizer运行时,它将删除"no js"类并将其替换为"js"。这是一种应用不同CSS规则的方法,具体取决于是否启用了JavaScript支持。

请参阅现代化程序的源代码。


现代化功能检测库使用no-js类。当现代化器加载时,它用js替换no-js。如果禁用了javascript,则类将保留。这允许您编写容易针对任何一个条件的CSS。

从现代化者的状态来源(不再保持):

Remove"no-js" class from element, if it exists:
docElement.className=docElement.className.replace(/\bno-js\b/,'') + ' js';

以下是Paul Irish的博客文章,描述了这种方法:http://www.paulirish.com/2009/avointing-the-fouc-v3/

我喜欢做同样的事情,但是没有现代化。我把下面的放在中,如果启用了javascript,将类更改为js。比起regex版本,我更喜欢使用.replace("no-js","js"),因为它不那么神秘,适合我的需要。

1
2
    document.documentElement.className =
       document.documentElement.className.replace("no-js","js");

在使用这种技术之前,我通常只将依赖于JS的样式直接应用于JavaScript。例如:

1
2
$('#someSelector').hide();
$('.otherStuff').css({'color' : 'blue'});

使用no-js技巧,现在可以使用css实现:

1
2
3
.js #someSelector {display: none;}
.otherStuff { color: blue; }
.no-js .otherStuff { color: green }

最好这样做,因为:

  • 它加载速度更快,无FOUC(非样式内容闪烁)
  • 分离关注点等…


modernizer.js将删除no-js类。

这允许您为.no-js something生成CSS规则,仅当禁用javascript时才应用这些规则。


no-js类被一个javascript脚本删除,因此如果禁用JS,您可以使用CSS修改/显示/隐藏内容。


这不仅适用于现代化。我看到下面的一些站点实现来检查它是否支持javascript。

1
2
3
4
<body class="no-js">
    document.body.classList.remove('no-js');
    ...
</body>

如果有javascript支持,那么它将删除no-js类。否则,no-js将保留在body标签中。然后,当没有JavaScript支持时,它们控制CSS中的样式。

1
2
3
.no-js .some-class-name {

}

查看Moderner中的源代码,本节:

1
2
3
4
5
6
// Change `no-js` to `js` (independently of the `enableClasses` option)
// Handle classPrefix on this too
if (Modernizr._config.enableJSClass) {
  var reJS = new RegExp('(^|\\s)' + classPrefix + 'no-js(\\s|$)');
  className = className.replace(reJS, '$1' + classPrefix + 'js$2');
}

所以基本上它搜索classprefix+no-js类,并用classprefix+js替换它。

如果javascript不在浏览器中运行,那么它的使用方式也会有所不同。


no js类用于设置网页样式,具体取决于用户是否在浏览器中禁用或启用了js。

根据现代化文件:

no-js

By default, Modernizr will rewrite to . This lets hide certain elements that should only be
exposed in environments that execute JavaScript. If you want to
disable this change, you can set enableJSClass to false in your
config.