开发者问题收集

脚本无法从单独的文件执行,但可以从 <script> 标签执行

2021-07-06
57

下面的 JavaScript 在 <script> JS </script> 标记内运行时运行良好。但是,当我从单独的文件运行代码时,我收到 Uncaught TypeError:无法将 innerHTML 属性设置为 null。我不知道这里发生了什么。任何帮助都非常感谢。

// Admin Nightmode Switch
var nmStylesheet = document.getElementById("nightmodeon");

if (localStorage.getItem("lastActiveNmSheet")) {
   nmStylesheet.setAttribute('href', localStorage.getItem('lastActiveNmSheet'));
}

if (nmStylesheet.getAttribute('href') === "view/stylesheet/elmigo_nighton.css") {
  document.getElementById("nightmode").innerHTML = "<span><i class=\"fa fa-moon-o\"></i></span>";
}

function nightmode() {
  var nmButton = document.getElementById("nightmode");
  var nmIconDay = "<span><i class=\"fa fa-sun-o\"></i></span>";
  var nmIconNight = "<span><i class=\"fa fa-moon-o\"></i></span>";

  if (nmButton.innerHTML === nmIconDay) {
    nmButton.innerHTML = nmIconNight;
    nmStylesheet.setAttribute('href', 'view/stylesheet/elmigo_nighton.css');
    localStorage.setItem('lastActiveNmSheet', 'view/stylesheet/elmigo_nighton.css');
  } else {
    nmButton.innerHTML = nmIconDay;
    nmStylesheet.setAttribute('href', '#');
    localStorage.setItem('lastActiveNmSheet', '#');
  }
}
2个回答

您所做的就是在外部 JS 脚本试图与之交互的元素 之前 引用该脚本。

当您使用 <script> 标记在外部引用 .js 脚本时,您可以设想在 script 标记所在的任何位置内编写该脚本。

JS 按顺序运行,因此如果您的外部 JS 在您更改的元素被声明/关闭之前被尊重,它将无法识别它们。

为了解决这个问题,大多数开发人员将 js 脚本放在结束 </body> 标记之前

<html>

<body>
<script>
document.getElementById("test").innerHTML="This element has been changed"
</script>
<div id="test"> This Id wont be chaged as it is looked for before it is declared! </div>
</body>



</html>

这是脚本(无论是通过文件外部还是在代码中编写)在尝试与之交互的元素之前声明的位置

<html>

<body>
<div id="test"> This Id wont be changed as it is looked for before it is declared! </div>
</body>

<script>
document.getElementById("test").innerHTML="This element has been changed"
</script>


</html>

这是脚本在与之交互的元素之后声明的位置

StarshipladDev
2021-07-06

yow JS 代码在 html 项目呈现之前运行,这就是为什么它们全都是空值和其他东西

window.addEventListener('DOMContentLoaded', (event) => {

// Admin Nightmode Switch
var nmStylesheet = document.getElementById("nightmodeon");

if (localStorage.getItem("lastActiveNmSheet")) {
   nmStylesheet.setAttribute('href', localStorage.getItem('lastActiveNmSheet'));
}

if (nmStylesheet.getAttribute('href') === "view/stylesheet/elmigo_nighton.css") {
  document.getElementById("nightmode").innerHTML = "<span><i class=\"fa fa-moon-o\"></i></span>";
}

function nightmode() {
  var nmButton = document.getElementById("nightmode");
  var nmIconDay = "<span><i class=\"fa fa-sun-o\"></i></span>";
  var nmIconNight = "<span><i class=\"fa fa-moon-o\"></i></span>";

  if (nmButton.innerHTML === nmIconDay) {
    nmButton.innerHTML = nmIconNight;
    nmStylesheet.setAttribute('href', 'view/stylesheet/elmigo_nighton.css');
    localStorage.setItem('lastActiveNmSheet', 'view/stylesheet/elmigo_nighton.css');
  } else {
    nmButton.innerHTML = nmIconDay;
    nmStylesheet.setAttribute('href', '#');
    localStorage.setItem('lastActiveNmSheet', '#');
  }
}

});

Ernesto
2021-07-07