对象引用在代码中未定义,但在控制台中未定义

Ben*_*HiT 0 javascript

当我把它放在我的app.js:

var titres = document.querySelectorAll('header ul li a')

console.log(titres)
Run Code Online (Sandbox Code Playgroud)

它寄回给我: []

如果我把它放在浏览器的控制台上:

var titres = document.querySelectorAll('header ul li a')
Run Code Online (Sandbox Code Playgroud)

titres 寄回给我: [a,a,a,a,a]

有人知道为什么请?

Sco*_*cus 8

当您在控制台中键入这些语句时,页面已经完全解析,因此找到了元素,并返回一个"类似数组"的对象,其中包含对这些元素的引用.

但是,最有可能的是,当您使用代码进行尝试时,在将整个HTML页面解析到内存之前app.js,您的app.js文件正在执行,如下所示:

<!DOCTYPE html>
<html>
  <head>
    <title></title>
    <!-- At this point, the rest of the HTML hasn't been parsed yet, so
         if app.js tries to query for those elements, they won't be found! -->
    <script src="app.js"></script> 
  </head>
  <body>

  .  .  . 
Run Code Online (Sandbox Code Playgroud)

尝试<script src="app.js"></script>在关闭body元素之前放置代码(以便在已经解析HTML之后运行它),如下所示:

    .  .  .
    <script src="app.js"></script> 
  </body>
</html>
Run Code Online (Sandbox Code Playgroud)

或者将script标记保留在页面顶部,但是在app.js文件内部,将代码包装在事件处理程序中,如下所示:

window.addEventListener("DOMContentLoaded", function(){
    var titres = document.querySelectorAll('header ul li a')
    console.log(titres)
});
Run Code Online (Sandbox Code Playgroud)

这将推迟在加载HTML之后执行代码.