当前位置: 首页 > 知识库问答 >
问题:

未捕获类型错误:无法读取未定义的属性(读取'indexOf')

步博涉
2023-03-14

我正在选择area_enninFantry的所有子div,并循环调整某些子div的文本。cardArray是一个全局常量,myId在父函数中定义。

未捕获的TypeError:无法读取未定义的属性(读取“getAttribute”)

var field = $("#area_en" + cardArray[myId]['type']).find("div");

field.each(function(a, element) {
  console.log("cC type:" + cardArray[myId]['type'] + "- index:" + a + " title: " + element[a].attr('title'));

  if (element[a].attr("title").indexOf("player") < 0) { // check this card isn't special player card
    doStuff;
  }
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div id="area_enInfantry">
  <div id="info_enInfantryScore" class="info_Score">-1</div>
  <div class="encardContainer" title="barricade">-1</div>
  <div class="encardContainer" title="spy">2</div>
</div>

我在这篇文章中读到,这可能是因为字段/元素的内容可能是DOM元素,我应该用$()包装它们,所以我确实这样做了——将两个变量都更改为$(元素)[a]. attr(“标题”),但现在我被发现了TypeError:无法读取未定义的属性(读取'indexOf'),似乎将错误移动到下一行。

我到底做错了什么?

共有1个答案

章绪
2023-03-14

这里有几个问题。首先,变量element包含一个element对象,而不是jQuery对象,因此没有可用的attr()方法。

其次,一旦你纠正了这一点,第一个div上的attr('title')没有设置,所以未定义。因此,您会得到一个错误,因为您在一个空值上调用indexOf()。如果为null,您可以通过将值合并到空字符串来解决这个问题。

还要注意的是,我假设您希望调用doStuff()函数,因此需要在末尾添加(),最好在attr()上使用prop()

话虽如此,请尝试以下方法:

// mock data
let myId = 'foo';
let cardArray = { foo: { type: 'Infantry' } }

let doStuff = () => console.log('do stuff...');
var $field = $("#area_en" + cardArray[myId]['type']).find("div");

$field.each(function(i, element) {
  let $el = $(element);
  console.log("cC type:" + cardArray[myId]['type'] + "- index:" + i + " title: " + $el.prop('title'));
  if (($el.prop("title") || '').indexOf("player") < 0) { // check this card isn't special player card
    doStuff();
  }
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div id="area_enInfantry">
  <div id="info_enInfantryScore" class="info_Score">-1</div>
  <div class="encardContainer" title="barricade">-1</div>
  <div class="encardContainer" title="spy">2</div>
</div>
 类似资料:
  • 我遇到了一个有趣的问题,这使我感到困惑。我正在执行一个正确返回数据的Sharepoint RestAPI调用,当我在数据上运行for循环时,它生成html,但仍然抛出我用作标题的错误。代码如下。如果我记录每个循环,它将返回值。HTML也可以很好地工作。问题是错误仍然会出现。

  • 我使用的是最新版本的react路由器(版本^3.0.0)。 我使用ES5编写了以下路由: : 在另一个名为

  • 我的代码: 错误: 未处理PromisejectionWarning:TypeError:无法读取未定义的未处理PromisejectionWarning:未处理的promise拒绝的属性“forEach”。此错误源于在没有catch块的情况下抛出异步函数的内部,或者拒绝使用未处理的promise。catch()。(拒绝id:1)(节点:7188)[DEP0018]弃用警告:未处理的promise

  • 我想有一个无限滚动的项目列表,我正在使用这个包https://github.com/CassetteRocks/react-infinite-scroller但是在留档中没有提到抓取功能的样子。 在我的代码中,它是这样的: 完整消息错误: 未捕获(promise中)类型错误:无法读取评估时未定义的属性“companys”(traineships.component.js:71) 编辑:(我不再有错

  • 我正在使用NVD3库根据Rails控制器中生成的数据制作简单的折线图。我用来在Rails中生成数据的代码是: 然后,在我看来,我有以下JS代码: 图表正确呈现,但当我尝试将鼠标悬停在数据点上以显示工具提示时,会出现错误“Uncaught TypeError:无法读取未定义的属性“x”

  • 我想在我的角度项目中添加钢系列。我有createad html-compass组件,但我收到了这个错误: _services错误类型错误:无法读取未定义的属性(读取主题)在ProjectService…/app/Subject.js:53/_next(node_modules)在_esm5__tryOrUnsub[EventEmitter.push.](node_modules)在_esm5…/c