未捕获的 TypeError:forEach 不是 javascript 函数中的函数错误

Posted

技术标签:

【中文标题】未捕获的 TypeError:forEach 不是 javascript 函数中的函数错误【英文标题】:Uncaught TypeError: forEach is not a function error in javascript function 【发布时间】:2020-07-04 11:55:48 【问题描述】:

我有这个错误

Uncaught TypeError: trList.forEach is not a function

在这个函数中

function findMatchingRow(word) 
   const found = []
   const trList = document.querySelectorAll('#main_table_countries_today > tbody > tr')
   trList.forEach(function(tr, i) 
       if(tr.textContent.match(word)) 
           found.push(index: i, content: tr.textContent)
       
       )
       return found
   

const matches = findMatchingRow('Tunisia')
 console.log(matches)
 if(matches.length > 0) 
     console.log('found at:', matches.map(function(m)  return m.index; ))

我认为这个问题与 ES6 兼容性有关

【问题讨论】:

见***.com/questions/13433799/… 【参考方案1】:

编辑:

像这样使用for循环:for (var i = 0; i < trList.length; i++) ... 并在其中将 tr 替换为 trList[i] 您可能需要删除一个 ),它结束了您刚刚替换的 forEach 循环的左括号。

原答案

尝试使用以下代码更改代码中的第四行:Array.prototype.forEach.call(trList, function (tr, i)

【讨论】:

我得到了输出 -1 而不是 89,我从 android 8 和 9 中的 android 5.1 [INFO:CONSOLE(15)] "found at:", source: (15) D: -1 中的 android 8 和 9 INFO:CONSOLE(15)] "found at: 88", source: (15) D: 89 中获得了 89 那我猜你需要用一个简单的 for like for (var i = 1; i <= trList.length; i++) 有了 for 循环,我得到了 Uncaught SyntaxError: Unexpected token ')' ,所以我删除了 ),得到了 Uncaught ReferenceError: tr is not defined 是的,如果你使用一个简单的for 循环,最后你就不需要额外的)。您需要将所有tr 替换为trList[i]。我会编辑我的答案,因为它不起作用 对,我从 1 开始,而不是 0,我编辑了我的答案,看看它现在是否有效【参考方案2】:

试试这个:

const trList = Array.from(document.querySelectorAll('#main_table_countries_today > tbody > tr'))

【讨论】:

感谢您的回答,我现在收到此错误 Uncaught TypeError: Array.from is not a function【参考方案3】:

querySelectorAll() 返回一个nodeList。使用Array.from()将其转换为数组:

const trList = Array.from(document.querySelectorAll('#main_table_countries_today > tbody > tr'))'

【讨论】:

感谢您的回答,我现在收到此错误Uncaught TypeError: Array.from is not a function @JDEVss 你用的是什么浏览器?当前兼容性 > developer.mozilla.org/en-US/docs/Web/javascript/Reference/… 我使用的是 android 5.1 webview,代码适用于 android 8 和 9 但不适用于 android 5.1 您可以使用基本的 for 循环对其进行迭代。做; for(let i =0; i < trList.length;i++)... @JDEVss 更新您的设备,您的原始代码应该可以工作。 Lollipop 设备可以使用最新版本的 WebView。【参考方案4】:

QuerySelectorAll 返回一个不是真正的 JS 数组的 nodeList。您必须将其转换为具有所有 Array 方法的真正 JS Array。

我创建了一个实用函数来为我做这件事。

 function nodeListToArray(elem)
    return [].slice().call(elem);
 

那你就这样用吧。

const trList = document.querySelectorAll('#main_table_countries_today > tbody > tr');
const trArr = nodeListToArray(trList);

“trArr”将具有 forEach 方法。

【讨论】:

我是一个js初学者,这对我来说很难,你能帮忙写代码吗? 谢谢你的回答,我得到了Uncaught TypeError: [].slice(...).call is not a function

以上是关于未捕获的 TypeError:forEach 不是 javascript 函数中的函数错误的主要内容,如果未能解决你的问题,请参考以下文章

未捕获的TypeError:(中间值).map不是函数[重复]

JQuery UI'可拖动不是函数'未捕获的TypeError

未捕获的 TypeError:Vue.elementDirective 不是函数

未捕获的 Promise 错误:TypeError:成员不是函数

未捕获的 TypeError:Object(...)(...).Class 不是函数

Angular:错误:未捕获(承诺):TypeError:Object(...)不是函数