使用 vanilla javascript,从头部向主体添加类

cro*_*ill 7 javascript

我想从head标签内进行快速 javascript 检查,如下所示:

<html>
    <head>
        ...
        <script>
            document.body.classList.remove("no-js");
            document.body.classList.add("js");
        </script>
    </head>
    <body class='no-js'>
        ...
    </body>
</html>
Run Code Online (Sandbox Code Playgroud)

这不起作用。Cannot read property classList of null,这...很公平。如果我将<script>标签移动到<body>,一切正常,但我希望<script>标签在<head>.

我有哪些选择?

编辑:我应该对错误更清楚。我意识到问题是当我尝试添加类时主体尚未加载。但是,我最初使用了一些 Modernizr,它以某种方式能够从头部内部修改 body 类,我认为它没有使用window.onload或类似的东西。

Pra*_*lan 9

加载正文后运行代码。有几种方法可以解决这个问题:

  1. 将代码移动到在全局上下文中定义的命名函数中并在onload.

<html>

<head>
  ...
  <script>
    function load() {
      document.body.classList.remove("no-js");
      document.body.classList.add("js");
    }
  </script>
</head>

<body onload="load();" class='no-js'>
  ...
</body>

</html>
Run Code Online (Sandbox Code Playgroud)

  1. 或者将代码移动到DOMContentLoaded事件侦听器回调中,以便在加载 dom 元素后调用。

<html>

<head>
  ...
  <script>
    document.addEventListener("DOMContentLoaded", function() {
      document.body.classList.remove("no-js");
      document.body.classList.add("js");
    });
  </script>
</head>

<body class='no-js'>
  ...
</body>

</html>
Run Code Online (Sandbox Code Playgroud)

  1. 或者将整个script标签移动到页面的末尾。

<html>

<head>
  ...
</head>

<body class='no-js'>
  ...
  <script>
    document.body.classList.remove("no-js");
    document.body.classList.add("js");
  </script>
</body>


</html>
Run Code Online (Sandbox Code Playgroud)

  • @Eoin 仔细看看;这绝对是三种不同的解决方案。 (2认同)