【问题标题】:Why does my nodelist contain 0 items when console logged from my JS file?从我的 JS 文件记录控制台时,为什么我的节点列表包含 0 个项目?
【发布时间】:2019-07-17 03:35:41
【问题描述】:

我关心的JS代码是这样的:

 const modals=document.querySelectorAll('.modal');
    const modalsArray=[...modals];
    console.log(modalsArray);

    document.addEventListener('click', function (e) {
      e.stopPropagation();
      e.preventDefault();
      if (e.target.classList.contains("item")) {
        itemIndex=e.target.classList.item(1);
        const modals=document.querySelectorAll('.modal');
        const modalsArray=[...modals];
        console.log(itemIndex);
        console.log(modalsArray);
        modalsArray.filter(function (modal) {
          if (modal.classList.item(1)===itemIndex) {
            modal.classList.add('on');
            modalContainer.classList.remove('off');
            modalContainer.classList.add('on');
          }
        })
      }
    });


const arrow=document.querySelectorAll('.arrow');
const arrowArray=[...arrow];
console.log(arrowArray);

每当我从我的 JS 文件控制台记录 modalsArray 或 arrowArray 时,数组就会显示为空。但是我发现,如果我在控制台中从头开始编写代码来制作数组,那么数组中的所有项目都会正确显示。

那么为什么会这样呢?为什么我的控制台上当前显示一个空数组?它与范围或其他什么有关吗?

当我将 modalsArray 放入事件侦听器中并单击相应的目标时,数组将正确显示,并且该事件侦听器中的其余代码正常工作。

我注意到与 arrowArray 相同的事情,并意识到这两个元素存在相同的问题。我想我应该问一下,因为肯定有什么事情发生了。

那么,为什么图片中的这两个元素都出现了一个空数组呢?

查看我的小提琴以获取更多信息: https://jsfiddle.net/apasric4/kvs25wbL/3/

【问题讨论】:

  • generateHTML 是异步的。在尝试选择它创建的元素之前,您无需等待它完成。
  • 好的,我应该如何重新排列代码,以便在 generateHTML 完成后选择元素?
  • @AmandeepPasricha:使用承诺链,jsfiddle.net/v83zqofp/1
  • @MuraliNepalli 谢谢我给你回复了一个问题。

标签: javascript arrays console nodelist


【解决方案1】:

您的控制台语句甚至在获取数据之前就已执行。我将它们链接在另一个“then”函数(承诺链接)中,如下所示。这样,您的控制台语句在您的结果被解析为 hmtl 后运行。

https://jsfiddle.net/v83zqofp/1/

function generateHTML (data) {
  fetchData(data)
  .then(function(data){
    let results=data.results;
    return results.map(function(result,index){
      -------------
      main.lastElementChild.insertAdjacentHTML('afterend', html);
      modalContainer.insertAdjacentHTML('beforeend', overlayHtml);      
    })
  }).then (function (data) {
      const modals=document.querySelectorAll('.modal');
      const modalsArray=[...modals];
      console.log(modalsArray);

      const arrow=document.querySelectorAll('.arrow');
      const arrowArray=[...arrow];
      console.log(arrowArray);
  })
}

【讨论】:

  • 您好,感谢您的回答。抱歉这个菜鸟问题,但是当我调用 generateHTML 时,它在 modal-container 内生成的所有代码都在 DOM 上可用。如果所有代码都已经显示在 DOM 上,为什么这最终会成为问题?
  • @AmandeepPasricha 当您调用“generateHTML”时,它首先调用 fetch data 方法并等待(运行 remaning 代码,因为它是异步的)直到它获得结果然后执行“return results.map() ...”来创建 DOM 元素。因此,在您的初始代码中,您的控制台语句在此等待期间运行。这就是他们记录空数组的原因。
  • @AmandeepPasricha 如果您想了解“异步”调用的工作原理,请阅读eloquentjavascript.net/11_async.html
  • 哦,好吧。另一件事。是否也是因为在数据进入调用堆栈之前调用了控制台日志?基本上它在调用 console.log 时仍在事件循环中。
  • @AmandeepPasricha:是的,控制台语句在调用堆栈中领先。
猜你喜欢
  • 2021-10-01
  • 1970-01-01
  • 2021-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多