forEach 不是函数

Posted

技术标签:

【中文标题】forEach 不是函数【英文标题】:forEach is not function 【发布时间】:2020-08-07 02:55:37 【问题描述】:

有人可以向我解释如何使用 forEach 而不出现错误消息吗? 我从 1 个月开始就开始编程,所以也许这是一个简单的错误。

------------------------------------------------------------------------------

let galleryImages1 = document.querySelector(".gallery-img");
let getLatestOpenedImg;
let windowWidth1 = window.innerWidth;



if (galleryImages1) 
    galleryImages1.forEach(function (image) 
        image.onclick = function () 

        
    );
;

【问题讨论】:

你得到的错误是什么? ***.com/questions/35969974/… 看看这个。 好吧 querySelector 不返回一个集合,所以没有什么可以循环 【参考方案1】:

选择器querySelector 只返回第一个元素。如果要返回与查询匹配的所有元素,请使用:

let galleryImages1 = document.querySelectorAll(".gallery-img");

【讨论】:

你不能在节点列表上使用 foreach 检查这个小提琴:jsfiddle.net/votolentino/9orhcq4p/1 它不会在每个 javascript 引擎中,有最新浏览器的 polyfils 在调用 foreach 时使用 for 循环 它在打字稿中也无效 [...document.querySelectorAll(".gallery-img")] 会生成一个数组,foreach 可以使用。【参考方案2】:

简单的改变

document.querySelector(".gallery-img");

document.querySelectorAll(".gallery-img");

document.querySelector 返回单个元素,您不能在单个元素上使用 forEach

【讨论】:

【参考方案3】:

试试这个:

let galleryImages1 = document.getElementsByClassName("gallery-img");

if (galleryImages1) 
  galleryImages1.forEach(image => 
    image.onclick = () => 
      […]
    
  );

当然,我会使用eventListener 来处理onclick 事件,但我试图按照你的方式行事。

【讨论】:

【参考方案4】:

两个问题

1 - document.querySelectorAll 的返回类型是 NodeList 而不是 Array,这意味着它没有实现 forEach 方法。因此,您需要使用 for 循环。 节点列表不是数组,不能使用 forEach

现代浏览器使用 polyfill 在底层使用 for 循环 但它并非不适用于所有 javascript 引擎

https://developer.mozilla.org/en-US/docs/Web/API/NodeList/forEach#Polyfill

如果你尝试使用 foreach,Typescript 也会抛出错误,并且会强制你使用 for 循环

2 - 并使用 document.querySelectorAll 而不是 document.querySelector 来获取节点列表

【讨论】:

以上是关于forEach 不是函数的主要内容,如果未能解决你的问题,请参考以下文章

为啥这个对象的“forEach 不是函数”?

forEach 不是函数 javascript

forEach 不是函数错误

JS arguments.forEach 不是一个函数[重复]

类型错误:data.forEach 不是函数

JS 'body.forEach 不是函数' 上的错误